如何克隆一个旧的git-commit(还有一些关于git的问题)

时间:2009-10-31 19:32:06

标签: git

我有一个我的项目的git-repository,大约有20个提交。我知道如何使用git clone克隆实际提交,

  • 但是如何“克隆”旧提交?
  • 有一个非常好的git-GUI(imho qgit不是一个好的GUI)?
  • 究竟是什么“分支”?
  • 当我想发布0.1,0.2等时,在git中标记这些提交的最佳方法是什么?
  • 与svn有什么大不同?

2 个答案:

答案 0 :(得分:121)

git存储库始终包含所有历史记录 因此,当您克隆存储库时,您将使用其完整历史记录克隆它,然后然后,您可以根据所需的任何提交创建分支:

 $ git checkout -b aNewBranch SHA1

使用SHA1表示您要从中继续的提交ID。


Git中的分支只是跟踪DAG (Directed Acyclic Graph)的一条路径的一种方式,Pro Git是表示Git存储库历史记录的提交集。
它只是指向其中一个提交的指针,并且会随着每个新提交而继续移动。

branches

有关详情,请参阅a tag一书。


你可以用InterfacesFrontendsAndTools标记一个特定的提交,它像一个分支一样只是一个指针,但是一个不可变的指针(当你进行新的提交时它不会移动)。
您最好使用带注释的标记,这些标记作为完整对象存储在Git数据库中。他们是校验和的;包含标记器名称,电子邮件和日期;有标记消息;并且可以使用GNU Privacy Guard(GPG)进行签名和验证。


Git Wiki上my answer页面的“图形界面”部分列出了目前Git的各种GUI。


您会看到很多关于Git和SVN之间差异的问题:例如,请参阅this one(或"which of the two is better:git or SVN")。 关于Git和SVN之间的根本区别,我最完整的答案是: {{3}}

答案 1 :(得分:4)

这篇文章中有几个问题,这是我对一些答案的看法:

首先,要“克隆”先前的提交,您可以执行以下操作:

git clone REPO_URL
git checkout HEAD~1 // checks out the last commit's first parent

使用~1访问最后一个提交的第一个父级,并增加该数字以获取父级的父级,依此类推。 More on tilde and caret notation

上面的两个命令将使您处于分离的HEAD状态,根据上下文,这可能是重要的,也可能不重要。例如,如果您将克隆作为部署脚本的一部分进行克隆并且您所关心的只是访问先前的提交(例如,作为回滚策略的一部分),则这一点并不重要。

如果你需要从历史的这一点开始工作,你可以运行

git checkout -b NEW_BRANCH_NAME

一个好的git GUI?对我来说SourceTree是最好的。

什么是分支机构?用我自己的话说,分支只是一种非常简单的转向方式。假设您正在使用一个分支master,并且您想尝试实验。很容易,只需git checkout -b experiment,你很快就可以在一个安全的地方打破东西。

git和svn之间有什么不同?

git是distribute version control system。 svn不是。另外,git中的分支(如上所述)更容易。

对于标记,我不知道是否有“One True Way”(有没有?)但只是探索git tag命令。关于git的一个好处是在本地计算机(或任何地方)克隆你的repo副本是多么容易,并且做你想做的任何事情,看看会发生什么。如果你搞砸了,只需删除目录。因此,您可以在某个测试目录中试验git tag并查看您喜欢的内容。