我意识到我在之前提交的更改中犯了一个错误。还有其他几个依赖于这个(错误)的提交。
我可以修改它并将这些更改传播到工作副本吗?
可以做,但我宁愿不做。改变过去有副作用。您的分支或提交树不会快进,如果有的话,您必须覆盖服务器上的分支。换句话说,除非你是最后一个看到它的人,而且它只在你的电脑上。它可能会造成更多问题,如果出现任何问题,您可能会失去东西。
如果你准备好进入时间旅行和另类现实的世界!
欢迎来到git rebase
首先开始,创建一个新的分支,你想要变基,这将创建一个你想要更改的分支的副本,以防万一出现任何问题,只需删除变基,什么都不会改变。你可以只记下提交哈希。
最简单的入门方法是,git rebase -i HEAD~N
其中 N 是您想要更改的过去提交的数量。
它应该打开一个编辑器,您可以将每行的第一个单词更改为类似于编辑的内容。然后保存文件,你正在变基!
变基时,您可以做任何更改添加文件、删除文件等操作。当你提交时,如果没有冲突,它应该会自动继续。一旦一切都完成了,那么你将拥有一个重新设置的分支,其中包含已删除、编辑、重命名或任何你想要的提交。那么如果一切顺利的话。删除旧分支(不重新设置)推送新的重新设置分支,瞧。
除非不是很清楚,否则当它打开编辑器时。删除一行将删除选定的提交。如果您删除文件中的所有内容,它不会执行任何操作。在变基期间的任何时候,您都可以中止它,并且 git 项目的状态不应该改变。变基是一件相当安全的事情,因为它实际上并没有改变任何东西。如果您保留对旧提交的引用,那么它们不会消失。变基后,它会创建一条替代路径。您将拥有一条旧路径和一条新路径。旧路径可能会被取消引用,并且引用此旧路径的任何内容都应移动到新路径。
顺便说一句,我要做的一件事就是提交一些修复旧提交的东西。我认为只有在需要时才必须使用变基。例如,当您的同事不小心提交了 4gb 数据库备份时。
(关于修改公共历史的常见警告......)
鉴于需要修改提交,最简单的方法之一如下:
1) 检查您要使用修改的提交(使用orgit checkout <SHA>
找到正确的 SHA )。gitk
git log
2) 在此提交中使用git checkout -b <new branch name>
.
3) 根据需要修改代码。
4)git commit --amend
用于修改提交。
5)执行“onto”变基以将剩余的提交从原始分支移动。为此,请在从上面修改之前回忆更改提交的 SHA ,并且:
git checkout <original branch name>
。git rebase --onto <new branch name> <before SHA of the modified commit>
。这将具有在新分支之上的原始分支上重放该 SHA 之后的提交的效果。您可能需要在变基期间解决合并冲突(像往常一样)。
6)使用删除新分支git branch -d <new branch name>
。
像往常一样,看看发生了什么,gitk
以确保它是你的想法,并且(为了安全)在进行变基之前标记原始分支。
首先进行更改并提交为fixup! Original's commit message
.
然后决定你想在 repo 中看到什么(以及允许什么)。如果不允许您改写历史,那么就完全停止,您把可能的事情搞砸了。
如果允许,请在原始提交的父级上启动交互式 rebase。您将看到前两个条目是选择原始条目和带有修复程序的修复程序。将所有其他提交设置为“编辑”,然后启动。
该过程将在每次进一步提交时停止,在那里您编译、重写内容以了解更改,工作正常。并使用rebase --continue
. 然后强制推动分支(并执行为历史重写案例规定的所有仪式)。
如果提交已经被推送,您可以通过
git revert <commit hash>
为了获取提交哈希,只需使用git log
命令