图解 Git

发布日期:2019-07-23 19:42:34 阅读数: 923次 来源: 作者:

根基用法

亚博手机app

上面的四条号令在工作目次、暂存目次(也叫做索引)和仓库之间复制文件。

  • git add files 把当前文件放入暂存区域。
  • git commit 给暂存区域生成快照并提交。
  • git reset -- files 用来撤销最初一次git add files,你也能够用git reset 撤销所有暂存区域文件。
  • git checkout -- files 把文件从暂存区域复制到工作目次,用来丢弃当地点窜。

你能够用 git reset -pgit checkout -p, or git add -p进入交互模式。

也能够跳过暂存区域间接从仓库取出文件或者间接提交接码。

亚博手机app

  • git commit -a 相当于运转 git add 把所有当前目次下的文件插手暂存区域再运转。git commit.
  • git commit files 进行一次包含最初一次提交加上工作目次中文件快照的提交。而且文件被添加到暂存区域。
  • git checkout HEAD -- files 回滚到复制最初一次提交。

商定

后文中以下面的形式利用图片。

亚博手机app

绿色的5位字符暗示提交的ID,别离指向父节点。分支用橘色显示,别离指向特定的提交。当前分支由附在其上的HEAD标识。 这张图片里显示最初5次提交,ed489是最新提交。 master分支指向此次提交,另一个maint分支指向祖父提交节点。

号令详解

Diff

有很多种方式查看两次提交之间的变更。下面是一些示例。

亚博手机app

Commit

提交时,git用暂存区域的文件建立一个新的提交,并把此时的节点设为父节点。然后把当前分支指向新的提交节点。下图中,当前分支是master。 在运转号令之前,master指向ed489,提交后,m亚博手机appaster指向新的节点f0cec并以ed489作为父节点。

亚博手机app

即便当前分支是某次提交的祖父节点,git会同样操作。下图中,在master分支的祖父节点maint分支进行一次提交,生成了1800b。 如许,maint分支就不再是master分支的祖父节点。此时归并(或者衍合) 是必需的。

亚博手机app

若是想更改一次提交,利用 git commit --amend。git会利用与当前提交不异的父节点进行一次新提交,旧的提交会被打消。 亚博手机app

另一个例子是分手HEAD提交,后文讲。

Checkout

checkout号令用于从汗青提交(或者暂存区域)中拷贝文件到工作目次,也可用于切换分支。

当给定某个文件名(或者打开-p选项,或者文件名和-p选项同时打开)时,git会从指定的提交中拷贝文件到暂存区域和工作目次。好比,git checkout HEAD~ foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c复制到工作目次而且加到暂存区域中。(若是号令中没有指定提交节点,则会从暂存区域中拷贝内容。)留意当前分支不会发生变化。

亚博手机app

当不指定文件名,而是给出一个(当地)分支时,那么HEAD标识会挪动到阿谁分支(也就是说,我们"切换"到阿谁分支了),然后暂存区域和工作目次中的内容会和HEAD对应的提交节点分歧。新提交节点(下图中的a47c3)中的所有文件城市被复制(到暂存区域和工作目次中);只具有于老的提交节点(ed489)中的文件会被删除;不属于上述两者的文件会被忽略,不受影响。

亚博手机app

若是既没有指定文件名,也没有指定分支名,而是一个标签、近程分支、SHA-1值或者是像master~3雷同的工具,就获得一个匿名分支,称作detached HEAD(被分手的HEAD标识)。如许能够很便利地在汗青版本之间互相切换。好比说你想要编译1.6.6.1版本的git,你能够运转git checkout v1.6.6.1(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,好比说git checkout master。然而,当提交操作涉和到"分手的HEAD"时,其行为会略有分歧,详情见鄙人面。

亚博手机app

HEAD标识处于分手形态时的提交操作

HEAD处于分手形态(不依靠于任一分支)时,提交操作能够一般进行,可是不会更新任何已定名的分支。(你能够认为这是在更新一个匿名分支。)

亚博手机app

一旦此后你切换到此外分支,好比说master,那么这个提交节点(可能)再也不会被援用到,然后就会被丢弃掉了。留意这个号令之后就不会有工具援用2eecb

亚博手机app

可是,若是你想保留这个形态,能够用号令git checkout -b name来建立一个新的分支。

亚博手机app

Reset

reset 号令把当前分支指向另一个位置,而且有选择的变更工作目次和索引。也用来在从汗青仓库中复制文件到索引,而不动工作目次。

若是不给选项,那么当前分支指向到阿谁提交。若是用--hard选项,那么工作目次也更新,若是用--soft选项,那么都不变。

亚博手机app

若是没有给出提交点的版本号,那么默认用HEAD。如许,分支指向不变,可是索引会回滚到最初一次提交,若是用--hard选项,工作目次也同样。

亚博手机app

若是给了文件名(或者 -p选项), 那么工作结果和带文件名的 heckout 差不多,除了索引被更新。

亚博手机app

Merge

merge 号令把分歧分支归并起来。归并前,索引必需和当前提交不异。若是另一个分支是当前提交的祖父节点,那么归并号令将什么也不做。 另一种环境是若是当前提交是另一个分支的祖父节点,就导致fast-forward归并。指向只是简单的挪动,并生成一个新的提交。

亚博手机app

不然就是一次真正的归并。默认把当前提交(ed489 如下所示)和另一个提交(33104)以和他们的配合祖父节点(b325c)进行一次三方归并。成果是先保留当前目次和索引,然后和父节点33104一路做一次新提交。

亚博手机app

Cherry Pick

cherry-pick号令"复制"一个提交节点并在当前分支做一次完全一样的新提交。

亚博手机app

Rebase

衍合是归并号令的另一种选择。归并把两个父分支归并进行一次提交,提交汗青不是线性的。衍合在当前分支上重演另一个分支的汗青,提交汗青是线性的。 素质上,这是线性化的主动的 cherry-pick

亚博手机app

上面的号令都在topic分支中进行,而不是master分支,在master分支上重演,而且把分支指向新的节点。留意旧提交没有被援用,将被收受接管。

要限制回滚范畴,利用--onto选项。下面的号令在master分支上重演当前分支从169a6以来的比来几个提交,即2c33a

亚博手机app

同样有git rebase --interactive让你更便利的完成一些复杂操作,好比丢弃、重排、点窜、归并提交。没有图片表现这些,细节看这里:git-rebase(1)

手艺申明

文件内容并没有真正存储在索引(.git/index)或者提交对象中,而是以blob的形式别离存储在数据库中(.git/objects),并用SHA-1值来校验。 索引文件用识别码列出相关的blob文件以和此外数据。对于提交来说,以树(tree)的形式存储,同样用对于的哈希值识别。树对应着工作目次中的文件夹,树中包含的 树或者blob对象对应着响应的子目次和文件。每次提交都存储下它的上一级树的识别码。

若是用detached HEAD提交,那么最初一次提交会被the reflog for HEAD援用。可是过一段时间就失效,最终被收受接管,与git commit --amend或者git rebase很像。

本文由亚博手机app编辑整理亚博手机app