Git分支介绍以及增删查改和合并,以及分支合并的冲突问题-如何使用 Git 进行代码提交、分支管理和冲突解决

Git分支的介绍,以及增删查改和合并,以及分支合并的冲突问题

介绍

项目实际开发中,我们往往会有多个项目分支,例如用于测试开发的dev分支,用于项目正式发布的分支release

我们可以通过联网仓库的网页,进行项目分支的创建与修改也可以通过Git命令进行

另外,一般多分支结构中不同命名的分支有相关的含义(并不是死规定,但是是一种开发范式)

  1. 主分支(Main Branch)

    通常被称为"main"、“master"或"mainline”,是主要的稳定分支,用于存放部署到生产环境的代码。

  2. 开发分支(Development Branch)

    通常被称为"develop",是用于集成团队成员的开发工作的分支。所有特性分支和bug修复分支通常都会合并到该分支。

  3. 特性分支(Feature Branch)

    通常以"feature/“为前缀,然后接上描述性名称,例如"feature/new-login-page”。用于单独开发某个新功能或需求的分支,一旦完成开发,通常会合并回开发分支。

  4. 修复分支(Bug Fix Branch)

    通常以"bugfix/“为前缀,然后接上描述性名称,例如"bugfix/issue-123”。用于解决特定bug或问题的分支,修复完成后会合并回开发分支。

  5. 发布分支(Release Branch)

    通常以"release/“为前缀,然后接上版本号或描述性名称,例如"release/v1.2.0”。用于准备发布新版本的代码,包括进行测试、修复bug等。发布完成后,会合并回主分支和开发分支。

  6. 预发布分支(Pre-release or Staging Branch)

    通常以"pre-release/"或"staging/"为前缀,用于在测试环境中进行最终验证和准备部署到生产环境的代码。

  7. 持续集成分支(CI Branch)

    用于持续集成和自动化测试的分支,通常以"ci/"或"continuous-integration/"为前缀。

  8. 备份分支(Backup Branch)

    用于备份重要的里程碑或稳定版本的分支,通常以"backup/"为前缀。

1. 使用网页进行项目分支的管理

这里是以Gitee为例进行项目分支创建

Git分支介绍以及增删查改和合并,以及分支合并的冲突问题-如何使用 Git 进行代码提交、分支管理和冲突解决_第1张图片

2. Git命令进行项目分支创建

Git中对于分支的操作,核心命令就是下面四个:

git branch <branch_name>     # 一般用于创建和查看分支
git checkout <branch_name>   # 切换分支
git switch <branch_name>	 # Git2.23+新特性,用于和checkout功能分离
git merge <branch_name>	 	 # 分支合并功能

还有用于远程服务器推送的命令

git push  # 推送仓库到远程服务器

2.1 查看分支

查看分支分为两种

  1. 本地分支:当前本地的分支
  2. 远程分支:最近一次从远程仓库,clone或者pull下来的远程分支的分支【!并不是直接查看远程最新的分支!】
  3. 好好理解我括号里面的东西

2.1.1 查看本地分支

# 语法格式
git branch # 查看本地所有分支,当前处于的分支会有颜色和*标记

2.1.2 查看远程分支

# 语法格式
git branch -r # 查看远程分支

2.1.3 查看所有分支

# 语法格式
git branch -a # 查看所有分支(本地+远程)
# 其中remotes开头的代表远程分支

2.1.4 远程分支的坑和理解

远程分支注意事项:很多人认为查看远程分支就相当于程序帮你去请求了当前远程仓库的内容,所有发现直接git branch -r看不到新内容

其实不是这样的,-r 参数只是在你pull(将远程仓库同步本地)之后,帮你把你本地没有commit的和刚刚pull下来的做出对比

所以如果真的要直接看新的分支,应该先pull,在branch -r 下面是示例

# 示例
git pull # 将远程仓库同步到本地(也就是更改本地当前文件)
git branch -r # 这时候,我们才能看到远程分支的内容

完整例子

现在我用户1修改了远程仓库的内容和分支,创建了dev分支,但是我作为用户2,并没有同步

此时,我的项目分支如下

(没有pull之前的项目分支)
$ git branch -a # 查看所有分支
* master
  remotes/origin/HEAD -> origin/master # remotes开头是远程的,此时远程我已经创建了dev,但是并没显示
  remotes/origin/master
# 此时只有一个master分支,是因为我现在没有和服务器同步,这个-r其实是我最开始同步分支的时候显示的远程分支(pull之后的项目分支)
$ git pull # 我把远程的同步下来
$ git branch -a # 再次查看所有分支
* master  # 代表本地的master分支
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev # 此时,才会显示远程分支里面的dev
  remotes/origin/master

2.2 创建分支

分支创建有两种方式,一个是直接branch,一个是checkout,checkout可以创建后直接切换到新建分支(其实就是branch+checkout了一下)

2.2.1 branch新建分支

# 语法格式
git branch <分支名称>
# eg:
	git branch dev # 新建dev分支

2.2.2 checkout|switch新建并切换分支

# 语法格式
git checkout -b <分支名称>
git switch -c <分支名称> # 新语法Git2.23+支持
# eg:
	git checkout -b dev # 新建dev并切换到dev分支
	# 或者
	git switch -c dev # 新建dev并切换到dev分支
	
	git branch # 可以看到*标记当前分支是dev

2.3 切换分支

在Git2.23以后版本,增加了switch语句,用于分离checkout的功能

# 语法格式
git checkout <分支名称>
git switch <分支名称>

2.4 合并分支

合并分支用于将一个分支的更改合并到当前分支。

简单来讲,就是你比如现在在开发分支dev进行工作,这时候,你觉得开发的差不多的,可以发布了

那现在,是不是需要把dev和master主分支,进行合并。合并完你正式版就和dev一样更新了新功能了。

合并分支步骤:

  1. 切换到目标分支
  2. 执行合并
  3. 有冲突需要解决冲突
  4. 将本地合并结果,推送到远程仓库

2.4.1 合并分支基本命令

# 语法格式
git checkout <需要合并到哪个分支> # 切换到需要合并的分支
git merge <需要合并哪个分支>

# eg:
	# 我现在要把dev开发分支开发完的数据合并到master主分支
	git checkout master # 先切换到master
	git merge # 把dev分支合并进来

2.4.2 合并分支的冲突问题

合并分支,是由Git自己去识别哪些内容该合并,哪些不需要合并

比如你现在开发分支开发了新功能文件,主分支并没有这个功能文件,那Git就自动帮忙合并过来了

但是如果你开发分支对1.txt的第一行修改了一下,结果你主分支也修改了1.txt第一行,那Git到底该怎么合并对吧?

举个例子:

原本在master的main.py文件:

print('我是入口程序代码:')

此时,dev的main.py也是和上面相同的。

接下来重点来了,我现在dev版本我修改了main.py,我master分支也修改了main.py

dev修改:

print('我是DEV版本入口程序代码:')

master修改:

print('我是入口程序代码-Master版:')

虽然说,这两个修改的不是相同地方,但是是同一行啊,Git怎么给你合并呢???

这时候就产生了冲突,Git没法解决,所以给你把main文件变成了这样:

Git显示冲突

这里面每一个符号有不同的含义

HEAD:代表冲突开始的地方

=======:这个标记将master分支的修改和dev分支的修改分隔开。

<<<<<<< HEAD
print('我是入口程序代码-Master版:')
=======
print('我是DEV版本入口程序代码:')
>>>>>>> dev

这时候,我们就需要手动进行解决冲突,你手动修改代码后,然后再进行add和commit,就可以重新提交,或者合并。

产生冲突的几种情况:

  1. 相同文件的同时修改:当两个分支都对同一个文件的相同部分进行了修改,并尝试合并时,Git无法确定应该保留哪个更改,因此会产生冲突。
  2. 删除与修改或重命名冲突:如果一个分支删除了一个文件或重命名了一个文件,而另一个分支对同一文件进行了修改,合并时也会产生冲突。
  3. 合并提交冲突:如果两个分支都在同一个提交的基础上进行了修改,并且尝试将两个分支合并到一个新的提交,Git可能无法自动解决冲突。
  4. 合并基础不同:如果两个分支的合并基础(共同祖先)不同,比如一个是从开发版1来的,一个是开发版2来的,可能会导致合并时出现冲突。

2.4.3 冲突的解决

解决冲突的基本步骤如下:

  1. 执行合并操作时,如果出现冲突,Git会在冲突文件中插入特殊标记 <<<<<<<=======>>>>>>>,用于标记冲突的代码段。
  2. 手动编辑冲突的文件,将不同分支的更改进行整合,并删除特殊标记。
  3. 保存文件,并使用git add命令标记文件为已解决状态。
  4. 最后执行git commit命令来提交解决冲突后的代码。

2.5 删除分支

比如一些分支dev2.0 开发版本2.0现在你想淘汰了,就可以删除这个分支。

或者说,现在dev2.0和dev3.0现在要取消,全部合并dev开发板,那么现在需要合并2.0和3.0在进行删除

删除分支分为两种方式

  1. 普通删除分支
  2. 强制删除方式

两种删除方式的主要区别如下:

  1. 合并状态检查

    • 普通删除会在删除分支之前检查是否已将分支的更改合并到其他分支。如果分支没有合并,普通删除会阻止删除,并显示错误消息。
    • 强制删除则不会检查合并状态,它会无条件删除分支,即使分支上有未合并的更改。这是为了方便快速删除不再需要的分支或临时性分支。
  2. 数据恢复

    • 普通删除只会删除分支的指针,并不会立即删除分支上的提交历史。这意味着在普通删除后,分支上的提交历史可以通过Git的"reflog"来恢复。
    • 强制删除会立即删除分支上的提交历史,因此无法通过"reflog"来恢复分支。强制删除的分支及其提交历史将会被永久删除。

2.5.1 普通删除分支

普通分支删除在删除之前,会对删除分支进行验证,

# 语法格式
git branch -d <分支名称>
git branch --delete <分支名称> # 完整语法

# eg:
	git branch -d dev2.0 # 删除2.0分支

2.5.2 强制删除分支

# 语法格式
git branch -D <分支名称> (强制删除是大写D,并且永久删除不可恢复,慎用!)
git branch --delete --force # 完整语法

2.6 推送分支到远程仓库

# 语法格式
git push <远程仓库名称> <分支名称> # 如果不填写就推送整个仓库

# 查看远程仓库信息
git remote -v # 查看当前本地仓库与远程仓库建立的连接

3. Git版本回滚/回溯等操作,会在后续文章讲解!

h -d dev2.0 # 删除2.0分支


### 2.5.2 强制删除分支

```shell
# 语法格式
git branch -D <分支名称> (强制删除是大写D,并且永久删除不可恢复,慎用!)
git branch --delete --force # 完整语法

2.6 推送分支到远程仓库

# 语法格式
git push <远程仓库名称> <分支名称> # 如果不填写就推送整个仓库

# 查看远程仓库信息
git remote -v # 查看当前本地仓库与远程仓库建立的连接

3. Git版本回滚/回溯等操作,会在后续文章讲解!

Git免密码提交-ssh密钥的生成与配置 | 一个计算机如何生成多个ssh密钥 | ssh相关疑问解答

你可能感兴趣的:(综合学习,Django学习,git,大数据,python)