如何返回一些提交,但仍然在git中保留提交历史记录?

时间:2014-01-23 05:15:04

标签: git reset

以前有人问这个问题,但不完全是。

这是我想知道的。

假设我有以下提交的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

我来自颠覆,如果我想在颠覆中实现这一点,那将非常容易。只需查看您本地工作区的特定先前修订版,然后提交。现在,您已经拥有了之前的所有修订版本以及新修订版本。

如何在git中完成此操作?

谢谢!

2 个答案:

答案 0 :(得分:4)

可能有其他方式,但这是一个。

git revert -n commit4 commit3 commit2 commit1 

将使您的工作树(和索引)返回commit 1的状态。在此之后,git commit将在commit 4之上创建一个新提交,这会将您的树更改为commit 1处的树。

答案 1 :(得分:2)

作为一名DVCS,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

现在,如果您git checkout 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中从未想过的事情。