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

重新应用提交,同时忽略Git的所有空间更改,git,whitespace,Git,Whitespace,我正在尝试合并一个具有大量提交(~20)的分支。然而,第一次提交是关于正确地重新缩进整个代码,并且所有后续提交也包含空格更改,这是我不希望看到的。 我试图重新应用所有这些提交,但我不知道如何告诉git忽略空间更改 然而,我尝试了git-format patch-20——忽略干净分支上的所有空格,然后是git-apply*.patch,但这显然失败了,因为补丁是根据其祖先的空格更改单独格式化的 基本上,我希望有相同的历史,但不改变空格: A - B - C - D /

我正在尝试合并一个具有大量提交(~20)的分支。然而,第一次提交是关于正确地重新缩进整个代码,并且所有后续提交也包含空格更改,这是我不希望看到的。 我试图重新应用所有这些提交,但我不知道如何告诉git忽略空间更改

然而,我尝试了
git-format patch-20——忽略干净分支上的所有空格,然后是
git-apply*.patch
,但这显然失败了,因为补丁是根据其祖先的空格更改单独格式化的

基本上,我希望有相同的历史,但不改变空格:

      A - B - C - D
     /       
P - Q         
     \       
      A'- B'- C'- D' (spaces trimmed)
编辑:澄清哪些提交包含哪些内容

  • A-重新标识名为foo的整个文件(将
    选项卡
    替换为
    空格
    )。我想放下它
  • B-在foo中应用有效的代码更改。我想保留它
  • C-应用有效的代码更改并重新标识另一个文件栏。我想只保留代码更改(保留修改行的空格更改)
  • D-在foo和bar中应用有效的代码更改,因为它们现在使用
    空格
    而不是
    选项卡
    。我也想保留这些更改

  • 转到
    D
    位置/分支。然后根据需要删除所有空格。然后再次添加并提交

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

    请在签出
    Q
    时尝试此操作:

    git merge -s ours A
    git merge -X ignore-space-change D
    
    第一种方法实际上并没有更改Q中的任何代码,只是通过创建一个“虚拟”合并提交来“假装”合并已经发生。这对于在后续增量合并中忽略
    A
    非常有用

    下一个merge命令将剩余的提交从
    D
    向下合并到
    B
    ,但不再是
    A

    引述:

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

    忽略空格更改将具有指定类型的空格更改的行视为未更改的行,以便进行三向合并。空格更改与对行的其他更改混合在一起不会被忽略。[……]

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

    实际上,我想删除A(和其他)中的重缩进更改。我尝试了
    git checkout Q&&git merge-Xignore space change A
    ,但是每个空格的更改也被合并了。我明白了,我们编辑的问题现在让这一点更清楚了。请尝试一下我的最新答案。这很奇怪。虽然它适用于提交B和C,但在合并提交D时,将应用A中的所有空间更改,就像D需要它们一样。但是如果我停止提交C,
    foo
    文件看起来很正常……那么,
    A
    是否是“正确地重新缩进整个代码”的提交呢?你能在问题中澄清一下吗?另外,你能澄清一下提交是在同一行中包含空格和代码更改,还是只在同一个文件中?我编辑了这个问题;这有用吗?
    git merge -s ours A
    git merge -X ignore-space-change D