Git学习笔记--分支

分支管理

分支就是平行时空,但是可以随时合并。

创建和合并分支

我们将HEAD(当前分支)、master都理解为指针,Git用master指向最新的提交,再用HEAD指向master。

创建一个dev分支,此时dev和master指向相同的提交,HEAD指向dev。

 

这是你在dev分支上工作,提交会更新dev的指向,master就停在原地,当你想合并dev和master怎么做呢?最简单的方法是将master指向dev。

很简单,也很快,只是指针的修改。让我们看看怎么通过命令实现:

创建分支:$ git branch dev        
切换分支:$ git switch dev  (旧版本用checkout)
以上两条命令可以用一条代替:$ git switch -c dev(旧版本用checkout)

合并合并指定分支到当前分支:$ git merge dev 因此要先让HEAD指向master
删除dev分支:$ git branch -d dev

这种合并分支很快,叫做 Fast-forward ,不是所有的工作都可用快合并,还有其他的合并方式。

 冲突了怎么办?

现在你创建了一个新分支feature1,并且在feature1上修改并提交了1次,这时你又切回master分支,稀里糊涂的在master分支上修改了同一个文件并提交了,现在分支就变成这样:

 这时合并,Git不知道要保存那个版本,就会提示冲突。此时要手动解决冲突,提交后就能自动合并。

$ git merge feature1                提示冲突
$ git status                        可查看冲突

手动修改readme到想要的内容

$ git add readme.txt 
$ git commit -m "conflict fixed"    提交,自动合并    

实际的分支管理策略

如果分支采用快速合并,那么删除分支后,会丢失分支信息,一般我们希望保存分支信息。因此合并时要禁用FF,命令格式:

$ git merge --no-ff dev

我们可以用下面代码查看分支历史:

$ git log --graph

如果是FF模式,删除分支后就看不到分支历史了。

实际开发时,会有一支分支(如master分支)作为稳定版本,可发布版本。通常我们不在master分支上干活,我们会在一条develop分支上工作。

工作模式通常是这样的:

你和小伙伴都在dev分支干活;

每有一个新功能要实现,从dev分出featureX分支,完成后合并到dev;

dev功能实现得差不多时,检查无bug,合并到master,通常合并到master后就会发布新版本。

用图表示就这样:

 Bug分支 *

有的时候,你正在干活,老板突然说:小c,我下去买杯咖啡,有个bug你改一下。

那么这时你肯定要停下手中工作,火速搞定bug,向老板展示你超高的效率。但是,你正在做一个feature,还要两天才能做完,不能直接切到别的分支,不然你活白干了。

这时,stash功能派上用场。

$ git stash
Saved working directory and index state WIP on dev: da809c3 first submit

这个命令将你现在的工作现场保护起来,相当于bug是中断,这是中断保护。

这时你就可以放心切到其他分支修复bug。

修复完后,回到你刚刚干活的feature分支,

$ git stash pop         恢复的同时把stash内容也删了
$ git stash apply       恢复后,stash内容并不删除
$ git stash drop     删除stash内容
$ git stash list     可以多次stash,该命令查看stash列表

回到feature分支工作后,你发现那个bug在你这个分支也是存在的,怎么办,难道二二三四再来一次吗?不,Git提供了便捷操作,cherry-pick命令可以复制一个特定的提交到当前分支。

$ git cherry-pick 版本号

这个版本号就是上一次你为bug开了一个分支,在分支上提交一次的版本号。

这样,就简单的只把bug修复部分复制到了现在的分支。

 多人协作

推送分支命令:

$ git push origin master(分支名)

克隆库:

$ git clone https/ssh地址

克隆到本地的库,只能看到master分支,要想在dev上开发,还要创建远程的dev分支对应到本地,命令为:

$ git switch -c dev origin/dev

加入两个小伙伴都对同一个文件进行修改后推送,就会造成冲突,解决方法是,后面那个推送的先pull下对应的分支,修改文件解决冲突,再push。

参考:廖雪峰的Git教程

原文地址:https://www.cnblogs.com/cpcpp/p/12956321.html