想象一下,我有以下 git 历史:
a ----- b ----- c
HEAD
HEAD 在 c 处。
现在我在 (a) 中发现了一个错误,显然现在也在 (b) 和 (c) 中。我现在要做的是更改(a)中的代码(修复错误)并希望在(b)和(c)中更新相同的代码。我应该如何用 git 做到这一点?
谢谢
想象一下,我有以下 git 历史:
a ----- b ----- c
HEAD
HEAD 在 c 处。
现在我在 (a) 中发现了一个错误,显然现在也在 (b) 和 (c) 中。我现在要做的是更改(a)中的代码(修复错误)并希望在(b)和(c)中更新相同的代码。我应该如何用 git 做到这一点?
谢谢
从您的问题来看,您似乎希望历史看起来从来没有错误。
你可以这样做:
d
。 git rebase -i <hash-of-commit-before-a>
. pick
在它们前面有一个命令 ( )。 a
(应该是第二行)。 squash
(而不是pick
默认的)。d
合并到第一个提交中 , a
。请注意,如果您将这些提交推送到另一个 repo,那么 rebase 是一个坏主意。简而言之,这是因为您实际上是在创建新的提交(使用新的哈希),而不仅仅是重新排序现有的提交。如果其他人拉取了您的代码并基于原始提交进行工作,那么当他再次拉取时,他将有重复项,他将不得不手动修复此问题。请参阅变基的危险以获得更好的解释。
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