Git的分支是指向提交对象的可变指针,默认分支名字为master,它会在每次的提交操作中自动向前移动。使用分支可以让你的工作从开发主线上分离开来,以免影响开发主线,待分支测试通过后可以切换到主线合并分支。
查看分支
使用git branch可以查看所有本地分支,分支前面的*号表示当前 HEAD 指针所指向的分支,使用-v选项可以查看每个分支的最后一次提交,-a选项可以查看所有本地和远程分支,远程分支会用红色显示。
如下所示,master分支指向校验和6201191开头的提交对象,fixbug2分支指向校验和1e7c912开头的提交对象,当前分支为master。
$ git branch -a -v
fixbug2 1e7c912 修改3.txt为123456
* master 6201191 [ahead 7] 合并fixbug2分支
remotes/origin/HEAD -> origin/master
remotes/origin/master c9529c1 Update README.md
--merged 与 --no-merged 可以过滤这个列表中已经合并或尚未合并到当前分支的分支,对于已经合并且前面没有*号的分支可以放心大胆的删除掉。
$ git branch --merged
fixbug2
* master
使用git log --oneline --decorate --graph --all可以查看分支分叉历史。
$ git log --oneline --decorate --graph --all
* 0b4ff79 (HEAD -> fixbug1) 增加文件3.txt
| * 89364fd (master) 增加文件2.txt
|/
* 8ae83c6 (tag: v1.0) 1.第一次修改
* c9529c1 (origin/master, origin/HEAD) Update README.md
* d89bbcc Update README.md
* 34c0567 Update README.md
* fba6d79 Add files via upload
* 73d80bc Initial commit
创建分支
使用git branch在当前提交对象上创建新分支,该命令仅仅创建新分支,并不会自动切换到新分支中去。
$ git branch fixbug1
切换分支
使用git checkout切换到一个已存在的分支,使用-b选项新建一个分支并切换到那个分支上。切换分支时Git 会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交时的样子一模一样。
$ git checkout fixbug1
$ git checkout -b fixbug1
合并和删除分支
如果你想将A分支合并到B分支,你需要先切换到B分支,然后使用git merge合并A分支。
git checkout branchB
git merge branchA
合并完成后A分支还是指向原来的提交对象,由于已经不需要A分支了,所以可以使用-d选项删除该分支。
git branch -d branchA
解决合并时的冲突问题
如果两个分支中对同一个文件的同一个部分进行了不同的修改,合并它们的时候就会产生合并冲突,此时 Git 做了合并,但是没有自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。
在你解决了所有文件里的冲突之后,对每个文件使用 git add命令来将其标记为冲突已解决,然后使用git commit完成合并提交。
$ git merge fixbug2 -m "合并fixbug2分支"
Auto-merging 3.txt
CONFLICT (content): Merge conflict in 3.txt
Automatic merge failed; fix conflicts and then commit the result.
<<<<<<< HEAD
abcdef
=======
123456
>>>>>>> fixbug2
解决冲突后提交
$ git add 3.txt
$ git status
On branch master
Your branch is ahead of 'origin/master' by 5 commits.
(use "git push" to publish your local commits)
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: 3.txt
$ git commit
[master 6201191] 合并fixbug2分支
常见使用分支的例子
- 开发某个项目。
- 为实现某个新功能,创建分支A。
- 在分支A上开展工作。
- 遇到一个紧急BUG需要修复,提交当前修改数据,切换到线上分支。
- 新建一个分支B来修复该BUG然后提交。
- 测试通过后切换回线上分支,合并以及删除分支B。
- 切换回分支A继续工作,工作完成后提交。
- 测试通过后切换回线上分支,合并以及删除分支A。
#为实现某个新功能,创建分支A
git checkout -b branchA
...
# 遇到一个紧急BUG需要修复,提交当前修改数据,切换到线上分支
git commit -m "commit for branchA"
git checkout master
# 新建一个分支B来修复该BUG然后提交
git checkout -b branchB
...
git commit -m "commit for branchB"
# 测试通过后切换回线上分支,合并以及删除分支B
git checkout master
git merge branchB
git branch -d branchB
# 切换回分支A继续工作,工作完成后提交
git checkout branchA
...
git commit -m "commit for branchA"
# 测试通过后切换回线上分支,合并以及删除分支A
git checkout master
git merge branchA
git branch -d branchA
远程跟踪分支
远程跟踪分支是远程分支状态的引用,是不能移动的本地引用,它们以 (remote)/(branch) 形式命名,例如origin/master。
跟踪分支是与远程跟踪分支有直接关系的本地分支,如果在一个跟踪分支上使用git pull或git fetch,Git能自动地识别去哪个服务器上抓取、合并到哪个分支。
当克隆一个仓库时,通常会自动地创建一个跟踪origin/master的master跟踪分支,你也可以使用下面的命令新建跟踪分支或修改跟踪的远程分支。
# 新建本地分支branchA跟踪远程分支origin/branchA
$ git checkout --track origin/branchA
Branch branchA set up to track remote branch branchA from origin.
Switched to a new branch 'branchA'
# 新建本地分支localBranchB跟踪远程分支origin/branchB
$ git checkout -b localBranchB origin/branchB
Branch localBranchB set up to track remote branch branchB from origin.
Switched to a new branch 'localBranchB'
# 将master的远程跟踪分支设置为origin/branchA
$ git branch -u origin/branchA
Branch master set up to track remote branch branchA from origin.
拉取和推送分支
当你克隆一个仓库后,然后在master分支做了一些工作后提交后,origin/master指针不会随之移动。使用git fetch会将远程仓库中有但是在当前仓库的没有的所有信息拉取下来然后存储在你本地仓库中,这个时候origin/master指针会随之移动。
git pull基本上是git fetch和git merge的组合,它从你指定的远程仓库分支中抓取内容,然后尝试将其合并进当前本地分支中。
使用git push将本地分支推送到远程分支,例如git push origin master的意思是将本地仓库的master分支推送到远程仓库origin的master分支。你也可以使用git push origin branchA:branchB将本地仓库的branchA分支推送到远程仓库origin的branchB分支。
删除远程分支
使用git push origin --delete branchname可以删除远程分支。