Git Command
0. Basic
部分内容引用自一个非常好的git教程backlog
a. HEAD索引
HEAD指向当前分支的最后一次commit。通过移动HEAD,就可以变更使用的分支。
图中HEAD~指定HEAD之前的第几次提交记录。HEAD^指定使用哪个父节点
b. Git Stash
还未提交的修改留在索引区或工作树的情况下:
切换分支时修改内容会随身带到目标分支,可以add并commit;
但如果在checkout的目标分支中相同的文件也有后来的修改(即hash值不同),checkout会失败。这时要么先提交commit修改内容,要么用stash暂时保存修改内容后再checkout。
stash是临时保存文件修改内容的区域。可以暂时保存工作树和索引里还没提交的修改内容,可以事后再取出暂存的修改,应用到原先的分支或其他的分支上。
c. Git commit --amend
git add添加新内容后,执行commit --amend,会修改上次的commit合并为1个。
使用场合:
- 添加最近那次commit时,漏掉add的内容
- 修改最近那次commit的comments(也就是commit后立马执行amend)
d. Cherry-pick
从其他分支复制指定的commit,merge进来:
该命令谨慎使用,因为其他分支的某个commit,其实是depends on它之前的commit,实际pick的时候,会把之前的commit也带过来。
所以不如直接用git merge来的清晰,只是pick的commit message会带过来,merge需要自己写
e. Merge
Merge会生成一个新提交,master分支的HEAD会移动到该提交上
另,一个有用的命令,把另一个branch的某个file,checkout到本分支上来:
git checkout other-branch-name -- want-file-name
f. Rebase
rebase bugfix分支到master分支, bugfix分支的历史记录会添加在master分支的后面。
如图,历史记录成一条线很整洁。这时移动提交X和Y有可能会发生冲突,需要修改各自的提交时发生冲突的部分。另:
git rebase HEAD^ --onto master 自己的上一个commit不要了,rebase master上的(onto指定upstream)
git rebase -i hash 可以汇合几个commit,或者改写某个commit。
用的不多,具体参照 教程和汇总。
实例:
注意:在解决conflict时,如果要完全舍弃或保留某一个版本,则可以用–ours/theirs命令:
merge和rebase对于ours/theirs命令正好相反
g. Tag
标签是为了更方便地参考提交而给它标上易懂的名称。
Git可以使用2种标签:轻标签(本地暂时使用)和注解标签(需添加注解或签名,发布用)
h. Sparse checkout
若git repo太大,可以用该方法只clone子目录:
另外可用一条命令实现:
i. Git Init
初始化git目录
1. Back Track
2. Branch
3. Repo
实例:拉取他人repo,merge到自己的branch
4. Revert & Reset
reset 可以恢复commit,除了默认的mixed模式,还有soft和hard模式:
模式名称 |
HEAD位置 |
索引区 |
工作树 |
使用场合 |
soft |
修改 |
不修改 |
不修改 |
只取消commit |
mixed |
修改 |
修改 |
不修改 |
取消commit和add |
hard |
修改 |
修改 |
修改 |
彻底复原上一次commit |
revert 可以安全地取消指定的commit,但跟reset不同,不会回退,只会生成新的commit:
ORIG_HEAD 指向之前的HEAD。Reset或Revert错误的时候,在ORIG_HEAD上reset就可以还原之前状态:
5. Git Submodule
6. Git LFS
用法参考
git lfs专为repo中的大文件设计,有单独的存储大文件的地方,本repo只存储地址信息
新repo:
迁移已有repo到lfs