转到上一个提交,进行更改并提交为新头

时间:2017-02-09 06:48:58

标签: git git-rebase git-commit git-reset git-revert

它是仅限本地的存储库。没有分支。日志显示

 HEAD->master A
 9812         B
 4578         C

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

 HEAD->master ModC
 7845         A
 9812         B
 4578         C

似乎很简单。但我一直在努力,面对各种各样的分支,合并,重组,重置!

达到我想要的目标是什么?这是一种确定的,万无一失的方式?

2 个答案:

答案 0 :(得分:1)

  

我想让当前的工作目录与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 resetgit reset可用于将分支移动到您想要的任何位置,例如将主分支移回C.

git checkout master
git reset --hard C

现在你有了这个。

HEAD->master         C

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

有一个更强大的工具称为“交互式反叛”,以摧毁历史,但你也可以真正搞砸了。 You can read more about that in the Pro Git book

答案 1 :(得分:1)

以下是实现这一目标的方法:

# 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的内容放在磁盘上