Git分支——创建、切换、合并与管理

新建分支——git branch,git checkout

设想此时,项目已经有如下提交:
在这里插入图片描述
此时为解决issue 53,创建并切换到iss53分支,即:

$ git checkout -b iss53
上述命令是下面两条命令的简写:
$ git branch iss53
$ git checkout iss53

iss53分支提交,iss53向前移动:
在这里插入图片描述
此时,线上出现问题需要紧急修复,需要切换到master分支,修复之前,iss53分支的内容应保持已提交状态,避免切换分支导致内容丢失。此时通过git checkout master切换回master分支,此时工作区和C2提交时一致(Git会自动添加、删除、修改文件)。
为了修复问题,创建紧急修复分支hotfix,在hotfix分支解决问题并提交,hotfix向前移动:
在这里插入图片描述

合并分支——git merge

hotfix测试通过后,合并回master分支部署线上:

$ git checkout master 合并回master分支要先切到master
$ git merge hotfix 将hotfix合并入当前分支,即master
Updating f42c576..3a0874c
Fast-forward
 index.html | 2 ++
 1 file changed, 2 insertions(+)

合并时,由于master指向的C2hotfix指向的C4的直接上游,Git简单地将指针向前移动,即快进fast-forward,此时master都指向了提交对象C4
问题解决,删除不再需要的分支hotfix

$ git branch -d hotfix

切换回iss53分支,继续之前的工作并提交:
在这里插入图片描述
由于线上环境一般只能部署master分支的代码,iss53并不包含hotfix的提交C4,此时面临两种选择:

  • 及时将hotfix的修改并入iss53,使master保持iss53的直接上游
  • iss53继续工作,最后合入master
    若选择后者,假设此时issue 53开发完成,需要合入master
$ git checkout master
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html |    1 +
1 file changed, 1 insertion(+)

与合并hotfix不同,不再是fast-forward,而是Merge made by 'recursive' strategy
在这里插入图片描述
原因是master指向的C4不是iss53指向的C5的直接上游,Git不能直接进行快进,而是基于masterC4iss53C5,以及共同祖先C2,做三方合并,合并结果如图:
在这里插入图片描述
提交对象C6是此次三方合并的新的快照,C6是一次合并提交,它有不止一个父提交。因为切换到了master进行的merge操作,所以master指向了最新的提交C6iss53仍然指向其合并之前的提交C5,此时iss53可以删除git branch -d iss53

合并冲突——git merge,git add

如果在两个分支对同一文件的同一部分进行了不同修改,合并时会产生合并冲突:

$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

CONFLICT即遇到了冲突,Git将冲突文件做了合并,但没有创建合并提交,git status时会出现在Unmerged paths下:

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
Unmerged paths:
  (use "git add <file>" to mark resolution)
    both modified: index.html

显示index.html被同时修改了,解决冲突之后,执行git add <file>标记冲突已解决。
冲突文件样例:

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

=======之上,为当前分支的内容,之下为合并进来的内容,选择或修改成合适的内容之后,执行git add标记为已解决,将会出现在git statusChanges to be committed下。
执行git commit,将本次的合并提交对象提交。

分支管理——git branch
$ git branch 当前分支列表,结果中的*星号,表示HEAD指向的分支
$ git branch -v 显示每个分支的最后一次提交
  iss53   93b412c fix javascript issue
* master  7a98805 Merge branch 'iss53'  // 当前处于master分支
  testing 782fd34 add scott to the author list in the readmes
$ git branch --merged 只显示已经合并到当前分支的分支
  iss53  // iss53已经合并到master
* master
$ git branch --no-merged 只显示尚未合并到当前分支的分支
  testing
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值