转到上一个提交,进行更改并作为新负责人提交

Go to a previous commit, make changes and commit as new head

这是一个仅限本地的存储库。没有分支机构。日志显示

 HEAD->master A
 9812         B
 4578         C

我想使当前工作目录与 C 相同,编辑一些文件,替换一些二进制文件 (PDF) 并进行新提交,例如 ModC。因此,新日志将是:

 HEAD->master ModC
 7845         A
 9812         B
 4578         C

看起来很简单。但我一直在挣扎,面对各种分支、合并、变基、重置!

实现我想要的目标的可靠、万无一失的方法是什么?

I want to make the current working directory same as C

您可以使用 git revert 恢复 C 之后的更改。

git revert C..HEAD

这将创建一个还原 A 和 B 的新提交。

 HEAD->master Revert A & B
 7845         A
 9812         B
 4578         C

现在工作目录将与 C 中的相同。然后您可以正常进行更改,添加并提交它们。然后你就会有这个。

 HEAD->master ModC
 3847         Revert A & B
 7845         A
 9812         B
 4578         C

You can read more about how to undo changes in the Pro Git book.


你也可以让 A 和 B 永远不会与 git reset 发生。 git reset 可用于将分支移动到您想要的任何位置,例如将 master 移回 C。

git checkout master
git reset --hard C

现在你将拥有这个。

HEAD->master         C

就好像A和B从未发生过一样。现在您可以像往常一样在 C 之上添加和提交您的更改。

有一个更强大的工具,叫做 "interactive rebase" 来扰乱历史,但你也可以用它来搞砸事情。 You can read more about that in the Pro Git book.

这里有一个方法可以实现:

# get content of 'C' commit (without creating any commit yet) :
git checkout 4578 -- .  # <- the '.' is very important. see below

# edit whatever files you want ...

# make regular commit with your new content :
git add <files>
git commit

细微差别:

git checkout 4578

将活动提交设置为 4578 并将提交 4578 的内容放入磁盘

git checkout 4578 .
# or
git checkout 4578 -- .

不触及当前活动提交并将提交4578的内容放在磁盘上