git分支的原理就不讲了,可以看看Git使用手册3 —— Git 分支(上).本文对分支常用的命令进行了增删查改的总结.
增 (新建分支)
- 创建一个分支
$ git branch testing
- 创建完成后并不会将HEAD指针切换到新分支上,需要checkout操作,然后再提交,就是在新分支上操作了
$ git checkout testing
- 上面两步操作合并简写,新建分支,并将本地HEAD切换到新分支上
$ git checkout -b testing
它是下面两条命令的简写:
$ git branch testing
$ git checkout testing
- 推送到远端,origin没有什么特殊含义,只是我们远程仓库的名字,通常默认为origin
$ git push origin testing
如果远端上的分支名字不一样,我们可以进行本地到远端的映射
$ git push origin testing:awesomebranch
- 追踪一个远端分支,并给你一个用于工作的本地分支,起点位于
origin/serverfix
1. 原始方式
$ git checkout -b serverfix origin/serverfix
2. 快捷方式 --track 推荐使用
$ git checkout --track origin/serverfix
3. 本地分支别名,感觉没什么卵用
$ git checkout -b sf origin/serverfix
删 (删除分支)
- 当一个临时分支使用完成后(
idea,hotfix,bug01)应该删除这个分支.
$ git branch -d hotfix
error: The branch 'hotfix' is not fully merged.
If you are sure you want to delete it, run 'git branch -D hotfix'.
意思是分支没有合并,但可以使用大写的D强制删除
$ git branch -D hotfix
- 删除远端的分支
$ git push origin --delete hotfix
- 当前分支彻底回退到某个版本,本地的源码也会变为上一个版本的内容
$ git reset --hard 版本号的sha1
查 (分支状态)
- 查看当前所在分支状态的提交历史
$ git log --oneline --decorate
- 查看所有的分支提交历史
git log --oneline --decorate --graph --all
- 查看所有的分支,分支前的 * 字符:它代表现在检出的那一个分支
$ git branch -v
- 查看哪些分支(已经/尚未)合并到当前分支
$ git branch --merged
$ git branch --no-merged
- 远程分支列表
$ git ls-remote
改 (提交分支)
合并 merge
- 在主线上进行合并操作,选中一个需要合并进来的分支的节点
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
在合并的时候,你应该注意到了"快进(fast-forward)"这个词。如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
简单的说,你主线合并操作节点,是合并进来分支的super指针.那么就将两条分支串联起来.类似于变基
变基
编辑的主要作用是将合并操作的分支,整洁化到原始分支上面.看起来更清爽,但是隐藏了怎么合并的过程.需要查看日志来看看真实的记录.
不要对在你的仓库外有副本的分支执行变基。 也就是说,不要变基公用的(release,develop等)分支,只用来整理自己的提交记录.
如果你已经将提交推送至某个仓库,而其他人也已经从该仓库拉取提交并进行了后续工作,此时,如果你用 git rebase 命令重新整理了提交并再次推送,你的同伴因此将不得不再次将他们手头的工作与你的提交进行整合,如果接下来你还要拉取并整合他们修改过的提交,事情就会变得一团糟。
- 切换到子线,将变化变基到自己的主线上
$ git checkout experiment
$ git rebase bug001
- 回到 bug001 ,进行一次快速合并
$ git checkout bug001
$ git merge experiment