2016-11-25 27 views
1

我想合併一個提交(〜20)的分支的分支。然而,第一次提交是關於重新縮進整個代碼正確和所有後續提交還包含空白更改,我不想要。 我正在嘗試重新應用所有這些提交,但我不知道如何告訴git忽略空間更改。重新申請提交,而忽略所有空間變更與Git

然而,我嘗試了git format-patch -20 --ignore-all-space後跟git apply *.patch在一個乾淨的分支上,但這顯然失敗了,因爲補丁單獨格式化,其祖先的空間變化。

基本上我想有相同的歷史,但不帶空格的變化:

 A - B - C - D 
    /  
P - Q   
    \  
     A'- B'- C'- D' (spaces trimmed) 

編輯:爲了澄清其承諾包含的內容。

  1. A - 重新縮進(與spaces更換tabs)命名整個文件。我想下降吧。
  2. B - 在foo中應用有效的代碼更改。我想保持吧。
  3. C - 應用有效的代碼更改並重新注入另一個文件bar。我想只保留代碼變更(保留爲經修改的線空間變化)
  4. d - 在FOO酒吧應用有效的代碼更改,因爲他們現在使用spaces,而不是tabs事實。我想也保留這些變化。
+0

那麼,是'A'提交即「講述的是重新正確地縮進整個代碼」?你能否在這個問題上澄清一下? – sschuberth

+0

此外,請您澄清是否提交包含空格*和*代碼更改在同一行*,或只在同一個*文件*? – sschuberth

+0

我編輯了這個問題;這有幫助嗎? – bagage

回答

1

轉到D位置/分支。然後根據需要刪除所有空格。然後再次添加&提交。

$ git checkout <D-position-branch-name> 

更改你想要什麼(刪除所有空格,只要你想)

$ git commit -am 'Remove spaces'  # add & commit your changes 
$ git push origin HEAD     # push your changes to remote 
1

嘗試有Q簽出這一點的同時:

git merge -s ours A 
git merge -X ignore-space-change D 

第一個實際上不改變任何代碼Q,但只是通過創建「虛擬」合併提交「假裝」合併。這在後續增量合併中忽略A很有用。

下一個合併命令將剩餘的提交從D下降到B,但不再合併A

引述docs

我們解決任何數量的頭,但由此產生的合併的樹始終是當前分支頭,有效地忽略來自所有其他分支的所有更改。

忽略空間變化爲了三向合併的目的,將指定類型的空白變化的行視爲未更改。空白變化與其他變化混合在一起不會被忽略。 [...]

  • 如果他們版本只介紹空白變爲一條線,我們版本被使用;
  • 如果我們版本引入了空白的變化,但他們的包括一個實質性的變化,使用他們版本;
  • 否則,合併按照通常的方式進行。
+0

我實際上希望從A(和其他人)刪除*重新縮進更改。我嘗試過'git checkout Q && git merge -Xignore-space-change A',但是每個空間的變化都被合併了。 – bagage

+0

我明白了,我們編輯的問題現在更清晰了。請嘗試更新我的答案。 – sschuberth

+0

這很奇怪。雖然它適用於提交B和C,但在合併提交D時,A的所有空間更改都已得到應用,就像D需要它們一樣。但如果我停止提交C,'foo'文件看起來很理智...... – bagage