Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改git历史记录以包含修改过的代码_Git_Version Control - Fatal编程技术网

更改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 在出现的编辑器窗口中,您将在新行上

假设我有以下git历史记录:

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是完全可以的,这就是为什么它们是旧的。请注意,我的解决方案是,我是“其他人”之一,将鞋子扔给造成这种情况的人。请注意,我的解决方案是,我是“其他人”之一,将鞋子扔给造成这种情况的人。