用《Learn Git Branching》学习git操作的笔记
git commit
在父节点的基础上,保存当前修改,得到一个新的节点
git branch
给当前工作节点创建一个新的分支
git brach -f master HEAD~3 将分支强制移动到别的节点上
git merge
git merge <>合并分支,示例:git merge bugFix 创建一个新的节点:将bugFix分支的内容合并到当前工作分支master
git rebase
git rebase <> 线性合并分支,示例:git rebase master 在master节点的基础上,将bugFix的内容合并到master,并创建master的子节点
git rebase master bugFix 将bugFix的内容rebase到master上,并设bugFix为当前工作分支;为了使master分支为最新的,通过 git rebase bugFix master 实现
交互式的节点提交更改方法:git rebase -i HEAD~4 选择包括此节点在内的上4个节点进行交互式提交更改
git checkout
设置当前工作节点/分支,git checkout -b 分支名,在当前工作节点创建新的分支,并将这个分支设置为当前工作分支
分离HEAD(HEAD脱离出分支名):如果想要将当前工作设为某个提交(节点),而不是某个分支名,用 git checkout 节点名(hash值)
在实际应用中,一般不会通过节点名分离HEAD,通过相对引用会更加方便
相对引用
分支名/节点hash+^ 例如:master^表示master这个分支名的父节点,master^^,为父节点的父节点
分支名/节点hash+~+数字 例如:master~2,向上移动2个节点,即父节点的父节点
链式递归使用 HEAD~^2~ ^2表示一个节点的父节点中的第二个
git reset
将当前工作分支退回到某个历史版本,如:git reset HEAD^,将分支退回到上一次提交(不创建新的提交)
git revert
创建一个新的提交,这个提交的结果为撤销某个提交的修改,即退回到了某个提交的父节点,如:git revert HEAD,创建新的提交,撤销当前节点的修改
git cherry-pick
git cherry-pick+节点名/分支名(可加多个),依次将这些节点的修改提交到当前分支,当前分支也随之移动
git tag
给某个提交的节点设置一个标签(每个提交可以被设置多个标签,所有标签不能同名),可以用于版本号,例如:git tag t0 c0 给c0节点设置标签t0
git describe <ref>
<ref>
可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD
)。
它输出的结果是这样的:
<tag>_<numCommits>_g<hash>
tag
表示的是离 ref
最近的标签(其祖先节点上的标签), numCommits
是表示这个 ref
与 tag
相差有多少个提交记录, hash
表示的是你所给定的 ref
所表示的提交记录哈希值的前几位。
当 ref
提交记录上有某个标签时,则只输出标签名称
git clone
在github下载/克隆一个仓库
远程分支
远程分支以“仓库名/分支名”的格式命名(默认仓库名:origin)例如:origin/master,在本地无法直接操作远程分支
git fetch
更新本地的远程分支
git fetch
完成了仅有的但是很重要的两步:
- 从远程仓库下载本地仓库中缺失的提交记录
- 更新远程分支指针(如
o/master)
git pull
更新本地的远程分支,并把更新内容合并到本地分支,如果远程没有对应分支,创建一个新的配对分支
等价于git fetch;git merge origin/master
git pull --rebase 等价于 git fetch;git rebase origin/master
以下命令在 Git 中是等效的:
git pull origin foo
相当于:
git fetch origin foo; git merge o/foo
还有...
git pull origin bar~1:bugFix
相当于:
git fetch origin bar~1:bugFix; git merge bugFix
看到了? git pull 实际上就是 fetch + merge 的缩写, git pull 唯一关注的是提交最终合并到哪里(也就是为 git fetch 所提供的 destination 参数)
git push
负责将你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录
注意:可能远程分支在你准备push的时候已经更新过,此时无法直接push
通过git pull;git push完成仓库的更新
git push <remote> <place>; git push +远程仓库名+分支名,指定分支push,如果不加后两个参数,默认当前工作分支为push分支,也可以在用 git push origin <source>:<destination> 将source分支push到destination,源和目的可以不是配对的分支,目的也可以是不存在的分支,这样会在远程和本地创建新的分支
git fetch也有类似的功能,不过源和目的相反
古怪的 <source>
Git 有两种关于 <source>
的用法是比较诡异的,即你可以在 git push 或 git fetch 时不指定任何 source
,方法就是仅保留冒号和 destination 部分,source 部分留空。
git push origin :side 删除远程和本地的side分支
git fetch origin :bugFix 在本地添加bugFix分支
remote tracking
git pull 和 git push 都有分支匹配,即master和origin/master配对,当前工作的分支会在远程分支寻找配对的分支,来完成pull操作
自定义远程跟踪属性:
有两种方法设置这个属性,第一种就是通过远程分支检出一个新的分支,执行:
git checkout -b totallyNotMaster o/master
就可以创建一个名为 totallyNotMaster
的分支,它跟踪远程分支 o/master
。
第二种方法
另一种设置远程追踪分支的方法就是使用:git branch -u
命令,执行:
git branch -u o/master foo
这样 foo
就会跟踪 o/master
了。如果当前就在 foo 分支上, 还可以省略 foo:
git branch -u o/master