Git分支管理



1、分支的创建、合并、查看、删除、推送

创建分支:git branch <branchName>
切换分支:git checkout <branchName>
创建+切换分支:git checkout -b <branchName>

合并某分支到当前分支:git merge <branchName>,Fast forward模式,删除分支后,会丢掉分支信息;
合并某分支到当前分支:git merge --no-ff -m "merge_message" <branchName>,禁用Fast forward模式,在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

查看分支:git branch
查看分支合并图: git log --graph
查看分支合并图(简要信息): git log --graph --pretty=oneline

删除未合并的分支:git branch -D <branchName>
删除已合并的分支:git branch -d <branchName>

向远程仓库推送某分支:git push origin <branchName>

2、解决分支合并冲突

一个仓库默认有一个 master 分支,往往在开发的时候都会在新建一个分支,就比如叫 mywork 吧,然后在mywork 分支上进行修改,接着将修改提交,最后再将 mywork 分支合并到 master 主分支。
但是当 mywork 分支上的改动提交后但没有合并到 master 主分支,在master 上又有了新的改动并提交后,再将 mywork 分支合并到 master 分支,就会发生合并冲突(merge conflict)。
Git分支管理
不用担心,Git 会告诉你发生冲突的地方。如上图所示,当运行 git merge mywork 命令进行合并后,Git 告诉我们在 自动合并 myfile 目录下的 hlx 文件的时候发生了冲突,自动合并失败,需要我们手动解决冲突后再提交。步骤如下:

Step 1: 根据提示找到冲突的文件,解决冲突
打开冲突的文件,Git用<<<<<<<=======>>>>>>>标记出不同分支中产生冲突的内容,我们需要将这部分内容进行修改,注意删去<<<<<<<=======>>>>>>>这些符号,保存。

Step 2: 修改完之后,运行git add <冲突文件>
Git分支管理
Step 3: 提交产生冲突的文件。
Git分支管理
注意:提交后就不需要再执行合并命令,因为刚刚已经执行过相关的 merge 操作。

至此,冲突就得到了解决。运行 git log --graph命令,还可以看到分支的合并图:
Git分支管理

3、对未提交修改的暂存与恢复

git stash —— **保存当前未完成的工作。会分别对暂存区和工作区的状态进行保存;
git stash save "save_message" —— 执行保存时,添加备注,方便查找;
git stash list —— 查看stash了哪些存储;
git stash show —— 显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加[email protected]{$num},比如第二个 git stash show [email protected]{1}

git stash show -p :—— 显示第一个存储的改动,如果想显示其他存储,命令:git stash show [email protected]{$num} -p ,比如第二个:git stash show [email protected]{1} -p

git stash apply —— 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即[email protected]{0},如果要使用其他个,git stash apply [email protected]{$num} , 比如第二个:git stash apply [email protected]{1}

git stash pop —— 恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即[email protected]{0},如果要应用并删除其他stash,命令:git stash pop [email protected]{$num} ,比如应用并删除第二个:git stash pop [email protected]{1}
git stash drop [email protected]{$num} —— 丢弃[email protected]{$num}存储,从列表中删除这个存储
git stash clear —— 删除所有缓存的stash。

下面是开发中最多的用法:

# 正撸A项目的时候,被拉去做B项目,这个时候 stash 就要上场了
# 先把A项目的已经写好的代码 git add 一下
git add .
# 然后将A项目保存到暂存区
git stash
# 然后写B项目代码,写完并且commit完,准备回来开发A项目,再执行
git stash apply
# 这样就将之前开发A项目的代码从暂存区拿了出来,就可以继续A项目的开发了

此处参考了:
[1] https://blog.****.net/AndyNikolas/article/details/79906132
[2] https://www.cnblogs.com/zndxall/archive/2018/09/04/9586088.html

4、多人协作

多人协作的工作模式通常是这样:
首先,可以试图用git push origin <branch-name>推送自己的修改;
如果推送失败,则因为远程分支有其他人的提交,需要先用git pull抓取远程更新并合并到本地;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branchName>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
这就是多人协作的工作模式,一旦熟悉了,就非常简单。

相关命令:
查看远程库的信息: git remote
查看远程库的详细信息: git remote -v
在本地创建和远程分支对应的分支:git checkout -b <branchName> origin/<branchName> (本地和远程分支的名称最好一致)

5、Git常见分支

master分支 —— 主分支,因此要时刻与远程同步;用于上线的分支,保护性分支,只包含经过测试的稳定代码,开发人员不能直接工作在此分支上,也不能直接提交改动到 master 分支上。
dev分支 —— (develop分支)开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;是开发人员进行任何新的开发的基础分支,当开始一个新的 feature 分支的时候,要从 develop 分出去;另外此分支也汇集所有的已完成的功能,等待合并到 master 分支上线。
bug分支 —— 只用于在本地修复bug,一般没必要推到远程;
feature分支 —— 功能分支。