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