2017-02-10 93 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