如何在Git中回退几个提交,但仍保留提交历史记录?

4

这个问题之前有过类似的问答,但并不完全一样。

我想知道以下内容:

假设我拥有一个包含以下提交的 Git 存储库:

$ git log
commit4
commit3
commit2
commit1

我现在意识到我需要把提交1重新放回我的工作空间并“重新开始”。我可以这样做:

$ git reset --hard commit1

这将实现我的目标,但如果我再次查看日志:
$ git log
commit1

只有第一个提交显示出来。我真正想看到的是这样的:
$ git log
commit5-same-as-commit1
commit4
commit3
commit2
commit1

我来自subversion,如果我想在subversion中完成这个操作,那将非常容易。只需将特定的先前版本检出到本地工作区,然后提交即可。现在,您拥有了所有以前的修订版本以及新的修订版本。

我如何使用Git完成此操作?

谢谢!


“重新开始”是什么意思?您是指从提交1创建一个新分支,并从那里创建新的提交吗? - Gordolio
2个回答

4

可能还有其他方法,但这是其中之一。

git revert -n commit4 commit3 commit2 commit1 

此操作会将您的工作树(和索引)恢复到commit 1的状态。在此之后,git commit将在commit 4的基础上创建一个新的提交,该提交将使您的树恢复到commit 1时的状态。


2
作为一个分布式版本控制系统,Git不强制要求线性开发,而是一个有向图。如果您想保存其他提交记录,这里是我会做的事情:
$ git branch feature-I-was-working-on commit4

这将创建一个名为feature-I-was-working-on的分支,并将其指向commit4。这样,您可以将此分支放在一边,并稍后回来使用它。

$ git checkout commit1

这将使您的工作文件与提交commit1之后相同。
$ git checkout -b feature-Im-now-working-on

这将创建一个名为feature-Im-now-working-on的新分支,并将其指向当前提交(如果您一直在跟进,那就是commit1)。
现在,如果您切换到feature-Im-now-working-on,您不会得到commit2commit3commit4。如果您检查feature-I-was-working-on,您会得到这些内容。
现在,您在分支feature-Im-now-working-on上,并进行了更多提交。这些提交不会进入feature-I-was-working-on,但您随时可以返回它。
但假设现在您想将commit2commit3commit4合并到feature-Im-now-working-on中。这很简单!首先,检出feature-Im-now-working-on,然后运行此命令:
$ git merge feature-I-was-working-on

DVCS(分布式版本控制系统)比Subversion更加复杂,但它们也更加强大。如果你与它们合作而不是对抗它们,它们可以让你轻松地做出在Subversion中想都不敢想的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接