-
git branch bugWork master^^2^
在master的上一级节点的第二个父节点的上一个节点建立一个branch分支
git branch -f three C2
将分支
three
强制移动到C2
节点上 -
相对引用
-
^
,^^
... -
~
,~<num>
...
-
-
Git Cherry-pick
git cherry-pick <提交号> #git cherry-pick C2 C4
-
交互式的 rebase
--interactive
简写为-i
git rebase -i HEAD~4
-
rebase
git rebase caption master #将master合并到caption分支下。 #即root->caption->bugfix
-
git commit --amend
创建''
,保留当前的提交的id,而不是创建新的id
-
TAG
git tag v1 C1 #如果不指定C1 那么Git 会使用HEAD指向的位置
-
Git Describe
描述离你最近的锚点(也就是标签)
git describe <ref>
-
如果你没有指定的话,Git会以你目前所检出的位置(
HEAD
)。输出结果是
<tag>_<numCommits>_g<hash>
tag
表示的是离ref
最近的标签,numCommits
是表示这个ref
与tag
相差有多少个提交记录,hash
表示的是你所给定的ref
所表示的提交记录哈希值的前几位。 当
ref
提交记录上有某个标签时,则只输出标签名称
-
-
Git Fetch
不会更新你的
master
分支,也不会修改你磁盘上的文件,只是下载提交记录(这样,你就可以对远程分支进行检查或者合并了)可以将
git fetch
的理解为单纯的下载操作git fetch origin foo
Git 会到远程仓库的foo
分支上,然后获取所有本地不存在的提交,放到本地的o/foo
上。git fetch origin foo:bar
Git 将foo
解析成一个origin
仓库的位置,然后将那些提交记录下载到了本地的bar
分支上。由于指定了目标分支,其他的分支都不会被更新。 -
Git Pull
先抓取再合并到本地分支 ,可以理解为
git fetch
组合git merge
git pull
就是fetch
和merge
的简写,git pull
唯一关注的是提交最终合并到哪里(也就是为git fetch
所提供的destination
参数)git pull origin foo
相当于git fetch origin foo; git merge o/foo
-
Git Push
git push
不带任何参数时的行为与Git 的一个名为push.default
的配置有关。git pull --rebase
就是fetch
和rebase
的简写git push <remote> <place>
可以为push
指定参数git push origin master
把这个命令翻译过来就是:切到本地仓库中的master
分支,获取所有的提交,再到远程仓库origin
中找到master
分支,将远程仓库中没有的提交记录都添加上去,搞定之后告诉我。我们通过
place
参数来告诉Git提交记录来自于master
,要推送到远程仓库中的master
。它实际就是要同步两个仓库的位置。git push origin <source>:<destination>
推送到指定<destination>
的目标位置。<source>
和<destiantion>
都支持相对引用,如果<destiantion>
不存在,则会origin
创建新的branch
-
远程追踪分支
pull 操作时,提交记录会被先下载到
o/master
上,之后再合并到本地master
分支。隐含的合并目标由这个关联确定的。push 操作时,我们把工作从
master
推到远程仓库中的master
分支(同时会更新远程分支o/master
)。这个推送的目的地也就是由这种关联确定的。-
有两种方式设置分支跟踪
-
git checkout -b foo o/master
创建一个名叫foo
的分支,它跟踪远程分支o/master
-
git branch -u o/master foo
,如果当前就在foo
分支上,还可以省略foo
-
为什么不用merge呢?
rebase
的优缺点
优点:
Rebase 使你的提交树变得很干净,所有的提交都在一条线上缺点:
Rebase 修改了提交树的历史
一些开发人员喜欢保留提交历史,因此更偏爱merge
。而其他人可能更喜欢干净的提交树,于是偏爱rebase
。仁者见仁,智者见智。
古怪的<source>
Git 有两种关于<source>
的用法是比较诡异的,即你可以在 git psuh
或git fetch
时不指定任何source
,方法就是仅保留冒号和destination
部分,source
部分留空。
git push origin :side
git fetch origin :bugFix
如果push
空<source>
到远程仓库,它会删除远程仓库中的分支。
如果fetch
空<source>
到本地,会在本地创建一个新的分支。