(三)分支管理

分支管理是git的精华所在!

文章结构:

1. 理解分支操作

说明:图中一个圆圈代表一个commit id,即一次提交。

①当用户创建一个新的分支(假设叫做myBranch)时,GIT会建立一个新的myBranch指针指向master的提交点。再将HEAD指向myBranch(HEAD永远指向当前工作的分支):


②当myBranch分支commit后:


③此时master分支的版本号落后于子分支了(而master分支与发布版本保持一致),将子分支与master分支进行合并

 

以上便是一个完整的分支操作模型。


 2. 熟悉几个命令:

  • 创建分支

$ git branch brh

  • 重命名分支(brh分支重命名为brh2)

$ git branch -m brh brh2 

  • 查看分支

$ git branch -a

查看全部分支(本地和远程)

$ git branch -r

只查看远程分支

$ git branch  -l

只查看本地分支 = git branch

  • 删除分支

$ git branch -d brh(需要先切换到别的分支)

$ git branch -D brh (强制删除,无论提交合并与否)

  • 创建并切换分支到brh

$ git checkout -b brh

  • 查询状态(在哪个分支就显示哪个分支状态)

$ git status

  • 推送两个分支到远端仓库

$ git remote set-url origin https://github.com/fanta/project.git  #远端切换回origin主机

$ git push origin master

$ git push origin brh

  • 合并两个分支

$ git merge brh  #必须先切换到其他分支上再操作,表示将brh分支合并到当前分支

    这是一种“Fast-forward”,即“快速合并”方式。master分支上并不会产生commit id。如下图所示


合并完成后brh分支便没有了意义,可以删除掉:

git branch -d brh

提交master到远端

git push origin master

此时,只是删除了本地分支,远端分支还在,删除远端分支:

git push origin --delete brh

 

3. 冲突

 

myBranch分支在原来版本基础上修改并提交了一个文件,接下来master分支也修改并提交了同一文件。

冲突示意图:


接下来合并分支的时候 $ git merge brh 便会产生冲突。

示例:


此时master分支的文件会展示冲突的部分(中间的“=======”用来分隔),此时需要手动解决冲突


假如说我们需要同时保留这两个分支的更改,那么将代码改成我们想要的样子:


之后master分支提交即可: $ git commit -a -m"conflict print"

冲突处理完毕,向远端服务器提交最终信息:

$ git push origin master

 

可能会用到的命令

  • 查看合并信息:

$ git log --graph --pretty=oneline


  • 删除掉brh分支

$ git branch -d brh


4. 分支管理策略

4.1 --no-ff 参数

与“Fast forword”方式不同。此方式合并时会自动再生成一个新的commit id.


$ git merge--no-ff -m "no ff commit" brh

 

策略:

  • master分支应非常稳定,仅用来发布新版本,不要再次分支上开发;
  • 在各个子分支上进行开发工作
  • 团队中的每个成员都在各个分支上工作

 5. 分支暂存

 

使用情境:当前分支未开发完成,故不能提交,却有事得走开做其他开发任务。此时便需要分支暂存

步骤:

①先加入暂存区中 $git add

   将工作暂存起来 $ git stash

②切换到其他任务的分支上:$ git checkout other完成任务,切换回分支

③调出暂存列表进行查看$git stash list

   总暂存区中恢复(两种)

  • $ git stash apply  #先恢复

      $ git stash drop   #再手工删除暂存


  • $ git stash pop    #恢复同时删除暂存

 

6. 补丁

只将不一样的数据打成补丁传输给开发者,而不需要进行大量代码的传输。

(1)git diff 生成标准patch——兼容性好、容易接受

首先需要保证两个开发者在同一个版本

模拟第一个开发者:

$ git checkout -b brh1

修改文件…

$ git diff 文件名 可查看修改内容

$ git commit -a -m "修改了XXX"

$ git diffmaster > mypatch

 

 此时工作区也产生了一个mypatch的文件:

 

模拟第二个开发者:

要从master分支切换,以保证brh1和brh2在同一个版本。

$ git checkout -b brh2

应用补丁信息:

    $ git apply mypatch

    $ git commit -a -m "提交一号开发者的补丁"

切换回master进行分支合并:

    $ git checkout master

    $ git merge --no-ff -m "Merge Path" brh2

 

(2) git format-patch生成GIT专用补丁——多应用于社区公共开发。有一个号码更正人信息会向社区公布

首先要保证两个开发者要在同一个版本。

$ git format-patch -M master

"-M" 表示“指定分支” 与master分支对比。

会生成一个补丁信息: 如001-add-Hello.java.patch


此时目录中也会生成patch文件


将其名称用email发给另一个开发者。

 

从master切换到另一个分支 $ git checkout -b brh2 以保证和brh1同一个版本

应用补丁信息:$ git am001-Add-toString-Method.path

 


7. 多人协作开发

开发者一号:

    完成作业,提交远端:git push origin master:master

开发者二号(单机实验时注意要重新建立仓库充当另一开发者):

    克隆: $ git clone https://github.com/github-fanta/test.git

    此时这拷贝了master分支,拷贝其他远端brh分支:

    $ git merge origin/brh

    作业完成

    推送到远端master分支上 $ git push origin brh:master

 

开发者一号此时的数据已经过时,成为脏数据,更新数据有两种方式:

在更新之前需要先进行分支关联,确定从那个分支抓取

$ git branch --set-upstream-to=origin/master

$ git fetch 只取得最新的分支数据,但不会发生merge 合并

$ git pull 取得最新分支数据,且发生merge

 

一号开发者在pull的时候可能会产生冲突(二号开发者的推送和自己在本地修改了同一文件)

 

这时需要手动解决修改成自己需要的样子

然后提交本地,提交远端


猜你喜欢

转载自blog.csdn.net/fantalee/article/details/80667132