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