当前位置:   article > 正文

在Git历史记录中插入新提交

在一堆提交中插入一个新的提交

关于Git历史记录重写的大多数教程都指出,永远不要重写历史记录。 像所有原理一样,它主要取决于确切的上下文。 原则可能应该这样更新:

不应重写公共 Git历史记录

原因是,一旦推送了Git历史记录,便将其公开了:其他开发人员可能已开始在此基础上进行工作。 然后,直到那时,重写历史才是问题。 这也意味着有时候,有理由重写历史记录。 只要没有提交就可以了

有很多不同的方式可以更改历史记录。 其中,我经常使用的是插入一个新的提交。 例如,当我为一个新演讲编写代码时,我会尝试使其顺理成章地进行:每次提交都是我要在演讲中演示的一个步骤。 但是有时候,我忘记了一步。 或者,我意识到以后的步骤不是将来步骤所需要的。 为了向想要访问该回购协议的与会者显示干净的历史记录,我需要在历史记录的早期更新步骤。

这是我使用的方法及其各自的上下文。

直接变基

当承诺被插入-与历史的其余部分-没有任何共同之处,最快捷的方法是添加后的步骤,然后rebase交互。

考虑以下Git树:

A---B---C---D---E
                ^
              master

要以交互方式进行基准调整,可以使用git rebase -i命令:

git rebase-i C^

显示以下内容:

pick C  Commit files c1.txt and c2.txt
pick D  Commit files d3.txt and d4.txt
pick E  Commit files e5.txt and e6.txt

使用自己喜欢的文本编辑器,更改行顺序:

pick E  Commit files e5.txt and e6.txt
pick C  Commit files c1.txt and c2.txt
pick D  Commit files d3.txt and d4.txt

最终的树如下所示:

A---B---E---C---D
                ^
              master

将单个提交一分为二

另一个常见用例是将一个提交步骤分为两个不同的提交步骤。 让我们从与上述相同的Git历史记录开始,并使用相同的rebase命令。 但是,这一次,无需更改行顺序,而是需要编辑要拆分的提交:

edit C  Commit files c1.txt and c2.txt
pick D  Commit files d3.txt and d4.txt
pick E  Commit files e5.txt and e6.txt

要将属于C所有更改提交回工作树:

git reset HEAD^

现在,可以根据需要分别提交文件:

  1. git add c1.txt
  2. git commit-m"Commit file c1.txt"
  3. git add c2.txt
  4. git commit -m"Commit file c2.txt"

最后,互动rebase应继续:

git rebase--continue

这将产生以下结果:

A---B---C1---C2---D---E
                      ^
                    master

分支和改基

不时地进行基础调整比上述两个示例要复杂一些。 在这种情况下,最重要的是避免破坏历史。 因此,作为预防措施,应首先在插入点创建一个分支:

  1. git checkout C
  2. git branch-b insert

这给出了以下内容:

A---B---C---D---E
        ^       ^
     insert  master
      HEAD

现在,可以添加一个额外的提交(或多个):

  1. touch insert.txt
  2. git add insert.txt
  3. git commit -m"Commit file insert.txt"

这是结果树:

A---B---C---D---E
         \      ^
          \   master
           \
            N
            ^
          insert

最后,让我们将master分支移到包含新插入的提交的insert分支的顶部。 它需要使用rebase命令的另一个选项,即--onto :这允许从提交点“ --onto ”一部分Git树,然后将其“ --onto ”到另一个提交之上。

  1. git checkout master
  2. git rebase--onto insert C (1)
  1. 获取当前分支( master )和C之间的提交,并将其移到insert顶部

这是结果树:

A---B---C
         \
          \
           \
            N---D---E
            ^       ^
          insert  master

或以另一种方式看待它:

A---B---C---N---D---E
            ^       ^
          insert  master

理想情况下,现在insert分支应该被删除,尽管并非绝对必要:

git branch-d insert

结论

Git是一个巨大的野兽:它可以通过许多不同的方式提供很多功能。 为了在历史记录中插入一个提交,我展示了我经常使用的3个替代方案:

  • 简单的交互式rebase,对提交进行重新排序
  • 将现有提交拆分为几个不同的提交,从而使交互基础更加复杂
  • 重新定位

可能还有更多。 了解您的选择,并使用最适合您的用例的选择。

翻译自: https://blog.frankel.ch/inserting-new-commit-git-history/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/940565
推荐阅读
相关标签
  

闽ICP备14008679号