Git:如何克隆第一次提交?

时间:2010-06-22 12:13:04

标签: git

有人能告诉我如何克隆第一次提交吗?我不想删除最近的提交,只需制作初始状态的克隆副本,这样我就可以获取一些文件。

5 个答案:

答案 0 :(得分:14)

更新2018答案:使用您自己的符号引用,即。标签。并开始使用describe和带注释的标签。

git tag -a -m "Initial version" root $( git rev-list --all | tail -n 1 )
git describe

自2011年以来从未收到过标记但偶尔承诺使用以上标记的回购的输出描述:

root-1090-g88a80e93

如果你想放弃所有其他历史,我从来没有 需要的是,复制初始集很容易。如果你想引用原始的“root”提交和邮票,我可以看到用例。也许看看如何ie。 BFG工作,--depth或GIT 2.19新clone --filter。 [3]


我想我想做同样的事情。签出初始提交,然后从那里进行分支。我不确定接受了答案。但我想它可以(部分)满足原始问题。在阅读完这个主题之后,我将使用一些bash脚本来进行

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

我希望会有一些提交或树形参考。也许列出标记为root的节点,但我认为GIT本身并不跟踪这个。因此,此方法仅适用于只有一个根提交的存储库。

2017年和2018年的更新是git log有一个更好的选择,使用git rev-list但遭遇同样的问题。他们只是使用提交列表的尾随项目。

对于只有一个带有以下内容的存储库,您可以签出“root commit”,它适用于大多数存储库。但这是一个hack,最好检查一下系统为什么以及在哪里标记root提交。只需标记或记录即可。

您可以使用以下命令在一个repo中检出第一次提交:

git checkout $( git rev-list --all | tail -n 1 )

或(GIT <1.8.1):

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

请参阅git-revlist以及Using git, how do I go back to first commit then go through the history?

[3]:

答案 1 :(得分:12)

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

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

这将获得当前HEAD的“初始提交”。如果列出,则使用master,或任何其他子修订规范。将其包装在$(...)中以便在表达式中使用它,例如:

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

答案 2 :(得分:9)

要回答我认为你想问的问题:

您可以使用以下命令将整个存储库置于第一次提交的状态:

git checkout <commit SHA1>

在你搞砸了之后,你可以git checkout master回到原来的位置。

您可以使用以下命令从第一次提交中获取单个文件的状态:

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

再一次,在你完成之后,你可以git checkout master <file or directory>回到原来的位置。

没有必要“克隆”一个提交(我假设你的意思是克隆存储库,并检查第一次提交?)。当然,如果由于某种原因你不能修改你的存储库中的任何文件(例如,不想让你的构建过期)你当然可以克隆它,然后在克隆的repo中做同样的事情

答案 3 :(得分:0)

使用命令:

git fetch --depth=1 ../testrepo/.git $SHA1

这只会克隆特定的提交。您可以查看此answer以获得更多详细信息。

答案 4 :(得分:-1)

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

如果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