使用Git忽略所有空间更改时重新应用提交

时间:2016-11-25 16:29:16

标签: git whitespace

我正在尝试合并一个包含一堆提交的分支(~20)。然而,第一次提交是关于重新缩进整个代码正确,并且所有后续提交也包含空格更改,这是我不想要的。 我正在尝试重新申请所有这些提交,但我不知道如何告诉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 - 重新发送名为 foo 的整个文件(将tabs替换为spaces)。我想放弃
  2. B - 在 foo 中应用有效的代码更改。我想保持
  3. C - 应用有效的代码更改并重新输入另一个文件 bar 。我想仅保留代码更改(保留修改后的行的空格更改)
  4. D - 在 foo bar 中应用有效的代码更改,因为他们现在使用spaces代替tabs。我也想保持这些更改。

2 个答案:

答案 0 :(得分: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 :(得分:1)

Q签出时尝试此操作:

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

第一个实际上并没有改变Q中的任何代码,只是&#34;假装&#34;合并是通过创建一个&#34;虚拟&#34;合并提交。这有助于忽略后续增量合并中的A

下一个合并命令会将剩余的提交从D合并为B,但不再合并A

引用docs

  

我们的解析任意数量的头,但合并的结果树始终是当前分支头的树,实际上忽略了所有其他分支的所有更改。

     为了进行三向合并,

ignore-space-change 将指定类型的空白更改的行视为未更改。与空行的其他更改混合的空白更改不会被忽略。 [...]

     
      
  • 如果他们的版本只引入了对行的空白更改,则使用我们的版本;
  •   
  • 如果我们的版本引入了空格更改但版本包含实质性更改,则使用版本
  • ;   
  • 否则,合并将以通常的方式进行。
  •