【问题标题】:Git Checkout reverted code to older commit, how to revert back?Git Checkout 将代码还原为较旧的提交,如何还原?
【发布时间】:2011-08-31 21:53:33
【问题描述】:

我一直在编写一些代码,我使用 git 来管理这些代码。早些时候,我使用提交来保存我的代码版本。后来我决定重做代码,因为它需要一些新功能并且设计得很糟糕。在我让它工作之后,我又做了一次 git commit。执行 git log 后,我发现我不在任何分支上。所以,我做了“git checkout master”。这又回到了我的旧代码版本, git log 现在显示我的最新提交。这是很多工作,所以我想知道是否有任何方法可以撤消我所做的事情,并取回我的最新代码。提前感谢您的帮助。

【问题讨论】:

标签: git git-checkout


【解决方案1】:

检查git reflog 并找到您的提交。

最安全的做法是在“丢失”提交时创建一个分支,然后使用gitkgit log -p 检查一切是否正常

git branch recovery HEAD@{1} # use whatever commit you need
git log -p recovery

然后可以合并这个新分支,重新建立在 master 之上,提交它的cherry-picked,等等。在 git 中有很多可能性让自己在脚上开枪,但还有更多方法可以重新连接那只脚(可能在你的怀里)。

如果你还没有在 master 上进行任何新的提交,你可以简单地合并有问题的提交,这将被 git 解决为快进合并:

git merge HEAD@{1} # use whatever commit you need

如果您不关心 master 上的任何新提交,而只想将 master 分支重置为丢失的提交,请使用 git reset。为了不丢失任何更改,请先将更改存储到您的工作副本 (git stash save)

git reset --keep HEAD@{1}

下次发现自己不在任何分支时,请使用git branch newbranchgit checkout -b newbranch

【讨论】:

  • 谢谢。但是,当我这样做时,我遇到了两个冲突(都不是在我的文件上,在 Xcode 文件上)。无论如何我可以用新版本覆盖当前版本吗?
  • 另外,感谢您下次的建议。但是,如果我不想创建新分支怎么办?
  • @Lenny:要覆盖,请使用git reset --hard/--keep。您可以在恢复更改后删除新分支,如果您真的不想创建,请移动主分支(git resetgit branch -f
  • 我仍然遇到冲突。运行 git reset ( 使用 --hard 和 --keep ) 工作正常,但是当我合并时我仍然遇到冲突。另外,感谢分支提示,下次我会记住这一点。
  • @Lenny:当你将分支重置为“丢失”的提交时,你不需要合并(即使你这样做了,git 应该告诉你»一切都是最新的«)。对于 git 新手来说,更容易在丢失的提交上创建一个新分支并检查所有内容是否真的存在(gitkgit log -p)。验证此点后,您可以随时重置主分支并删除临时 ›recovery‹ 分支
【解决方案2】:

使用git reflog,获取新提交的sha(或者您可以使用HEAD@{1}等格式引用它)并使用git cherry-pickgit merge等将提交引入master。

【讨论】:

    猜你喜欢
    • 2020-09-21
    • 2021-12-26
    • 2011-12-19
    • 1970-01-01
    相关资源
    最近更新 更多