软重置和修改后返回上次提交

Going back to last commit after soft reset and amend

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

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

我这样做了:

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

有什么想法吗?

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

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

我会怎么做是一个交互式的变基(rebase -i)。首先进行交互式变基,将 A 的节更改为 edit,然后进行提交修改,然后继续变基。或者首先在 B 之上创建一个新提交,然后使用 rebase -i 重新排序,然后使用 squashfixup 第二个提交。甚至使用自动修复或自动压缩。

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

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

我了解到您现在的情况:

Pre_A - A - B
      \
       A1

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

git reflog

您将看到分支的最新位置HEAD。其中之一是 B 提交。记下行开头的哈希值。示例:

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

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