比方說,我在當地的回購及其分支機構是my_name/branch_A
爲什麼git rebase在我沒有修改的文件中顯示衝突?
當我做git rebase <branch_B>
,我有時會收到許多衝突中,我並沒有修改的文件。
爲什麼會發生這種情況? 我喜歡從branch_B
中獲得所有文件的頭部,除了我在my_name/branch_A
中修改的文件之外。如何在不手動解決我自己沒有介紹的這些衝突的情況下做到這一點。
比方說,我在當地的回購及其分支機構是my_name/branch_A
爲什麼git rebase在我沒有修改的文件中顯示衝突?
當我做git rebase <branch_B>
,我有時會收到許多衝突中,我並沒有修改的文件。
爲什麼會發生這種情況? 我喜歡從branch_B
中獲得所有文件的頭部,除了我在my_name/branch_A
中修改的文件之外。如何在不手動解決我自己沒有介紹的這些衝突的情況下做到這一點。
Rebase 副本提交(然後放棄原件)。這是問題的根源。
讓我們來看一個例子。首先,請注意,我正在繪製提交圖,其中較舊的提交圖朝左,而較新的提交圖右側提交。提交在這裏有單字母名稱,而不是Git的真實40字符散列名稱,如f1c93ab7...
。分支名稱出現在右側,箭頭指向該分支的提示提交,因爲這是Git實際存儲這些內容的方式。
您當前的分支名稱爲my_name/branch_A
,並且您也有一個分支,名稱爲branch_B
。每個分支上有一些不在另一分支上的提交,以及分支上的一些提交分支。同時您的分支,my_name/branch_A
,從叉了一些第三點,所以出現在你的分支上沒有的branch_B
,而不是「您提交」提交:
...--A--B--C--D--E <-- branch_uhoh
\ \
\ I--J <-- my_name/branch_A
\
F--G--H <-- branch_B
你做出提交I
和J
,現在你想要在提交H
之後提交這兩個提交,即,將您的提交重寫爲在「branch_B
的提示」之後。
換句話說,你沒有作出承諾C--D--E
。儘管如此,這些提交都在你的分支上。實際上,提交A
和B
也在你的分支上:那兩個提交都在上,全部是的分支。
如果你現在運行git rebase branch_B
(而你仍然在你的分支),Git有弄清楚兩件事情:
名稱branch_B
告訴混帳這兩個東西。要複製的提交「位於my_name/branch_A
而不是branch_B
,即C-D-E-I-J
的位置。」branch_B
的提示提交之後,即提交H
後,放置它們的地方是「。
如果這一切成功,將混帳設置你的分支名稱指向新副本:
...--A--B--C--D--E <-- branch_uhoh
\ \
\ I--J [abandoned]
\
F--G--H <-- branch_B
\
C'-D'-E'-I'-J' <-- my_name/branch_A
與「素」的標記(C'
等)的名稱是副本。
(您可以查看提交該git rebase
會/將與git log <upstream>..HEAD
,在這種情況下是git log branch_B..HEAD
複製。我會在大多數情況下,在此處添加--oneline
,讓每犯一個單行日誌消息。)
那麼,如果這是問題,你應該怎麼做?顯而易見的答案是:告訴Git不要複製C-D-E
。您想這個結果,而不是:
...--A--B--C--D--E <-- branch_uhoh
\ \
\ I--J [abandoned]
\
F--G--H <-- branch_B
\
I'-J' <-- my_name/branch_A
也就是說,Git的應該只複製提交「之間」(之後,真的)的branch_uhoh
尖端和你的分支,從而得到提交I
和J
;但它應該複製它們到(再次,之後,真的)branch_B
的提示。做到這一點的方法是寫:
git rebase --onto branch_B branch_uhoh
換句話說,告訴變基都的事情,而不是告訴它一個東西,讓它找出兩個從。
(但你如何找到branch_uhoh
?嗯,「正確」的方式通常是記住它,但你可以只運行git log --graph --decorate --oneline
,找到切斷它的ID或顯示的任何名稱提交,相反的branch_uhoh
您可以剪切並粘貼實際截止提交的哈希ID。大多數情況下,您可以讓Git本身記住您的「上游」名稱,並且您僅在上游和上游重新分配,並且您需要否參數:你只需運行git rebase
,它可以完成所有的工作,但有些情況下需要移植提交,如果這還不夠,那麼你需要git rebase --onto
。)
這可能會有所幫助,可以使用'git log
@tom:好點;添加。 – torek
@torek感謝您的詳細解釋。在我完成'git rebase - 在branch_B some_hash_ID'後,我確實看到我想要複製的提交到'branch_B'的頭部。我通過執行'git log --graph --decorate --oneline'來確認它。 但是,我的本地工作空間不反映這一點。因此,如果我執行'git push --force',它會覆蓋遠程回購到完全錯誤的狀態。 如何讓我的本地工作空間指向'my/branch_A'的HEAD並將其推送到遠程回購? – sh0731
如果該分支中存在修改的文件,則存在衝突的可能性。無論你或其他人修改它們都沒關係。爲了重組,你必須告訴git如何處理這些相互衝突的修改。如果您只想保留branch_a的版本,則可以在衝突解決期間選擇該選項(例如,使用交互式底圖)。 – Thilo