Git命令
【转载请注明出处】http://www.cnblogs.com/mashiqi
2019/01/30
对commit, branch, HEAD之个人理解
- commit 是对project的一次快照,所以可以暂时不正确的理解为对当前project的一个“另存为”。但是git是比较智能的,它不会将所有内容都记录下来,而是只记录相对改变。比如说昨天是a,今天改成了b,那今天的commit记录的其实是b-a。
- branch 其实就是一个指针而已,指向某个commit。
- HEAD 也是一个指针,它可以指向branch(也就是指向一个指针,毕竟branch本身就是指针嘛),也可以直接指向某个commit。
git commit
提交一个commit
git branch [newbranchName]
在当前的commit上建立一个新的branch(分支)。分支即一个指向commit的指针。
git tag [tagName] [commitName/branchName]
在所指定的commit上加一个名字叫做tagName的锚点标签。
git checkout [branchName]
checkout的本意应该是带有离开的意思。但在git里面完全相反,命令git checkout branchA
的意思是将HEAD指向branchA这个分支,如果这个branch所指向的commit的hash值是abc,那么当前的情况就是HEAD->branchA->abc;另外HEAD也可以直接指向某个commit,比如如果某个commit的hash值是abc的话,那么命令git checkout abc
的意思就是将HEAD指向这个commit,即HEAD->abc。注意,在两个小例子里,HEAD分别是指向的branch和指向的commit,这是个细微区别。
git checkout HEAD^
的意思是将HEAD指向parent commit,如果有两个^
那么就再向上移动一个parent,以此类推。可以用~4
来代替^^^^
,其他数字以此类推。
git rebase [branchName]
rebase的意思是将当前的HEAD->branch->commit作为一个新的commit建立在branchName下。假设此刻HEAD指向的是分支a,那么git rebase b
的意思就是
- 如果a就是b或者b是a的祖先:那么什么都不做
- 如果a是b的祖先:则把b的值赋值给HEAD->a
- 其他情况下:新建一个从b继承的commit
commit1
,然后HEAD->a->commit1
rebase命令还有交互模式git rebase -i [branchName]
,这里的-i
就是interactive的意思。输入这个命令后,会出来选择框让你选择要将哪些commit以什么方式rebase到branchName下。
git merge [即将被当前HEAD合并的branch的名字]
如果是自己的历史branch被merge的话,那么自动将那个被merge的branch指向到 当前的HEAD所指向的branch
git branch -f [a] [b]
将分支a指向commit b
git reset [branchName | commitHash]
将当前HEAD所指向的branch重新指向到commitHash 或者branchName所指向的commit。
git revert
git fetch 与 git pull
将remote端的那些“local端没有的数据”下载到local端,相当于同步。但是git fetch
并不会使得当前的local branch的状态发生改变。而git pull
命令等价于git fetch; git merge origin/master
,也即是说不仅是同步,同步完了之后还要将当前HEAD指向的分支(比如说master
)与最新的origin/master
进行合并。另外,rebase
命令也能实现和merge
差不多的效果,git pull --rebase
等价于git fetch; git rebase origin/master
。
git pull origin master
命令等价于git fetch origin master; git merge origin/master
。
git fetch origin :foo
表示在local端创建一个foo分支。
git push
将当前的分支推送到远端,并且使当前local端的origin/master
自动checkout到当前的HEAD的位置。
git push origin :foo
表示在remote端把foo这个分支删除掉,这个是和push是相反的,需要注意。