Git step by step 9 之checkout

在介绍checkout之前,必须要先介绍分支(git的分支模型)
用下面的图1可以不严谨但简易地说明分支是个什么东西:

图中有两个分支,分别命名为master和new branch。
一般情况下,新创建的git,只要进行了提交,会自动生成名为master的分支。
图中的HEAD(固有的一个类似于指针的东西)始终指向的是你目前处于的分支的最新提交上。(此图中,HEAD就指向了master分支的最新提交commit 4上)
这个图可能是这样生成的:
首先是进行了提交commit 1;
然后进行了提交commit 2,在这个地方,你发现之后的工作可能有两种方法可以实现,所以你新创建了一个分支new branch(即,git branch new_branch,虽然master分支与new_branch的最新提交都是commit 2,但是HEAD还是指向master分支的最新提交上,因为你没有手动切换到new_branch这个分支上);
再然后就是继续进行commit 3,由于HEAD指向的是master分支的最新提交上,所以现在走的依然是master这条分支的线,所以进行commit 3之后,HEAD指向了commit 3;
接着进行commit 4。
你还没有将master分支进行完,你发现这种方法有点繁琐,所以想用另一种方法,所以进行了分支切换,即, git checkout new_branch,此刻HEAD指向了new_branch分支的最新提交(即commit 2),
紧提前又进行了提交commit 3’,
然后又提交commit 4’,你发现这种方法行不通,于是又切换到master分支上,即 git checkout master,进行繁琐的操作,此时HEAD指向了commit 4。

git checkout基本介绍
从上面对图1的解释,就可以发现git checkout的一个重要的作用,即切换分支(实际上是改变HEAD的指向)。它还有恢复文件的功能,以及检查工作目录、暂存区与HEAD指向的分支的最新的一次提交的差异。

1、切换分支
git checkout <branch>

这个就是切换分支,当然需要注意的是切换分支后,工作目录、暂存区的内容会与该分支最新的一次提交保持一致。
这一点有点像git reset --hard <commit>,较容易弄混,但git reset相当于版本回退,不容易恢复,而git checkout <branch>只是切换到了另一个开发方法的路径上去,很容易再切换回来。

另外,当你想切换到某个commit处,但这个commit处没有分支,那么可以用 git checkout <commitX> ,此刻HEAD只是指向了这个commitX(处于分离头指针的状态--这个概念不用太理解,就是HEAD指向了一个地方,这个地方不能用一个分支名来定位它),在此处再进行提交commitY,然后再切换到别的分支时,你做的那个commitY就找不到了,所以要想使这个commitY在切换分支以后还可以看到,那么要先在此处建立一个分支,即 git branch new_branch, 这个new_branch的最新提交就是<commitX>,然后用 git checkout new_branch ,即切换到新建的分支new_branch上,然后再进行提交commitY。

上面的
git checkout <commitX>
git branch new_branch
git checkout new_branch

其实可以简化为一句
git checkout <commitX> -b new_branch

或者
git checkout -b new_branch <commitX>

即可切换到commitX处并新建分支。

2、检查差异
git checkout 或
git checkout HEAD

是检查工作目录、暂存区与HEAD指向的commit的差异。

3、恢复文件(这个感觉有点绕)
恢复文件包含两个可能性,一是恢复恢复暂存区中的文件到工作目录中,二是恢复某一分支的文件到暂存区以及工作目录,即下图


图中显示
git checkout branch -- filename 或
git checkout branch . // 注意这里有个点

以及
git checkout -- filename 或
git checkout . // 注意这里有个点

前者将某一分支的某个文件(filename指定的文件)或全部文件(用.——点指定)都恢复到暂存区以及工作目录;
后者是将暂存区中的全部文件恢复到工作目录中。

此处要特别注意的是
1、若工作目录(或暂存区)没有某文件,那么恢复后会创建该文件;
2、若工作目录(或暂存区)有要被恢复的文件,但内容不一致(即修改了),那么文件内容会被恢复;
3、若工作目录(或暂存区)有个额外新添加的文件,那么这个文件不会被删除。


more:
git checkout之二 切换到分支和文件覆盖

猜你喜欢

转载自songkang666.iteye.com/blog/1846461
今日推荐