Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git会自动将提交挤压到以前更改了相同文件的提交_Git_Squash - Fatal编程技术网

git会自动将提交挤压到以前更改了相同文件的提交

git会自动将提交挤压到以前更改了相同文件的提交,git,squash,Git,Squash,我有一个功能分支,它包含一系列涉及不同文件的交叉提交。我想将涉及相同文件的提交挤在一起,但不想将彼此不接触的一系列提交挤在一起。我不想通过手动检查每次提交的更改来确定这一点 例如,如果存在以下提交: 更改文件A和B 变化C 改变 变化C 更改C和D 更改A和C 重新基准将自动生效 将3压到1上 将4压到2上 不要把5压在2上 不要将6压缩到1或2上(但稍后对A和/或C的更改会压缩到6上) 可能在这之后会出现一些破坏-可能一些更改依赖于单独文件中的其他更改,并且现在已经无序,但是如果我确实希望

我有一个功能分支,它包含一系列涉及不同文件的交叉提交。我想将涉及相同文件的提交挤在一起,但不想将彼此不接触的一系列提交挤在一起。我不想通过手动检查每次提交的更改来确定这一点

例如,如果存在以下提交:

  • 更改文件A和B
  • 变化C
  • 改变
  • 变化C
  • 更改C和D
  • 更改A和C
  • 重新基准将自动生效

    • 将3压到1上
    • 将4压到2上
    • 不要把5压在2上
    • 不要将6压缩到1或2上(但稍后对A和/或C的更改会压缩到6上)
    可能在这之后会出现一些破坏-可能一些更改依赖于单独文件中的其他更改,并且现在已经无序,但是如果我确实希望每个提交都能正常工作,那么我需要检查的提交会更少,需要运行的测试也会更少(最终可能会手动将所有内容压缩在一起)

    这里需要一个复杂的脚本来解析更改的文件列表吗?

    git-rebase-i
    让这变得非常简单。 下面似乎有很多步骤,但这只是因为我将带您详细了解它的工作原理,并添加了一些安全步骤

  • 签出要在其上执行此操作的分支

  • [可选]
    git checkout-b
    在临时分支上执行此工作。这样可以很容易地将重新排序和挤压的分支与原始分支进行比较,以确保没有丢失任何更改

  • 确定要重新排序/挤压的最早提交的父级的引用。在给定的示例中,
    head~6
    应该可以工作,但要使用任何有效的引用,例如
    ^
    一些标记^

  • `git-rebase-i

  • 这将生成一个rebase
    todo
    脚本(本质上是一个高级rebase脚本)。它将在编辑器中打开。它将显示自
    以来的提交列表,以及每个提交的默认命令(
    pick

  • 按照文件中包含的说明对提交进行重新排序,并按您喜欢的方式挤压它们。您还可以选择其他命令

    (如果您不做任何更改,并让
    git-rebase
    按原样运行文件,它将按该顺序重放这些确切的提交——换句话说,与以前一样,不会有任何更改。)

  • 关闭文件。Git将继续执行
    todo
    脚本

    “可能在此之后出现了一些损坏-可能一些更改依赖于单独文件中的其他更改,现在已无法正常运行”


    这将显示为合并冲突。重设基础过程将停止,以便您可以解决这些冲突。每次
    rebase-i
    出于任何原因停止时,它都会提供有关需要执行的操作以及如何恢复脚本的有用信息

    如果没有冲突,脚本将不停止地逐个提交

    您可以在任何时候遇到问题时轻松中止。 如果任何冲突给您带来了太多的麻烦,或者您有疑问,您可以使用
    git-rebase--abort
    中止整个脚本,并返回到正确的起始位置。因此没有风险

  • 完成后,如果执行了步骤2,则可以
    git diff
    确保没有丢失任何更改。如果一切正常,您可以
    git branch-f
    将原始分支指向新的提交历史记录


  • git-rebase-i
    几乎是我最喜欢的git命令。我值得成为这方面的专家
    git-help-rebase
    是一个很好的开始——阅读有关
    -interactive
    rebase的部分。此外,可能还有很多博客帖子在上面。

    git-rebase-i
    让这变得非常简单。 下面似乎有很多步骤,但这只是因为我将带您详细了解它的工作原理,并添加了一些安全步骤

  • 签出要在其上执行此操作的分支

  • [可选]
    git checkout-b
    在临时分支上执行此工作。这样可以很容易地将重新排序和挤压的分支与原始分支进行比较,以确保没有丢失任何更改

  • 确定要重新排序/挤压的最早提交的父级的引用。在给定的示例中,
    head~6
    应该可以工作,但要使用任何有效的引用,例如
    ^
    一些标记^

  • `git-rebase-i

  • 这将生成一个rebase
    todo
    脚本(本质上是一个高级rebase脚本)。它将在编辑器中打开。它将显示自
    以来的提交列表,以及每个提交的默认命令(
    pick

  • 按照文件中包含的说明对提交进行重新排序,并按您喜欢的方式挤压它们。您还可以选择其他命令

    (如果您不做任何更改,并让
    git-rebase
    按原样运行文件,它将按该顺序重放这些确切的提交——换句话说,与以前一样,不会有任何更改。)

  • 关闭文件。Git将继续执行
    todo
    脚本

    “可能在此之后出现了一些损坏-可能一些更改依赖于单独文件中的其他更改,现在已无法正常运行”


    这将显示为合并冲突。重设基础过程将停止,以便您可以解决这些冲突。每次
    rebase-i
    出于任何原因停止时,它都会提供有关需要执行的操作以及如何恢复脚本的有用信息<