4

我意识到我在之前提交的更改中犯了一个错误。还有其他几个依赖于这个(错误)的提交。

我可以修改它并将这些更改传播到工作副本吗?

4

4 回答 4

6

可以做,但我宁愿不做。改变过去有副作用。您的分支或提交树不会快进,如果有的话,您必须覆盖服务器上的分支。换句话说,除非你是最后一个看到它的人,而且它只在你的电脑上。它可能会造成更多问题,如果出现任何问题,您可能会失去东西。

如果你准备好进入时间旅行和另类现实的世界!

欢迎来到git rebase

首先开始,创建一个新的分支,你想要变基,这将创建一个你想要更改的分支的副本,以防万一出现任何问题,只需删除变基,什么都不会改变。你可以只记下提交哈希。

最简单的入门方法是,git rebase -i HEAD~N其中 N 是您想要更改的过去提交的数量。

它应该打开一个编辑器,您可以将每行的第一个单词更改为类似于编辑的内容。然后保存文件,你正在变基!

变基时,您可以做任何更改添加文件、删除文件等操作。当你提交时,如果没有冲突,它应该会自动继续。一旦一切都完成了,那么你将拥有一个重新设置的分支,其中包含已删除、编辑、重命名或任何你想要的提交。那么如果一切顺利的话。删除旧分支(不重新设置)推送新的重新设置分支,瞧。

编辑

除非不是很清楚,否则当它打开编辑器时。删除一行将删除选定的提交。如果您删除文件中的所有内容,它不会执行任何操作。在变基期间的任何时候,您都可以中止它,并且 git 项目的状态不应该改变。变基是一件相当安全的事情,因为它实际上并没有改变任何东西。如果您保留对旧提交的引用,那么它们不会消失。变基后,它会创建一条替代路径。您将拥有一条旧路径和一条新路径。旧路径可能会被取消引用,并且引用此旧路径的任何内容都应移动到新路径。

重要的

顺便说一句,我要做的一件事就是提交一些修复旧提交的东西。我认为只有在需要时才必须使用变基。例如,当您的同事不小心提交了 4gb 数据库备份时。

于 2013-06-23T11:20:31.560 回答
3

(关于修改公共历史的常见警告......)

鉴于需要修改提交,最简单的方法之一如下:

1) 检查您要使用修改的提交(使用orgit checkout <SHA>找到正确的 SHA )。gitkgit 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以确保它是你的想法,并且(为了安全)在进行变基之前标记原始分支。

于 2013-06-23T11:51:53.630 回答
2

首先进行更改并提交为fixup! Original's commit message.

然后决定你想在 repo 中看到什么(以及允许什么)。如果不允许您改写历史,那么就完全停止,您把可能的事情搞砸了。

如果允许,请在原始提交的父级上启动交互式 rebase。您将看到前两个条目是选择原始条目和带有修复程序的修复程序。将所有其他提交设置为“编辑”,然后启动。

该过程将在每次进一步提交时停止,在那里您编译、重写内容以了解更改,工作正常。并使用rebase --continue. 然后强制推动分支(并执行为历史重写案例规定的所有仪式)。

于 2013-06-23T16:09:36.520 回答
1

如果提交已经被推送,您可以通过

git revert <commit hash>

为了获取提交哈希,只需使用git log命令

于 2013-06-23T11:14:46.663 回答