2017-02-10 10 views
0

Ive получал ошибку при попытке слить или потянуть ветку.Ошибка Git при слиянии/вытягивании

ошибки (этот пример из запроса нагрузочного) выглядит следующим образом:

MacBook-Pro-2:boilerplate Gene$ git pull origin test_branch 
From https://github.com/me/boilerplate 
* branch   test_branch  -> FETCH_HEAD 

Merge branch 'test_branch' of https://github.com/me/boilerplate into test_branch 

# Please enter a commit message to explain why this merge is necessary, 
# especially if it merges an updated upstream into a topic branch. 
# 
# Lines starting with '#' will be ignored, and an empty message aborts 
# the commit. 
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
~                    
"~/Sites/boilerplate/.git/MERGE_MSG" 7L, 302C 

Вещь я определенно введет сообщение фиксации.

git commit -am "saving my work"

И эта ошибка оленья кожа дать мне возможность решить ее или даже Ctrl + C вне. В основном я должен закрыть окно терминала и снова открыть его.

Вещь, когда я снова открываю терминал, запрос слияния или выталкивания всегда кажется успешным, но не выполняется. Я просто совершаю свои изменения и все в порядке. Его в основном просто раздражает (и немного нервный wracking для более важных слияний).

Кто-нибудь знает, что это может быть и как его предотвратить?

+1

Вы знаете, как использовать 'vi'? – PetSerAl

+0

Возможный дубликат [как я могу настроить сообщение об объединении git?] (Http://stackoverflow.com/questions/3148863/how-can-i-customize-gits-merge-commit-message) – chwarr

+0

Я не знаю о 'vi' – yevg

ответ

1

Это не сообщение об ошибке. git pull необходимо выполнить слияние, и он просит вас объяснить, почему ..., который немного неискренен, чтобы спросить пользователя, но это Git для вас.

git pull origin test_branch действительно git fetch origin plus a git merge origin/test_branch. Git не разговаривает с удаленными репозиториями, если вы не сообщите об этом, поэтому он должен получить свежий снимок того, что было изменено на пульте дистанционного управления. Он делает fetch, чтобы получить обновление состояния удаленного репозитория. Он хранит это в удаленных ветвях отслеживания, таких как origin/test_branch, где находится ветка test_branch на репозитории origin.

Перед извлечением, ваше репо может выглядеть примерно так.

A - B - C - D [origin/test_branch] 
      \ 
       E - F [test_branch] 

Это означает, что в последний раз, когда вы сгружен с origin, его test_branch был в D. Тогда вы сделали несколько коммитов.

После извлечения это может выглядеть так.

A - B - C - D - G - H [origin/test_branch] 
      \ 
       E - F [test_branch] 

Кто-то толкнул некоторые изменения, так что ваш test_branch уже расходились от test_branch филиала origin «s. Это должно быть объединено, поэтому git pull делает git merge origin/test_branch. Это приводит к фиксации слияния, и, как и любое слияние, он просит вас объяснить, почему это произошло.

A - B - C - D - G - H [origin/test_branch] 
      \  \ 
       E - F - I [test_branch] 

Вы можете сказать ему что-то вроде «Синхронизация с пультом дистанционного управления».


Сделайте это достаточно, и вы получите много слияний, которые на самом деле являются просто бухгалтерией.

A - B - C - D - G - H - J - K - L - M [origin/test_branch] 
      \  \  \  \ 
       E - F - I - N - O - P - Q [test_branch] 

I, O и Q - все это бессмысленно. Когда все это делают, хранилище может стать большим беспорядком. Я аккуратно нарисовал его, но Гит не всегда так поступает.

Есть лучший способ. git pull --rebase. Вместо fetch + merge, это выборка + rebase.Итак, после fetch у вас есть это.

A - B - C - D - G - H [origin/test_branch] 
      \ 
       E - F [test_branch] 

Вместо того чтобы делать git merge origin/test_branch это делает git rebase origin/test_branch. Он перезаписывает E и F, как если бы они были сверху H, давая им новые идентификаторы фиксации.

A - B - C - D - G - H [origin/test_branch] 
      \  \ 
       E - F E1 - F1 [test_branch] 

E и F в конечном итоге будет мусора, но они будут торчать на некоторое время, так что если что-то идет ужасно неправильно, вы можете повернуть этот процесс вспять.

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

В отличие от других видов использования rebase это всегда безопасно, поскольку оно влияет только на то, что вы не поделились ни с кем другим. Вы можете безопасно установить его так, чтобы git pull всегда будет обновлять ваш ~/.gitconfig.

[pull] 
     rebase = true 

Теперь git pull origin test_branch будет использовать перебазирование вместо слияния, и вы будете иметь более чистую историю с меньшей бухгалтерией.

+0

Благодарим вас за ваш тщательный ответ. Я знаю, что пример ссылался на запрос на перенос, но что означало бы это сообщение в случае слияния? – yevg

+0

@yevg 'git pull' - это не запрос на тяну. Запрос на растяжение - вещь Гитуба, а не Гит. То, что вы получили *, - это сообщение из слияния, 'git pull' - это' git fetch' + 'git merge'. – Schwern

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

  • Нет связанных вопросов^_^