深入理解git checkout
git checkout 具体用法如下
git checkout [-q] [<commit>] [--] <paths> #1
git checkout [<branch>] #2
git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>] #3
用法1的commit是可选项,默认值为暂存区(git reset的默认commit是HEAD),所以git reset常用于重置暂存区,git checkout主要用于覆盖工作区。
第一种用法
不会改变头指针。 如果有commit参数会改变工作区和暂存区。无commit参数只会用暂存区覆盖工作区。
第二种用法
第二种用法会改变头指针。给定branch参数是因为HEAD要切换到另一个分支才能进行跟踪,不然会进入“分离头指针状态”。
省略branch参数则是对工作区进行状态检查。
第三种用法
第三种用法主要是创建和切换分支。新分支从start_point指定的commit开始创建。
示例:
git checkout branch2
1.将HEAD指针指向branch2
2.通过HEAD指针更新暂存区
3.通过暂存区更新工作区。
git checkout
汇总并显示工作区,暂存区和HEAD的差异。相当于git checkout HEAD
git checkout --filename
用暂存区文件替换工作区文件。
git checkout BRANCH --filename
不改变HEAD指向,从branch提交中找出文件并替换暂存区和工作区文件。
git checkout .
将工作区所有文件用暂存区替换。
恢复进度
通过git status -sb
查看当前状态(-b参数 要求git version>= 1.7.2)
git stash
通过git stash来保存进度,通过git stash list来查看保存的进度。git stash pop从最近的进度中回复。
完整的git stash命令如下
git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet][<message>]]
stash工作时,如需要说明,则需要git stash save 'message'
使用参数 --patch
来查看工作区和HEAD之间的差异。
使用-k或--keep-index
参数,在保存进度时不会将暂存区重置。
git stash apply [--index] [<stash>]
与git pop相同,不同点是git apply不会在恢复完毕后删除被恢复的进度。
git stash drop [<stash>]
会删掉这个stash。默认删除最新的stash。
git stash clear
删除保存的所有进度
git stash branch <branchname> <stash>
基于进度创建分支
探秘git stash
git core文件存在于`git --exec-path`
中。也就是/usr/lib/git-core。
ls /usr/lib/git-core
会显示git所有子程序。在较早期的git版本,所有git子程序都保存在可运行目录中,用git-<cmd>
调用。而较新的git使用了命令行git <cmd>
。
git stash是用引用变更和git reflog来实现的。
git reflog show refs/stash
会显示stash记录
stash@{n}
,是
refs/stash@{n}
的简称。
git基本操作
rm和git rm
使用rm删除工作区文件,不会体现在暂存区中,而用git rm删除工作区文件,会显示在暂存区中
git add -u快速rm
使用rm等命令后,再执行git add -u会把被追踪的文件的增删改都增加到暂存区中。