Git分支详解
环境
对于git仓库的搭建和github远程库进行连接,参考Git 入门环境配置
一:正常流程
- 远程和本地的仓库状态如下
其中,head指向当前工作的分支,origin是远程主机名称 - 本地创建新分支(Test)并将工作分支指定为该分支
git branch Test1 //创建新分支 git checkout Test1 //切换工作分支
- 新分支进行修改提交等的日常操作,本文以下划线+数字表示不同的修改提交
- 可以发现,远程仓库中没有该新分支,所以需要同步该分支
使用git push
同步指令会触发The current branch Test1 has no upstream branch.
,也就是远端仓库没有该分支的警告,使用git push --set-upstream origin Test1
,将该分支添加到远程分支,此时在github中会显示是否进行合并的请求
点击compare&pull requests,系统会跳转到提交页面,相关信息填写后直接提交即可,后面等待管理员进行审核。
需要注意的是,个人提交和远程库管理者在普遍情况下不会是同一人。个人提交后要交由管理者审核,在上面个人提交请求后,管理者会收到pull requests的请求
系统也会进行相关的工作,管理员确认没问题提交并确认即可
此时本地和远端仓库状态为
,这就完成了一个本地分支提交和合并到远端的流程。需要注意的是,如果远端在合并后没有删除新提交上来的分支,那么该分支(Test1)也会同时与Master存在远端,即(origin/Test1)的状态,本地在Test1工作状态下的git push
指令能够将本地Test1分支的修改提交同步到远端(origin/Test1),对origin/Master没有影响,这对于项目开发有很多好处,因为可以创建一个临时的远程分支用于临时需求的修改。 - 在4中,远程仓库的Master分支合并了Test1分支,但本地的master分支还处于没有合并的状态,本地中切换到master分支并使用
git pull
来同步远端master和本地maseter的数据。
切换回master主分支
同步分支变化
二:冲突流程
在上面的例子中,管理员和系统自检过程中没有发现合并的问题,以下模拟合并冲突的原因和解决方法
- 本地创建新分支Test1后,在工作分支不变的情况下(依旧为Maseter),进行本地的修改提交,并使用
git push
将Master分支的修改同步到远端Master,假设过程中修改的是文件的第一行内容master change
- 本地切换为Test1分支,将同一文件的第一行修改为
Test1 change
,此时与正常流程一样,提交修改到pull requests,由于修改了同一位置,导致在正常流程中提交系统将无法处理该冲突
解决冲突的过程记录如下
系统无法解决冲突
修改
确认
正常合并 - 冲突修改合并后
git pull
同步两端Master
另一个避免冲突的办法是在提交前使用git pull
同步远端已有的修改,在本地处理冲突后再一并提交,这在vsc中很好操作。
参考
如何使用github中的pull request功能?
Git branch && Git checkout常见用法
GitHub 的 Pull Request 是指什么意思?
Git push 常见用法