2011-12-31 2 views
36

Согласно документации, мерзавца тянуть выполняет мерзавца выборку затем в GIT слияния, однако в этом случае исполняющего GIT мастера тянуть происхождения должен выполнить мерзавец принести мастер происхождения правильно? Однако, похоже, это не так. Вот пример.git pull изначальный тормозные колодки не обновляет изначальный/тормозные колодки?

Предполагаемый мой удаленный мастер происхождения (на GitHub в моем случае) имеет следующую историю:

commit 1111111 : my first commit 
commit 2222222 : a commit from someone else 

и у меня есть только мой первый совершить локально, как делают следующие шоу

git checkout master 
git log --pretty=format:'%h' -n 1 
1111111 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
1111111 

Отсюда я сделайте мою тягу и посмотрите на результаты следующим образом:

git checkout master 
git pull origin master 

git log --pretty=format:'%h' -n 1 
2222222 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
1111111 

Как видно, pu Фактически я обновил свою основную ветку с новыми фиксациями (-ами) из удаленного источника, но мой местный источник/мастер все еще там, где он был. Заставляя меня делать следующее:

git fetch origin master 

git checkout origin/master 
git log --pretty=format:'%h' -n 1 
2222222 

Это правильное поведение для git pull или, возможно, у меня что-то не настроено? Я просмотрел страницу git pull man и не видел ничего, что предлагало это, но я, возможно, пропустил это.

+0

увидеть, если это помогает объяснить, почему к вам. http://stackoverflow.com/questions/2452226/master-branch-and-origin-master-have-diverged-how-to-undiverge-branches или этот http://stackoverflow.com/questions/2883840/differences -between-git-pull-origin-master-git-pull-origin-master – carbonbasednerd

+1

Возможный дубликат ['git pull origin mybranch' оставляет локальный mybranch N совершает опережение. Почему] (HTTP: // StackOverflow.com/questions/1741143/git-pull-origin-mybranch-leaves-local-mybranch-n-commits-ahead-of-origin-why) –

+0

Возможно, вам стоит подумать о выполнении 'git fetch', а затем' git merge'. У вас обычно будет меньше сюрпризов и больше контроля над слиянием. –

ответ

28

Это немного странно, но если вы используете git pull [remote] <refspec>, это фактически не обновляет удаленные ссылки. Это имеет смысл, если вы думаете об этом определенным образом: поскольку вы указываете конкретный рефлектор для извлечения, ему не нужно искать что-либо о ваших удаленных ветвях, поэтому он по сути не знает, что такое удаленная ветвь должен обновляться. Это, конечно, могло бы понять это, и я не удивлюсь, если он будет исправлен в конце концов, но это уже существующее поведение. (В нем могут быть сообщения в списке рассылки - я не знаю.)

Вы можете легко обойти его. Если вы используете git pull origin/master, поскольку вы указываете, что выбрать через удаленный филиал, он должен обновить эту удаленную ветвь. И если вы все равно находитесь на своем главном ветви (или в любом другом направлении отслеживания происхождения/мастера), вы можете просто сделать git pull и позволить ему заполнить значения по умолчанию и обновить удаленные ветви.

Это задокументировано в справочной странице git-pull, наиболее сжатой в соответствии с ПРИМЕРами, но также и в других местах. Соответствующая часть:

сливаются в текущей ветви удаленного филиала следующий:

$ git pull origin next 

Это оставляет копию следующего временно FETCH_HEAD, но не обновляет все удаленные отслеживания ветвей. Использование удаленных отслеживания ветвей, то же самое может быть сделано путем вызова выборки и слияния:

$ git fetch origin 
$ git merge origin/next 
+0

Является ли это документированным в любом месте на страницах git man? –

+0

Я думаю, что он похоронен где-то на странице «git-pull». Я попробую и поймаю это когда-нибудь позже, если я запомню. – Cascabel

+0

@ KennethBaltrinic: Он находится в разделе примеров и может быть выведен из остальной документации. – Cascabel

Смежные вопросы