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

Ber*_*chi 72 git

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

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

Von*_*onC 122

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

 $ git checkout -b aNewBranch SHA1
Run Code Online (Sandbox Code Playgroud)

SHA1表示要从中继续的提交ID.


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

分支机构

有关更多信息,请参阅Pro Git书籍.


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


Git Wiki上InterfacesFrontendsAndTools页面的"Graphical Interfaces"部分列出了目前Git的各种GUI.


您将看到许多关于Git和SVN之间差异的问题:例如,请参阅我的答案(或者这个答案).
关于Git和SVN之间的根本区别,我最完整的答案是:
"两者中哪一个更好:git或SVN".

  • 在没有新分支的情况下暂时在旧提交中闲逛:`git checkout SHA1`,以后如果你决定保留它:`git checkout -b aNewBranch` (5认同)

cdm*_*dmo 7

这篇文章有几个问题,以下是我的一些答案:

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

git clone REPO_URL
git checkout HEAD~1 // checks out the last commit's first parent
Run Code Online (Sandbox Code Playgroud)

使用~1访问最后一次提交的第一父,并增加数量来获得父母的父母等。更多关于波浪号和插入符号的信息

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

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

git checkout -b NEW_BRANCH_NAME
Run Code Online (Sandbox Code Playgroud)

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

什么是分支?用我自己的话来说,分支只是一种非常简单的枢轴方式。假设您正在一个分支上工作,master并且您想尝试一项实验。简单,公正git checkout -b experiment,您很快就可以在一个安全的地方打破东西。

git 和 svn 有什么不同?

git 是一个分布式版本控制系统。svn 不是。此外,分支(上面提到的)在 git 中更容易。

对于标记,我不知道是否有“一种正确的方式”(有过吗?),但只是探索git tag命令。关于 git 的一件好事是在本地计算机(或任何地方)上克隆您的 repo 的副本是多么容易,并执行您想要的任何操作并查看会发生什么。如果你搞砸了,只需删除目录。所以,你可以git tag在一些测试目录中进行试验,看看你喜欢什么。