Почему git продвигается к двум ветвям в этом git push? - PullRequest
18 голосов
/ 07 мая 2009

Что могло бы заставить 'git push' попытаться зафиксировать две ветки? У меня есть своя собственная ветка, над которой я работаю, которая находится в общем репо ... и основная ветка. Прямо сейчас я просто хотел подтолкнуть к моей личной ветви, которая прошла хорошо, но она также попыталась подтолкнуть к мастеру и была отклонена. Выглядело примерно так:

foo$ git push
Counting objects: 38, done.
Delta compression using 2 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (21/21), 9.73 KiB, done.
Total 21 (delta 14), reused 0 (delta 0)
To ssh://example.com/project.git
   8184634..86b621e  mybranch -> mybranch
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to 'ssh://example.com/project.git'  

Мой конфиг выглядит так:

remote.origin.url=ssh://example.com/project.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.mybranch.remote=origin
branch.mybranch.merge=refs/heads/mybranch  

Esko отмечает, что это подталкивает к обоим, потому что они в моей конфигурации. Что, если я хочу подтолкнуть обоих, но не одновременно? Когда я проверил mybranch и нажал на push, я определенно хотел толкнуть mybranch, а не master. Бывают моменты, когда я проверяю мастер, редактирую код и хочу также зафиксировать / отправить это. Есть ли способ для обоих сосуществовать?

Ответы [ 2 ]

26 голосов
/ 07 мая 2009

При использовании git push без каких-либо аргументов он будет выдвигать все локальные ветви, которые имеют соответствующую удаленную ветвь с тем же именем. Поскольку ваш локальный репозиторий имеет ветви master и mybranch, а также удаленный репозиторий имеет ветви master и mybranch, то Git выдвинет их обоих.

Если вы хотите нажать только одну ветку, вы можете явно сказать Git, какую ветку вы хотите нажать: git push origin mybranch

Если вы хотите нажать на мастера, вы можете исправить эту ошибку, сначала потянув от мастера. Git жалуется, что слияние происходит не быстро, потому что кто-то еще выдвинул коммит к мастеру с момента последнего обращения к мастеру.

3 голосов
/ 07 мая 2009

Если вы хотите нажать только текущую ветвь, вы можете использовать «git push origin HEAD» или, возможно, даже «git push HEAD» (с современным git).

Поведение по умолчанию, если нет refspec для push (вы определили refspec для fetch в вашей конфигурации, но не для push ) - нажать соответствующий реф. От git-push (1) :

git push [...] [ ...]

...

Специальный refspec: (или +: для обновления без ускоренной пересылки) направляет git выдвигать «соответствующие» ветви: для каждой ветви, которая существует на локальной стороне, удаленная сторона обновляется, если ветвь такое же имя уже существует на удаленной стороне. Это по умолчанию режим работы , если не найден явный refspec (который не включен командная строка ни ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...