我一直在與我們在github上主辦的回購協議上的另一個人一起工作。每當我或他拉,git強迫我們做一個合併提交(vim打開一個提交描述),雖然我們正在處理不同的文件,並且肯定沒有衝突。當從github的團隊回購中拉出來時,git強制我進行合併提交,沒有衝突
不應該在沒有額外的merge-commit的情況下添加新的提交嗎?
我一直在與我們在github上主辦的回購協議上的另一個人一起工作。每當我或他拉,git強迫我們做一個合併提交(vim打開一個提交描述),雖然我們正在處理不同的文件,並且肯定沒有衝突。當從github的團隊回購中拉出來時,git強制我進行合併提交,沒有衝突
不應該在沒有額外的merge-commit的情況下添加新的提交嗎?
把git的歷史想象成一個圖。你的同事和你正在做一個基於提交A的新提交;讓我們把你的B和C.他的歷史,現在看起來是這樣的:
B C
\ /
\/
A
有兩種方法來獲取重新走到一起。一種是合併:
M
/\
/ \
B C
\ /
\/
A
另一種是rebasing(例如通過git pull --rebase
)。在下面的例子中,你是一個rebase:
B -- C -- A
兩者都有優點和缺點。作爲一般規則,如果您尚未推送(或以其他方式分享)您的提交(即,您是唯一擁有B的人),那麼rebase就會正常工作。如果情況並非如此,則重新綁定會導致非常非常煩人的問題,你會更好地合併。
由於每次提交都會記錄整個樹的狀態,因此即使在不同的分支沒有修改任何相同文件時也需要進行合併 。
儘管在這種情況下,保證不會有任何文本 衝突,所以git將始終能夠自動合併來自不同分支的變更 ,但並不保證不會有任何 語義衝突。例如,一個分支可以修改庫 中的方法以要求附加參數,而另一分支向該方法引入新呼叫 ;即使合併不會報告任何衝突,所產生的 代碼將無法進行額外的更改。要求某人執行顯式合併提交引入了在進行非工作提交之前發生此衝突的機會 。實際上,任何人在每次合併時都不會檢查這種類型的衝突,但是如果合併僅在完成工作時合併回 長時間運行的分支中,則不太麻煩使其成爲一種習慣,總是在完成合並後運行測試套件 。