1

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

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

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

我这样做了:

  • reset --soft在一个
  • add myfile_v2.txt
  • commit --amend

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

有任何想法吗?

4

2 回答 2

1

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

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

我会怎么做是一个交互式的变基(rebase -i)。首先进行交互式变基,将节更改Aedit,然后进行提交修改,然后继续变基。或者,首先在顶部创建一个新提交B,然后用于rebase -i重新排序和squash/或fixup第二个提交。甚至使用 auto-fixup 或 auto-squash。

于 2016-05-11T08:50:37.780 回答
1

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

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

I understand that you are in this point now:

Pre_A - A - B
      \
       A1

You have lost your "B" Commit. To recover the commit use git-reflog

git reflog

You will see the latest position of the branch HEAD. One of them is the B commit. Write down the Hash of the beginning of the line. Example:

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##

Once you have the HASH of the B Commit. Create a branch to recover the commit.

git branch tmpBranch c345d

At this point, what you need is to put this commit in the new history of "A1" instead of being in "A". You get this using git-rebase

I assumpt that you were working in your master branch.

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

This recreate the history from one commit backward of tmpBranch commit until tmpBranch commit (in your case only one commit, The B commit) in master (that points to A1 commit).

于 2016-05-11T09:10:46.590 回答