【问题标题】:Going back to last commit after soft reset and amend软重置和修改后返回上次提交
【发布时间】:2016-05-11 08:40:48
【问题描述】:

我有 2 次提交(本地),我的历史是:A - B

  • 在提交 A 中,文件 myfile_v1.txt
  • 在提交 B 中,有多个其他文件。
  • 在我的工作目录中,我更新了第一次提交的文件并稍作修正:myfile_v2.txt

我想修改提交 A 并以新形式替换文件,以便在推送任何内容之前有一个干净的历史记录。

我这样做了:

  • reset --soft上A
  • add myfile_v2.txt
  • commit --amend

现在我可以看到我的提交 A 中有更正的文件,但我不知道如何返回到我以前的 HEAD,也不知道如果不再次提交 B 是否可行。

有什么想法吗?

【问题讨论】:

    标签: git git-reset git-amend


    【解决方案1】:

    提交哈希包含此提交的完整历史记录。因此,如果您更改历史记录,则历史记录不再属于该提交,但必须重新创建该提交。

    有很多方法可以做到这一点。在您的情况下,您可以只使用 cherry-pick B ,一切都很好。

    我会如何做到这一点是一个交互式变基 (rebase -i)。首先进行交互式变基,将A 的节更改为edit,然后进行提交修改,然后继续变基。或者,首先在B 之上创建一个新提交,然后使用rebase -i 重新排序并使用squashfixup 进行第二次提交。甚至使用 auto-fixup 或 auto-squash。

    【讨论】:

    • 谢谢!我不知道cherry-pick 命令,非常有用!下次我会尝试你的其他解决方案。
    【解决方案2】:

    您不能修改之前的提交。每个提交都是唯一的。

    你可以做的是用新的提交重新创建历史。使用命令git-rebase

    我知道你现在处于这一点:

    Pre_A - A - B
          \
           A1
    

    您丢失了“B”提交。要恢复提交,请使用 git-reflog

    git reflog
    

    你会看到分支HEAD的最新位置。其中之一是 B 提交。写下行首的 Hash。示例:

    git reflog
      a123b Ammend Commit of Previous A that generates A1 commit
      b234c git reset soft to A Commit
      c345d B Commit
      b234c A Commit ##Look that the HASH is the same that the git-reset##
    

    一旦你有了 B Commit 的 HASH。创建一个分支来恢复提交。

    git branch tmpBranch c345d
    

    此时,您需要将此提交放在“A1”的新历史记录中,而不是放在“A”中。你可以使用git-rebase

    我假设您在 master 分支中工作。

    git checkout tmpBranch
    git rebase --onto master tmpBranch~1 tmpBranch
    

    这会重新创建从 tmpBranch 提交到 tmpBranch 提交(在您的情况下只有一个提交,B 提交)在 master(指向 A1 提交)中的一次提交的历史记录。

    【讨论】:

    • 这是一个漫长的过程。赞成推荐使用 reflog,并且在提交处指向临时分支通常是一个有用的技巧,因此这对于恢复大量提交会更好。不过,对于一次提交,简单的挑选会更容易。
    • 我用樱桃挑选解决了它,但感谢您提供有用的信息!
    • 你是对的。这种情况比我的更简单。我专注于 git-reflog 的部分,因为我知道它已经“丢失”了 B 提交。
    • 我同意欢迎您关注git-reflog。它帮助我找到了丢失的提交。
    猜你喜欢
    • 2019-06-21
    • 1970-01-01
    • 2021-09-16
    • 2021-12-31
    • 2012-01-01
    • 2014-02-28
    • 2020-06-25
    • 1970-01-01
    • 2013-11-22
    相关资源
    最近更新 更多