0

想象一下,我有以下 git 历史:

a ----- b ----- c
               HEAD  

HEAD 在 c 处。

现在我在 (a) 中发现了一个错误,显然现在也在 (b) 和 (c) 中。我现在要做的是更改(a)中的代码(修复错误)并希望在(b)和(c)中更新相同的代码。我应该如何用 git 做到这一点?

谢谢

4

2 回答 2

4

从您的问题来看,您似乎希望历史看起来从来没有错误。
你可以这样做:

  • 在新的常规提交中修复错误。我们称之为 commit d
  • 使用交互式变基:git rebase -i <hash-of-commit-before-a>.
    在出现的编辑器窗口中,您将看到提交 a、b、c、d 每个都在一个新行中,并且pick在它们前面有一个命令 ( )。
  • 重新排序这些行,使新提交的行紧跟在代表提交的行之后a(应该是第二行)。
  • 将新提交前的命令更改为squash(而不是pick默认的)。
    这将导致您的新提交 ,d合并到第一个提交中 , a

请注意,如果您将这些提交推送到另一个 repo,那么 rebase 是一个坏主意。简而言之,这是因为您实际上是在创建新的提交(使用新的哈希),而不仅仅是重新排序现有的提交。如果其他人拉取了您的代码并基于原始提交进行工作,那么当他再次拉取时,他将有重复项,他将不得不手动修复此问题。请参阅变基的危险以获得更好的解释。

于 2013-03-19T19:19:55.927 回答
2
git rebase -i HEAD~3

#An editor window will now open showing 3 commits. Replace 'pick' with 'e', save exit.
#git will now give you a chance to edit last 3 commits. Edit the files to fix the bug, then

git add -u
git commit -m"New message"
git rebase --continue

#This will repeat 3 times. After that, you will have a new set of last 3 commits (with new sha1 of course).

顺便说一句,如果您的 3 个提交已经在远程(来源)中,那么在此之后您将无法执行“推送”。您将必须执行以下操作:

git push -f

这也将防止其他任何人在他们有旧提交的情况下拉动。但是当其他人这样做时,这可以解决:

git stash # save your changes.
git reset --hard HEAD~3
git pull
git stash pop
于 2013-03-19T19:27:51.027 回答