2010-06-22 114 views
12

任何人都可以告诉我如何克隆第一次提交?我不想删除最近的提交,只需制作初始状态的克隆副本,以便我可以获取一些文件。Git:如何克隆第一次提交?

+0

一个Git仓库可以有多个“第一提交” – knittl 2010-06-22 12:14:00

+8

好了,你们这些家伙,不要对第一这样的臭承诺的事情。总是有至少一个根提交,并且存在多个提交是非常罕见的,特别是在用户的存储库中提出这样的基本问题。 – Cascabel 2010-06-22 13:39:48

回答

9

要回答我想你的意思是问这样的问题:

你可以得到你的整个仓库进的状态首先与承诺:

git checkout <commit SHA1> 

大功告成瞎搞后,可以做git checkout master回到原来的位置。

而且你可以从第一个获得单独的文件到他们的状态与承诺:

git checkout <commit SHA1> <file or directory> ... 

同样,大功告成后,你可以做git checkout master <file or directory>要回原来的位置。

有没有必要“克隆”一个提交(我认为你的意思是克隆存储库,并检查第一次提交?)。当然,如果由于某种原因你无法忍受修改仓库中的任何文件(例如,不想让你的版本过时),你当然可以克隆它,然后在克隆的回购中做同样的事情。

-1

我认为你所需要做的就是从你想要的原始提交中创建一个新的分支,检查出来,然后合并回你正在工作的分支的头部。

如果abcxyz ......是的,你要和你的主分支工作提交SHA1,这通常是你想要做什么:

git branch oldskool abcxyz... # creates a new branch called oldskool from the commit 
git checkout oldskool 
#make changes 
git rebase master #bring the oldskool branch up to the HEAD of the master branch (shouldn't overwrite the changes in the files you edited) 
git checkout master 
git merge oldskool 
+0

你正在创建master的祖先,所以rebase只是快速转发它,然后合并是一个no-op。没有改变主人。如果你跳过rebase,合并也将是一个快进,并且再次,不改变主人。 – Cascabel 2010-06-22 15:00:51

14

我觉得我要做同样的事。检出初始提交,并从那里分支。我不确定接受的答案。但我想它可以(部分)满足原始问题。阅读此线程后,我无论如何都与一些的bash脚本四处

git log --pretty=oneline master | tail -1 

我猜我希望会有一些这方面的commit-或树十岁上下的参考。

因此,你可以检出先用下面的命令提交:

git checkout `git log --pretty=oneline | tail -1 | sed 's/ .*$//'` 

2017年更新:由于'12(GIT 1.8.1),我们有一个更好的选择:git rev-list。请参阅此处的其他答案或KyleMit at superuser以获得更好的脚本编写方法。

+3

如果您使用'git rev-list --all'而不是'git log --pretty = oneline master',那么您不必解析提交消息,因为它只返回shas。看到我的回答[使用git,我该如何回到第一次提交](http://superuser.com/a/773366/180163) – KyleMit 2014-06-25 15:54:50

11

如果通过“第一次提交”,你的意思是没有任何父母本身的分支的父提交,那么你想使用git-rev-list来做到这一点。只需使用

git rev-list --max-parents=0 HEAD

这将让你的“初始提交”当前HEAD。如果列出,或使用其他任何子版本规范,请使用主文件。包裹在$(...)为了使用表达式中的,如:

git checkout $(git rev-list --max-parents=0 HEAD)

+2

谢谢,这是覆盖一般情况没有中间复制/粘贴步骤。 – 2014-03-23 17:00:11

+0

谢谢修复杰西! – 2014-03-31 20:46:06