【问题标题】:Go to a previous commit, make changes and commit as new head转到以前的提交,进行更改并作为新的负责人提交
【发布时间】:2017-06-27 01:41:18
【问题描述】:

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

 HEAD->master A
 9812         B
 4578         C

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

 HEAD->master ModC
 7845         A
 9812         B
 4578         C

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

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

【问题讨论】:

  • 仅当您不需要当前提交更改(在您的情况下恢复提交A)时才会将分支重置为先前的提交。但从您的第二个方案看来,您似乎只想创建一个新的提交,其中包含来自提交 B 的修改更改,并保留提交 A 中的更改。
  • 是的。我想完全实现我在问题中描述的内容。
  • 那么你还需要提交A & B吗?
  • @Eimantas 是的。我不想丢失任何提交。

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


【解决方案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的内容放在磁盘上

【讨论】:

  • 这种方法的缺点是你现在在一次提交中混合了两件事:恢复 A 和 B,然后添加新的更改。这将使审核变得更加困难。
【解决方案2】:

我想让当前工作目录和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.


您也可以使用git reset 使 A 和 B 永远不会发生。 git reset 可用于将分支移动到您想要的任何位置,例如将 master 移回 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.

【讨论】:

  • 谢谢。但是为了确保该解决方案适用于 any 以前的提交,我修改了这个问题。请你看一下好吗?
  • @deshmukh 当你说“我想让当前工作目录与 C 相同”时,你的意思是你想扔掉 A 和 B?
  • 没有。 A 和 B 将保留在 git 中。因此,我可以随时返回 A 或 B。只是工作目录中的所有文件都来自C。
  • @Schwern : 你也可以在提交ModC时使用git commit --amend
  • 另一种方式是:git checkout 4578 . ; # edit files ; git add files; git commit
猜你喜欢
  • 2020-02-01
  • 2012-11-26
  • 2017-07-20
  • 2012-08-15
  • 2011-07-03
  • 2011-06-28
  • 2019-12-27
  • 2013-11-12
相关资源
最近更新 更多