2017-02-10 90 views
0

尝试合并或拉出分支时出现错误。合并/拉动时出现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了。我基本上必须关闭终端窗口并重新打开它。

事情是,一旦我重新打开终端,合并或拉请求似乎总是成功,但没有承诺。我只是承诺我的改变和罚款。它大多只是令人讨厌的(并且更重要的合并有点神经不安)。

有谁知道这可能是什么,以及如何预防它?

+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加上git merge origin/test_branch。除非您告诉Git,否则Git不会与远程存储库进行通信,所以必须获得远程存储器上更改内容的全新快照。它执行fetch以获取远程存储库状态的更新。它将其存储在远程跟踪分支中,如origin/test_branchtest_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已经从origintest_branch分支分歧。这必须合并,所以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并不总是这样做。

还有更好的办法。 git pull --rebase。取而代之的是fetch + merge,这是一个fetch + 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之上一样,为它们提供新的提交ID。

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将使用rebase而不是merge,并且您将拥有更清晰的历史和更少的簿记。

+0

感谢您的全面回复。我知道这个例子是关于拉取请求的,但是这个消息在合并的情况下意味着什么? – yevg

+0

@yevg'git pull'不是拉请求。拉请求是一个Github的东西,而不是Git。你得到的*是一个来自合并的消息,'git pull'是'git fetch' +'git merge'。 – Schwern