Git笔记(四)分支管理

本文最后更新于:6 个月前

分支管理命令、管理策略(git工作流)、分支合并冲突、并行和串行2种合并分支方式

Git笔记(四)分支管理

一、分支管理命令

1.1、新建分支

1
2
3
4
5
6
# 1、新建分支
git branch [branch name] # 基于当前分支,新建分支,(新建后停留在原分支)
git checkout [branch name] # (同上一条)
git checkout -b [branch name] [已有分支名] # 基于指定分支,创建新分支,(并切换到新分支)
git branch --track [branch name] [remote-branch name] # 基于指定远程分支,新建分支
git checkout -b [branch name] orgin/[远程分支名] # (同上一条)

1.2、查看分支

1
2
3
# 2、查看分支
git branch # 列出所有本地分支、以及查看当前所在分支
git barnch -a # 列出所有本地、远程分支

1.3、切换分支

1
2
3
4
5
6
7
# 3、切换分支。并更新工作区
git switch [branch name]
git checkout [branch name]

# 创建并切换分支
git switch -c [branch name]
git checkout -b [branch name]

1.4、修改分支名

1
2
# 4、修改名
git branch -m [old branch name] [new branch name] # 修改分支名

1.5、合并分支

1
2
3
4
5
6
7
# 5、合并分支
git merge --no-ff [branch name] # 将指定分支合并到当前分支
git cherry-pick [commitID] # 选择一个commit,合并进当前分支

# 查看合并情况
git branch --merged # 显示所有合并到当前分支的分支
git branch --no-merged # 显示所有未合并到当前分支的分支

添加--on-ff参数的合并方式如下图:

img

不添加--no-ff参数时,默认执行快进式合并,示意图如下:

1

1.6、删除分支

1
2
3
4
5
# 6、删除分支
git branch -d [branch name] # 删除本地分支,前提是该分支没有未合并的变动
git branch -D [branch name] # 强制删除指定的本地分支

git push origin -d [branch name] # 删除远程分支

1.7、推送分支

1
2
3
# 7、推送分支
git push <远程主机名> <本地分支名>:<远程分支名>
git push --all origin #不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机

1.8、建立分支追踪关系

1
git branch --set-upstream-to=远程主机名/远程分支名	本地分支名 # 建立本地分支与远程分支点追踪关系

二、分支管理策略

「分支管理策略」,实质上与「Git工作流」相差无几。可以参考《Git理论基础》中的Git工作流部分。

大体上,分支按照功能可以分为:

  • 发布分支release或production
  • pre-production预发布分支
  • master主分支
  • develop开发分支
  • feature功能分支
  • fix补丁分支

三、合并冲突

3.1、什么是git冲突

  • git冲突一般发生在分支不同步的情况下,这里的分支不同步有2种情况:
    • 一种是本地两个不同分支之间不同步,例如:从master分支上新建出一条dev分支,在dev分支修改并commit之后,要把修改同步到master分支;但是在创建完dev分支之后,master分支又有了新的commit;这时两个分支之间就不同步了,所以将dev合并到master上时,就会产生冲突。
    • 另一种是本地分支与远程分支之间不同步,例如:从远程origin的main分支拉取内容到本地master分支,在master做修改之后commit;但是与此同时,远程main分支也有了新的修改;这里要把本地master分支推送到main分支也可能会产生冲突。

img

  • 冲突发生在具体文件里,master分支(在创建完dev分支后)对a文件做了修改并提交,dev分支对a文件也做了修改并提交,这时将dev分支合并到master分支时,就会在a文件中起冲突。

简要来说,git冲突就是两个分支对于同一文件修改的内容不一致,如果将B分支合并进A分支,将导致A分支中对文件的部分修改丢失/被篡改。而这时候就需要手动来决定保留哪些部分(冲突解决办法)

3.2、避免冲突

  1. 编辑代码之前,先pull一遍远程代码,保证修改是基于最新的代码
  2. 减少每次提交的代码行数,一来发生冲突的概率小了,二来即使发生冲突也更容易解决。

3.3、解决冲突

解决办法:手动修改发生冲突的文件,保留需要的代码,删除不需要的代码

示例如下:

第一步,准备工作,制造一个git冲突

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 1、初始化git仓库,在master分支上新建a.txt文件并提交
git init demo
cd ./demo
# 创建a.txt,写入master first commit
git add a.txt
git commit -m "master first commit"

# 2、新建dev分支,对a.txt进行修改,然后提交
git switch -c dev
# 修改a.txt,改为dev first change
git add a.txt
git commit -m "dev first change"

# 3、切换回master分支,并合并dev分支
git switch master
git merge --no-ff dev
# 合并成功!因为切换到dev分支之后,master没有新的commit,a.txt文件没有发生变更

# 4、切换到dev分支,修改a.txt,再提交
git switch dev
# 修改a.txt,改为dev second change
git add a.txt
git commit -m "dev second change"

# 5、切换到master分支,先不合并,而是修改a.txt,制造git冲突
git switch master
# 修改a.txt,改为"master second change"
git add .
git commit -m "master second change"

# 6、此时再将dev分支合并到master分支
git merge --no-ff dev

第二步,发生git冲突后,手动修改发生冲突的a.txt文件

此时的分支情况如下:

image-20230223115916086

git冲突提示如下:

image-20230223120003157

接下来,打开a.txt文件

image-20230223120036543

删除不要的部分,保留需要的部分

image-20230223120134057

然后再输入命令:

1
2
git add a.txt
git merge --continue -m "merge dev"

查看此时的分支情况如下:

image-20230223120408241

四、两种合并方式

4.1、merge并行合并

git merge合并会在master分支上进行扩充,并且保留bugfix分支的历史记录,是一种非破坏性操作,历史记录相对复杂

4.2、rebase串行合并

git rebase会将bugfix分支整个分支移动到master分支之后


Git笔记(四)分支管理
http://timegogo.top/2023/02/23/Git/Git笔记(四)分支管理/
作者
丘智聪
发布于
2023年2月23日
更新于
2023年9月10日
许可协议