文章目录
Github & Git基础操作总结 Ⅱ分支管理
参考廖雪峰老师网站:Git教程
5.Git 分支管理
分支管理可以使版本库的演进保持简洁,主干清晰,各个分支各司其职、井井有条。
主分支Master只有一个,它是自动建立的,默认就是在主分支在进行开发。所有提供给用户使用的正式版本,都在这个主分支上发布。
开发分支Develop,这个分支可以用来生成代码的最新隔夜版本(nightly)。如果想正式对外发布,就在Master分支上,对Develop分支进行"合并"(merge)。
团队成员都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并。

5.1创建和合并分支
Git用master指向最新的提交,每次提交,master分支都会向前移动一步。
1)创建新的分支dev
Git新建了一个指针指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上

git checkout -b dev 或 git switch -c dev#创建并切换到dev分支
相当于
git branch dev #创建新的分支
git checkout dev #切换到新分支
查看当前分支
git branch
* dev
master
2)在dev分支进行修改和提交(vim + add + commit)
此时如果回到master分支查看文件,文件还是修改前的状态
3)merge master and dev

git switch master #切换到master分支
git merge dev #合并指定分支到当前分支
此时master分支中文件的内容和dev分支的最新提交是完全一样的。
4)删除dev分支

git branch -d dev
5.2解决冲突
master分支和feature1分支各自都分别有新的提交,变成了这样
此时进行合并会有冲突,必须手动解决冲突。可以直接查看文件中的内容
没问题的部分+
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
手动修改master中的部分再add,commit,merge,如图所示
用git log --graph可以看到分支的合并情况
$ git log --graph --pretty=oneline --abbrev-commit
* cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/
* b17d20e branch test
...
最后,删除feature1分支
5.3–no-ff方式的git merge
1)合并方式
合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
git merge --no-ff -m "merge with no-ff" dev
用git log看看分支历史:
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
...

2)Fast-forward与no-ff的区别
来自fangchao3652博客git Fast-forward与no-ff的区别
使用no-ff后,会多生成一个commit 记录,强制保留dev分支的开发记录
而fast-forward的话则是直接合并,看不出之前Branch的任何记录


5.4Bug分支
当你接到一个修复一个代号101的bug的任务时,你想创建一个分支issue-101来修复它,但是,当前正在dev上进行的工作还没法提交,Git stash功能可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。
$git stash
Saved working directory and index state WIP on dev: f52c633 add merge
用git status查看工作区,就是干净的,可以放心地创建分支来修复bug。
假定需要在master分支上修复,就从master创建临时分支,修复bug,add,commit,merge,删除issue-101分支,回到dev分支干活。此时查看工作区
$git status
On branch dev
nothing to commit, working tree clean
用git stash list命令看看:
$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
进行恢复同时把stash内容也删了
git stash pop
git stash apply stash@{0} #恢复指定的stash
在dev分支上修复同样的bug,我们只需要把commit时显示的4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。
$ git branch
* dev
master
$ git cherry-pick 4c805e2
[master 1d4b803] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
5.5Feature分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以强行删除
git branch -D <分支名>
5.6多人协作
1)查看远程库的信息
远程仓库的默认名称是origin
git remote (-v) #-v显示更详细信息
2)抓取分支
clone下远程仓库
git clone git@github.com:
默认情况下,只能看到本地的master分支,可以用git branch查看。
要在dev分支上开发,就必须创建远程origin的dev分支到本地
git checkout -b dev(本地分支名) origin/dev(远程分支名)
在本地dev上修改,add,commit
3)推送分支
把本地分支上的所有本地提交推送到远程库
git push origin master/dev/...(本地分支名)
4)解决冲突
如果同事的最新提交和你试图推送的提交有冲突导致push失败,先抓取最新提交在本地合并解决冲突
git pull
如果没有指定本地dev分支与远程origin/dev分支的链接导致git pull失败,提示“no tracking information”
git branch --set-upstream branch-name origin/branch-name