如何在“git reset --hard”之后恢复更改

时间:2013-06-05 15:05:33

标签: git git-reset

我意识到我们的分支开发不是很稳定,并且还原了一些更改以便对它们进行调试。

git checkout dev
git checkout -b staged_dev
git push origin staged_dev
# go back to dev
git checkout dev
git reset 230086bf429307182ed9b35e19ad2581a3a2baf6 # last known stable state of dev
git reset --soft HEAD@{1}
git commit -m "Revert to 230086bf429307182ed9b35e19ad2581a3a2baf6" # this commit SHA = 270329c
git reset --hard
git push origin dev

这在dev:270329c

之上添加了一个新提交

从那时起,另一个人为dev添加了一些安全提交,我调试了staged_dev并添加了一些提交。如何从dev中撤消270329c并将staged_dev的其他提交添加到dev?

参考stackoverflow问题:Revert to a commit by a SHA hash in Git?

2 个答案:

答案 0 :(得分:1)

git reflog应该显示事物的位置,以便您可以从中创建old_dev分支。

请参阅reflog, your safety net

答案 1 :(得分:0)

您最简单的选择可能就是:

git checkout dev
git merge staged_dev
git push origin dev

如果您对结果历史不满意,可以先将修改后的更改修改为“开发”分支的提示:

git checkout staged_dev
git rebase dev
git checkout dev
git merge staged_dev

如果您希望修改后的“staged_dev”提交在历史记录中与原始230086提交中的相同的位置,那么您将不得不变得更加漂亮,并且如果不删除已在“origin”中发布的“dev”中的修订历史记录,则无法执行此操作。但如果那是你真正需要的,你可以这样做:

git checkout -b new-dev 230086bf  # point where "dev" diverged
git cherry-pick <first commit you want to include*>..staged_dev
git checkout -t origin/dev
git rebase new-dev
git push origin +dev

您可能想向所有人宣布,他们对“dev”的本地结帐可能不再是上游历史记录。