2016-11-10 143 views
1

比方說,我在當地的回購及其分支機構是my_name/branch_A爲什麼git rebase在我沒有修改的文件中顯示衝突?

當我做git rebase <branch_B>,我有時會收到許多衝突中,我並沒有修改的文件。

爲什麼會發生這種情況? 我喜歡從branch_B中獲得所有文件的頭部,除了我在my_name/branch_A中修改的文件之外。如何在不手動解決我自己沒有介紹的這些衝突的情況下做到這一點。

+0

如果該分支中存在修改的文件,則存在衝突的可能性。無論你或其他人修改它們都沒關係。爲了重組,你必須告訴git如何處理這些相互衝突的修改。如果您只想保留branch_a的版本,則可以在衝突解決期間選擇該選項(例如,使用交互式底圖)。 – Thilo

回答

5

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 

你做出提交IJ,現在你想要在提交H之後提交這兩個提交,即,將您的提交重寫爲在「branch_B的提示」之後。

換句話說,你沒有作出承諾C--D--E。儘管如此,這些提交都在你的分支上。實際上,提交AB也在你的分支上:那兩個提交都在上,全部是的分支。

如果你現在運行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尖端和你的分支,從而得到提交IJ;但它應該複製它們(再次,之後,真的)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。)

+1

這可能會有所幫助,可以使用'git log ..HEAD'來查看'git rebase '應用的提交。 – tom

+0

@tom:好點;添加。 – torek

+0

@torek感謝您的詳細解釋。在我完成'git rebase - 在branch_B some_hash_ID'後,我確實看到我想要複製的提交到'branch_B'的頭部。我通過執行'git log --graph --decorate --oneline'來確認它。 但是,我的本地工作空間不反映這一點。因此,如果我執行'git push --force',它會覆蓋遠程回購到完全錯誤的狀態。 如何讓我的本地工作空間指向'my/branch_A'的HEAD並將其推送到遠程回購? – sh0731