软复位后返回上次提交并修改

时间:2016-05-11 08:40:48

标签: git git-reset amend

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

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

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

我这样做了:

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

现在我可以看到我的提交A中有更正的文件,但是我无法弄清楚如何在我之前的HEAD中返回,如果没有再次提交B,这是可能的。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您无法修改先前的提交。每次提交都是唯一的。

您可以做的是使用新提交重新创建历史记录。使用命令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

获取此信息

我认为你在主分公司工作。

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

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