【问题标题】:Undoing checkout in GIT在 GIT 中撤消结帐
【发布时间】:2009-08-30 09:36:45
【问题描述】:

使用 MSYSGIT 历史浏览器,我签出了一个特定的提交。 这是一个错误 - 我试图查看文件并认为我必须检查它们才能看到它们。

从那时起,我一直无法将任何提交推送到我的远程仓库(在 GITHub 上)。我有点理解,虽然不完全。 [我承认不完全理解结帐的工作原理,请对菜鸟温柔。]

我如何撤消结帐并让物品恢复到之前的状态?

如果我右键单击“签出”提交,我可以选择“删除此分支”。那会删除该提交的文件[坏]还是只是撤消签出?我是不是找错树了?

【问题讨论】:

    标签: git msysgit


    【解决方案1】:

    我的理解是,您不小心签出了较早的提交,然后在您想要保留的内容之上进行了新的提交。首先,确保你有一个指向你当前工作的指针:

    git checkout -b newbranch
    

    然后,检查你之前的位置:

    git checkout master
    

    希望这会让你回到你的主线分支,你可以像往常一样推送到 GitHub。如果您想提取所做的更改,则可以合并并(一旦您满意)删除临时分支:

    git merge newbranch
    git branch -d newbranch
    

    【讨论】:

    • 如果不想合并整个newbranch,也可以git cherry-pick single commits。
    • 此外,如果其他人已将提交添加到远程 master,您将无法将 master 推送到远程。在这种情况下,执行“git pull”,然后“git push”应该可以工作。
    • 干得好!做到了! [即使问题不是很清楚。] 我仍然很好奇:如果我在 msysgit 历史浏览器中按下“删除这个分支”会发生什么?它会删除文件吗?甚至是在该文件之后进行的所有提交?
    • 它可能会删除您所在的分支(master?),因此任何仅由该分支引用的提交。它可能会让 HEAD 指向同一个提交,但是一旦你做了一些移动该指针的操作,就不会引用这些提交,并且它们最终会被修剪。不过,您仍然可以从远程仓库中提取另一个副本。
    【解决方案2】:

    在 C++ 术语中,分支基本上是一个指针。

    您可能想尝试移动您的分支以指向不同的提交。为此使用git reset

    git checkout mybranch
    git reset mypreviouscommit
    

    这不会删除提交,但它确实使mybranch“指向”mypreviouscommit。所以,mypreviouscommit 上的任何东西都会在master 上出现。

    【讨论】:

    • 为了验证我是否正确理解这一点 - 签出的提交是 2e968f,此后我添加了另一个提交 2a45b0。我现在执行“git reset 2e968f”,我应该像之前搞砸一样,没有签出提交,并且 2a45b0 是最新的常规提交。
    • 尝试重置时出错。致命:无法解析对象“2e968fd7bf2018680856316e3133c610284d9619”。请帮忙。
    【解决方案3】:

    如果您不介意丢失自上次拉取到 Github 以来所做的所有更改,您可以简单地删除您的目录并

    git clone ...
    

    在一个新鲜的,新的。

    【讨论】:

    • 我确实介意丢失我的其他提交,但这是一个需要牢记的想法。顺便说一句,我发现这种态度在 GIT 中很常见(例如,我今天遇到了这样的评论:“有趣,从未遇到过这个问题,因为我会定期从 master 重新创建我的 fork。对,这是很多工作,特别是如果你有很多贡献,但是嘿......” [这不是对使用 GIT 不切实际的一个非常可悲的反映吗?!]
    猜你喜欢
    • 2011-04-05
    • 2015-11-25
    • 1970-01-01
    • 2011-12-07
    • 2012-03-17
    • 2014-10-01
    相关资源
    最近更新 更多