更改git历史记录以包含修改过的代码
假设我有以下git历史记录:更改git历史记录以包含修改过的代码,git,version-control,Git,Version Control,假设我有以下git历史记录: a ----- b ----- c HEAD 头部在c 现在我在(a)中发现了一个bug,显然现在也在(b)和(c)中。我现在想做的是更改(a)中的代码(修复bug),并更新(b)和(c)中的代码。我应该如何使用git实现这一点 感谢您的提问,您似乎希望历史记录看起来从未出现过错误。 你可以这样做: 在新的定期提交中修复该错误。我们称之为提交d 使用交互式rebase:git-rebase-i 在出现的编辑器窗口中,您将在新行上
a ----- b ----- c
HEAD
头部在c
现在我在(a)中发现了一个bug,显然现在也在(b)和(c)中。我现在想做的是更改(a)中的代码(修复bug),并更新(b)和(c)中的代码。我应该如何使用git实现这一点
感谢您的提问,您似乎希望历史记录看起来从未出现过错误。
你可以这样做:
- 在新的定期提交中修复该错误。我们称之为提交
李>d
- 使用交互式rebase:
git-rebase-i
在出现的编辑器窗口中,您将在新行上看到提交a、b、c、d,在它们前面有一个命令(
)李>pick
- 对行重新排序,使具有新提交的行正好位于表示提交
的行之后(应该是第二行)李>a
- 将新提交之前的命令更改为
(而不是默认的squash
。pick
这将导致新的提交(
)合并到第一次提交(d
)中a
请参阅以获得更好的解释。从您的问题来看,您似乎希望历史记录看起来从未出现过错误。
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).
你可以这样做:
- 在新的定期提交中修复该错误。我们称之为提交
李>d
- 使用交互式rebase:
git-rebase-i
在出现的编辑器窗口中,您将在新行上看到提交a、b、c、d,在它们前面有一个命令(
)李>pick
- 对行重新排序,使具有新提交的行正好位于表示提交
的行之后(应该是第二行)李>a
- 将新提交之前的命令更改为
(而不是默认的squash
。pick
这将导致新的提交(
)合并到第一次提交(d
)中a
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
顺便说一句,在此之后,如果您的3次提交已经在远程(源)中,您将无法执行“推送”。您必须执行以下操作:
git push -f
这也将防止其他任何人在有旧提交的情况下进行拉取。但当其他人这样做时,这一问题就可以解决:
git stash # save your changes.
git reset --hard HEAD~3
git pull
git stash pop
修复代码并创建一个新的(d)提交可能是最好的,根据错误的类型,修复与重写历史记录。但是,如果我想在我的主分支上进行测试,每次我签出(b)或(c)时都必须手动编辑代码对于要签出到旧提交的内容?我可能会因为修改而丢失进一步提交的性能,因此我可能只想检查旧提交的性能。签出旧提交可能有很多原因,我刚刚列出了一个。@mc_87您描述的是严重滥用版本控制。不要这样做。Git不允许您任意重写历史,这样您就可以围绕它建立工作流程;但主要是因为它拒绝采取哲学立场反对它。许多VCSE明确拒绝让你做你描述的事情,这是有很好的理由的。旧提交的bug在以后被修复是完全没有问题的,这就是它们为什么是旧的。最好修复代码并创建一个新的(d)提交,根据bug的类型使用该修复与重写历史。但是,如果我想在我的主分支上进行测试,每次我签出(b)或(c)时都必须手动编辑代码对于要签出到旧提交的内容?我可能会因为修改而丢失进一步提交的性能,因此我可能只想检查旧提交的性能。签出旧提交可能有很多原因,我刚刚列出了一个。@mc_87您描述的是严重滥用版本控制。不要这样做。Git不允许您任意重写历史,这样您就可以围绕它建立工作流程;但主要是因为它拒绝采取哲学立场反对它。许多VCSE明确拒绝让你做你描述的事情,这是有很好的理由的。对于旧的承诺来说,拥有稍后修复的bug是完全可以的,这就是为什么它们是旧的。请注意,我的解决方案是,我是“其他人”之一,将鞋子扔给造成这种情况的人。请注意,我的解决方案是,我是“其他人”之一,将鞋子扔给造成这种情况的人。