2014-01-23 45 views
3

这已经有人问过,但不完全。如何返回一些提交,但仍在git中保留提交历史记录?

这是我想知道的。

假设我有如下的提交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迁移过来的,如果我想在颠覆做到这一点,这将是非常容易的。只需查看一下本地工作区的特定先前版本,然后提交即可。现在,你有所有以前的修订,加上新的。

如何在git中完成此操作?

谢谢!

+0

“重新开始”是什么意思?你的意思是从commit1创建一个新的分支并从那里创建新的提交? – Gordolio

回答

4

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

git revert -n commit4 commit3 commit2 commit1 

会得到你的工作树(和索引)回状态在commit 1。之后,git commit将在commit 4之上创建一个新的提交,这会将您的树更改回到commit 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,你没有得到任何的commit2commit3,或commit4。如果你退出feature-I-was-working-on,你会得到那些。

现在,你在分支feature-Im-now-working-on,你做了更多的提交。这些提交不会进入feature-I-was-working-on,但您可以随时返回。

但是,让我们假设您现在想要将commit2,commit3commit4分成feature-Im-now-working-on。这很简单!首先检查出feature-Im-now-working-on,然后运行这个命令:

$ git merge feature-I-was-working-on 

DVCSs比颠覆更为复杂,但他们也更强大。如果你和他们一起工作,而不是与他们一起工作,他们可以让你轻松完成你在Subversion中永远不会想到的事情。

相关问题