如何在git中恢复许多提交以恢复到特定状态

时间:2014-02-13 19:52:53

标签: git github

我已发送PR并将其合并到存储库。假设PR没有。是127并且PR按顺序包含以下提交(最近的第一个)

hdyw6
cnsfg

然后我发了另一个PR没有。 128其中有以下提交

6dwiu
sbyww

(假设PR第126号中只有一个提交,即提交jdus7

现在我意识到错误得到了提交,现在我想在PR 127之前将存储库带回舞台。这意味着我要保持提交直到jdus7(那是在公关号126)

那怎么做?

我是否必须逐一恢复提交(从最近开始),类似这样的事情?

git revert sbyww
git revert 6dwiu
git revert cnsfg
git revert hdyw6

现在终于所有糟糕的提交都消失了?请纠正我,如果它不起作用或更好的方法吗?

或者有些东西不是一个接一个地回复我只是说git reset back till jdus7

3 个答案:

答案 0 :(得分:0)

git reset --hard jdus7

git revert用于另一件事(引入新的提交还原先前提交的更改)。

答案 1 :(得分:0)

如果您只想彻底清除当前分支中的某些内容,那么您可能需要

git reset --hard jdus7

这会使指定的jdus7 ID成为新的HEAD。命令git revert(如您所见)将在您正在恢复的提交之上创建一系列新提交。这可能会造成丑陋的历史,并为未来的承诺留下潜在的地雷。

如果还原提交,那么将不会合并该提交的任何更改。因此,如果您还原提交123456,然后运行git merge 123456,它实际上不会合并任何内容。这可能真的令人困惑。为了引入更改,您必须找到由git revert 123456 生成的还原提交,然后还原该提交

但请注意,如果您使用git reset --hard,则无法再从当前分支访问已删除的提交。使用git revert时,它们仍将存在,以及还原提交。

答案 2 :(得分:0)

如果分支仅为本地分支,则可以git reset --hard jdus7

但是,如果提交已被推送到远程分支,这只会将您移回本地并且实际上不会删除提交(除非您执行git push -f但是如果您是唯一的人,则应该只执行此操作使用遥控器,因为它会弄乱人们的历史)

您可以创建"多次提交还原"使用此命令:

git diff HEAD..jdus7 --name-only | xargs git checkout jdus7 --

这将获取已更改的文件,并从您想要的状态中检出它们。然后,您可以提交这些更改,并将所有内容还原为您想要的提交。