Git命令

【转载请注明出处】http://www.cnblogs.com/mashiqi

2019/01/30

一个学习Git的好网站,链接在此,另外这个链接是个练手版。

对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继承的commitcommit1,然后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是相反的,需要注意。

posted on 2019-01-30 10:38  mashiqi  阅读(208)  评论(0编辑  收藏  举报

导航