Github 版本控制总共由三部分组成 : 工作区 、暂存区(index) 和 版本库(暂存区可以理解为包含在版本库内)。
Git 之所以叫分布式版本控制系统,和 SVN的集中式版本控制不同之处是:Github在本地也有版本库,①提交(commit)直接保存在本地,要保存在远程端再用②推送(push),svn没由①步骤,所以在无网络的情况下是不能进行版本控制的。
1. cat-file 命令只用于版本库对象
git cat-file -t ID 输出ID类型(blob/tree...)git cat-file -p ID 输出ID所指向对象的内容
git cat-file commit/blob和-p HEAD/HEAD:filename
2. 可查看哈希值用法:git rev-parse HEAD:filename , git ls-files , git ls-tree -l HEAD.
3. 查看所有 commit 记录:git log --pretty=raw --graph HEAD.
git log --pretty=oneline
HEAD^ 代表父提交(HEAD^^/HEAD^number/HEAD~number),
HEAD^{tree} HEAD版本对应的tree,HEAD^^{tree}HEAD的父提交对应的tree 。
工作区 和 暂存区 都将被更新为ID所指向的版本
git reset HEAD
暂存区更新,工作区不受影响
5. git reflog show master 操作.git/log/refs/heads/master,针对log操作。
恢复被 reset 的更改,可根据reflog的输出,再次git reset --hard master@{x}.
6. git add filename 反向操作 :git checkout -- filename 或 git reset HEAD filename,但两者操作结果不一样。
7. git stash 保存进度的时候,工作区和暂存区都会修改成和版本库一模一样,然后将与最新commit的不同保存在.git/log/refs/stash中,
git stash pop/list/apply... 从stash 中恢复。
8. 本地没有被版本库控制的文件不能够保存进度。
9. git branch new-branchname 时,新的分支基于头指针HEAD创建,删除:git branch -d branchname。
10. ①git checkout -b new-branchname [<start_point>]= git branch new-branchename + git checkout new-branchname
start_point 可以是tag 或者 commit 。。。
②git checkout . 或 git checkout -- <file>
会用暂存区全部文件 或 部分文件替代工作区文件
③git checkout HEAD . 或 git checkout HEAD <file>
会用HEAD所指向的master分支中的全部或者部分文件替代暂存区和工作区的文件
(注意和git reset --hard HEAD 的区别)
11. git cherry 查看本地版本库比远程版本库领先的提交。
12. 除了以.git/refs/heads/ 为前缀的引用之外,如果检出任何其他引用,都将使工作区处于分离头指针状态。
(远程版本库操作remote)
13. git remote add new-remote url 注册新远程版本库,可查看.git/config(origin)。
14. git remote update 所有远程版本库更新。
15. git remote rm remote-name.
16. 对于新建立的本地分支(没有建立和远程分支的追踪),执行git push 命令是不会推送到远程版本库中的,
可通过git push <remote> <new-branch>;相应地,git pull也不会将新分支合并到本地,因为没有追踪,要用参数。
17. git push 命令推送时不会将里程碑推送到远程版本库,git fetch 则会将远程里程碑获取到本地版本库,可用-n/--no-tags不获取。
18. git remote add --no-tags remote-name url,避免远程版本库的里程碑引入本地版本库。
19. git diff 比较工作区和提交暂存区(stage)
git diff HEAD 工作区和HEAD(当前工作分支)比较
git diff --cached/--staged 提交暂存区和HEAD(版本库)比较
20. git status -s
第一列 是暂存区和版本库的比较
第二列 是暂存区和工作区的比较
21. git ls-tree -l HEAD (只能针对版本库对象)查看版本库目录树 (-l 输出文件大小)
22. git ls-files -s 显示暂存区的目录树(第三个字段是暂存区编号)
23. git clean -fd 清楚当前工作区中没有加入版本库的文件和目录(非跟踪文件和目录)
24. git write-tree 将暂存区的目录树写入git对象库,然后可用git ls-tree查看目录树
25. git rm --cached <file>
删除暂存区的文件,其他区域不受影响
每一个commit有父commit,彼此间的联系,每个commit都有一个对象,而每个提交(commit)都有一个tree,tree的ID指向了包含文件的目录,每个被提交过的文件(blob)也有ID。
git status -s
第一列是暂存区和版本库的之间的差异
第二列是工作区和暂存区之间的差异