A---B---C---D---E ^ master
赞
踩
关于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^
现在,可以根据需要分别提交文件:
- git add c1.txt
- git commit-m"Commit file c1.txt"
- git add c2.txt
- git commit -m"Commit file c2.txt"
最后,互动rebase
应继续:
git rebase--continue
这将产生以下结果:
A---B---C1---C2---D---E ^ master
不时地进行基础调整比上述两个示例要复杂一些。 在这种情况下,最重要的是避免破坏历史。 因此,作为预防措施,应首先在插入点创建一个分支:
- git checkout C
- git branch-b insert
这给出了以下内容:
A---B---C---D---E ^ ^ insert master HEAD
现在,可以添加一个额外的提交(或多个):
- touch insert.txt
- git add insert.txt
- git commit -m"Commit file insert.txt"
这是结果树:
A---B---C---D---E \ ^ \ master \ N ^ insert
最后,让我们将master
分支移到包含新插入的提交的insert
分支的顶部。 它需要使用rebase
命令的另一个选项,即--onto
:这允许从提交点“ --onto
”一部分Git树,然后将其“ --onto
”到另一个提交之上。
- git checkout master
- git rebase--onto insert C (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个替代方案:
可能还有更多。 了解您的选择,并使用最适合您的用例的选择。
翻译自: https://blog.frankel.ch/inserting-new-commit-git-history/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。