Git学习03—分支管理
创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支.
创建与合并分支
- 创建分支:git branch name
- 切换分支:
git checkout name
git switch name - 创建分支加切换分支:
git checkout -b name
git switch -c name - 查看分支:git branch
- 合并某分支到当前分支:git merge name
- 删除分支:git branch -d
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交,合并完成。
用git log --graph命令可以看到分支合并图:
$ git log --graph --pretty=oneline --abbrev-commit
分支管理策略
- 合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m "merge with no-ff" dev
- 在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活。
其次,干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
所以,大家每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
Bug分支
- 当手头工作没有完成时,Git提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
- 然后去修复bug,首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master分支创建新的bug分支进行修复,然后合并,最后删除;
$ git checkout master
$ git checkout -b issue-101
Switched to a new branch 'issue-101'
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 5 commits.
(use "git push" to publish your local commits)
$ git merge issue-101
Updating 5e60244..51a3d2e
Fast-forward
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d issue-101
- 修复后,接着回到dev分支干活了!刚才的工作现场存到哪去了?用git stash list命令看看,回到工作现场:
$ git checkout dev
Previous HEAD position was 51a3d2e bug
Switched to branch 'dev'
$ git status
On branch dev
nothing to commit, working tree clean
$ git stash list
stash@{0}: WIP on dev: 5e60244 conflict fixed
- Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用 git stash apply 恢复,但是恢复后,stash内容并不删除,你需要用 git stash drop 来删除;
另一种方式是用 git stash pop ,恢复的同时把stash内容也删了: - 当有多个的工作现场被储存时,可以恢复指定的stash,用命令:$ git stash apply stash@{0}
- 在master分支上修复的bug,想要合并到当前dev分支,可以用 git cherry-pick commit_id 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
$ git branch
* dev
master
$ git cherry-pick 4c805e2
$ git stash apply stash@{0}
Feature分支
- 每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'
- 如果要丢弃一个没有被合并过的分支,可以通过git branch -D name 强行删除。
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).
多人协作
查看远程库的信息
$ git remote
origin
$ git remote -v
origin git@github.com:xiaoxiaomingjie/learngit.git (fetch)
origin git@github.com:xiaoxiaomingjie/learngit.git (push)
- 推送分支:就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支。
$ git push origin master
$ git push origin dev
注意:
- master分支是主分支,因此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
- 抓取分支:用git pull把最新的提交从origin/dev抓下来。
创建远程origin的dev分支到本地: $ git checkout -b dev origin/dev
多人协作的工作模式:
- 试图用 git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
$ git push origin dev
To github.com:michaelliao/learngit.git
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
- 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to branch-name origin/branch-name。
$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
- 如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
$ git pull
Auto-merging env.txt
CONFLICT (add/add): Merge conflict in env.txt
Automatic merge failed; fix conflicts and then commit the result.
$ git commit -m "fix env conflict"
[dev 57c53ab] fix env conflict
$ git push origin dev
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 621 bytes | 621.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
7a5e5dd..57c53ab dev -> dev
Rebase
rebase操作可以把本地未push的分叉提交历史整理成直线。