>_git项目分支太多 管理工具">
当前位置:   article > 正文

【git】(task2)Git分支管理及工具使用_git项目分支太多 管理工具

git项目分支太多 管理工具

学习总结

  • 当我们在两个分支中对同一个文件的同一个部分进行了不同的修改,Git就没有办法顺利的合并他们,会在合并的时候产生合并冲突。比如我们在issue102分支和master分支下对issue102.md文件进行了修改,当我们将issue102分支融合到主分支上时就会发生冲突。
  • 可以通过git status查看命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件。当出现矛盾后,合并的文件内容将会出现"<<<<<<“,”=======“,”>>>>>>"等分割线来进行标记。
  • 在实际开发中,应该按照以下几个基本原则进行分支开发工作流程
    • master分支应该是最稳定的,也就是仅用来发布新版本,平时不能直接在上面进行操作,应该保存在远程。
    • 短期分支是我们干活的分支,短期分支可以不用上传到远程,当我们完成了bug的修复,新功能的开发时才需要合并到主分支上。
    • 多使用分支来进行开发工作。
  • 本次学习的是git分支管理和工具使用,如签名、凭证存储、重置、Rerere 等高级功能后面再涉及。

三、Git分支管理

3.1 分支的简介

  • Git最重要的运用场景是多人协同开发,但是如何能保证每个人之间的开发不影响其他人的开发进程,Git 分支的出现就是解决了这个问题,使得每个人之间的开发是独立的,互不影响的。
  • 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。

3.2 分支的相关操作

(1)分支的创建和切换

【分支的创建】
Git分支的创建十分简单,我们可以使用git branch来查看现有的分支或创建新的分支。当不带任何命令参数时,输入git branch可以帮助我们查看当前项目所拥有的全部分支。并且Git会使用*来标明我们当前所处的分支上。

git branch
  • 1

结果为:

* master
  • 1

当我们想要新增加新的分支时,只需要在git branch命令后面加上我们想要新建的分支的名称即可。

# 创建issue102的分支
git branch issue102
# 查看现有的所有分支
git branch
  • 1
  • 2
  • 3
  • 4
# 现有的分支
issue102
*master
  • 1
  • 2
  • 3

我们可以发现虽然创建了issue102的分支,但是当前分支还是在master上。我们可以通过git checkout命令来进行切换分支。

【分支的切换】
在上面的例子中我们发现虽然创建了新的分支,但是当前分支还是在master分支上,我们需要通过git checkout命令切换到新建的issue102分支上,来进行后续的开发操作。

git checkout issue102
  • 1
Switched to branch 'issue102'
  • 1

这是我们可以在查看下当前分支的状态,我们可以发现当前分支已经转换到了issue102分支上。
在这里插入图片描述

git branch
* issue102
master
  • 1
  • 2
  • 3

切换分支后,我们就可以进行自己的开发。分支上的文件状态是不同的。我们可以通过下面的例子有着更深入的了解。

# 切换分支
git checkout issue102

# 在分支上创建下新的文件
touch issue102.md
git add issue102.md
git commit -m "update issue102.md"

touch issue102.html
git add issue102.html
git commit -m "update issue102.html"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

实际操作如下:
在这里插入图片描述
在完成上述命令后,我们可以通过git log --oneline检查下当前Git的记录。

cd836b0 (HEAD -> issue102) update issue102.html
7575f02 update issue102.md
242c407 (master) update hello.md
  • 1
  • 2
  • 3

我们可以发现issue102分支上的记录与master的记录间隔开了。除此之外,当我们切换回主分支后,我们还会发现master分支下没有新建的issue102.md和issue102.html两个文件。正如下图所示:

请添加图片描述

(2)分支的合并

当我们在分支上完成来开发工作后,我们需要将我们在当前分支进行的工作合并到主分支上。首先我们需要切回需要合并到的分支上,此处以issue102合并到master上为例子进行演示。

# 切换回主分支
git checkout master
# 使用git merge 进行合并
git merge issue102
# git branch --no-merged
# 查看所有未合并工作的分支
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

请添加图片描述

我们可以发现原来在issue102分支上的文件已经合并到了主分支上了,并且issue102分支还存在。大家可以根据实际的需求进行分支的保留与删除。

有时候分支的合并不会一番顺利,当我们在两个分支中对同一个文件的同一个部分进行了不同的修改,Git就没有办法顺利的合并他们,会在合并的时候产生合并冲突。比如我们在issue102分支和master分支下对issue102.md文件进行了修改,当我们将issue102分支融合到主分支上时就会发生冲突。如下图所示:

请添加图片描述

我们也可以通过git status查看命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件。当出现矛盾后,合并的文件内容将会出现"<<<<<<“,”=======“,”>>>>>>"等分割线来进行标记。如下图所示:
请添加图片描述

当出现了矛盾时,我们需要进行手动解决或者放弃合并。

  • 手动合并

    手动合并的方法很简单,就是我们选择我们要保留的代码,然后再把>>>>>, ======, <<<<<<这些提示行给去掉。最后重新进行add commit的操作即可。

  • 放弃合并

    当我们发现冲突所导致的改动量很大时,我们可以选择放弃该次的合并。我们可以使用git merge --abort放弃此次的融合。如果我们在运行了git merge之后又进行了一些人为的改动,那么在abort之后,所进行的改动也会被回滚掉。

  • mergetool

    除了手动合并以及放弃合并之外,我们还有一些其他的合并工具。git官方开发了一个专门用来合并的工具,叫做git mergetool(下图所示),它会将找到一份两个分支的祖先代码作为base(基准),然后再将两个分支的改动都列举出来作为对比,让我们在git编辑器当中决定要留下什么。在此处,我们不做过多的阐述,感兴趣的同学可以点击下方链接进行查看。

    1. Use vimdiff as git mergetool
    2. 使用vimdiff作为git mergetool
    3. git-mergetool

请添加图片描述

(3)分支推送到远程

在很多情况下,我们都需要将分支推送到远程,在这一部分,我们将讲一些远程的相关操作。
首先,我们可以使用git remote -v查看远程库的详细信息。会显示我们可以抓取或推送的origin地址。

$ git remote -v
origin  git@github.com:ProjectOwner/ProjectName.git (fetch)
origin  git@github.com:ProjectOwner/ProjectName.git (push)
  • 1
  • 2
  • 3

当我们需要推送本地分支到远程时,需要指定具体的本地分支。

# 推送本地的master分支到远程
git push origin master
# 推送本地的issue102分支到远程
git push origin issue102
  • 1
  • 2
  • 3
  • 4

但是当我们多人协作进行开发的时候,可能会出现远程分支比我们本地更新的情况,这时,我们就需要使用git pull的命令来试图合并。如果合并出现冲突时,我们需要解决冲突再提交。

更多参考:廖雪峰老师的Git教程中的多人协作

(4)分支的删除

在Git中没有什么分支是不可以删除的(除了当前所在的分支不能删除),包括master分支也是可以进行删除。
Git的分支删除可以分为删除本地分支和远程分支。

  • 删除本地分支
# branchName 是需要删除的本地分支名字
git branch -d branchName
  • 1
  • 2

当我们想强行删除分支时,只需要将参数d改为D即可。

  • 删除远程分支
# origin 是远程的主机名
# branch 需要删除的远程分支
git push origin --delete branch
  • 1
  • 2
  • 3

(5)分支的重命名

当我们需要重命名分支的名称时,我们可以使用git branch命令来进行,具体方式如下:

# oldBranchName: 旧分支名
# newBranchName :新分支名
git branch -m oldBranchName newBranchName
  • 1
  • 2
  • 3

当我们想要将改名后的分支推送到远程时,我们需要进行如下操作:

git branch -m oldBranchName newBranchName   # 将本地的分支进行重命名
git push origin newBranchName               # 将新的分支推送到远程        
git push --delete origin oldBranchName      # 删除远程的旧的分支 
  • 1
  • 2
  • 3

3.3 分支开发工作流

常见的分支开发工作流程:
由于分支管理的便捷,才衍生出这些典型的工作模式,可以根据项目实际情况进行使用。

(1)长期分支

  • 在整个项目开发周期的不同阶段,我们可以同时拥有多个分支;然后我们可以定期地把某些主题分支合并入其他分支中。比如只在 master 分支上保留完全稳定的代码——有可能仅仅是已经发布或即将发布的代码。
  • 他们还有一些名为 develop 或者 next 的平行分支,被用来做后续开发或者测试稳定性——这些分支不必保持绝对稳定,但是一旦达到稳定状态,它们就可以被合并入 master 分支了。
  • 在确保这些已完成的主题分支(短期分支,比如之前的 issue102 分支)能够通过所有测试,并且不会引入更多 bug 之后,就可以合并入主干分支中,等待下一次的发布。

请添加图片描述

(2)短期分支

  • 短期分支也可以叫做主题分支,它的作用是用来实现某一种特性或者相关工作(修复bug,开发产品新特性)。
  • 比如当我们的产品出现了bug时,我们应该新建一个分支并起名为bug分支,并在该分支上进行bug的修复,等我们的代码确定不会引起其他bug时,我们就可以合并到主分支上进行修复。
  • 当我们看见issue时,我们也可以使用同样的方式来解决issue的问题。常见的短期分支还有上面提到的develop,topic分支。

在实际开发中,我们应该按照以下几个基本原则进行分支开发工作流程

  1. master分支应该是最稳定的,也就是仅用来发布新版本,平时不能直接在上面进行操作,应该保存在远程。
  2. 短期分支是我们干活的分支,短期分支可以不用上传到远程,当我们完成了bug的修复,新功能的开发时才需要合并到主分支上。
  3. 多使用分支来进行开发工作。

四、Git 工具(选)

本章主要介绍 Git 常用的工具,可能不会经常用到

4.0 开始你的工作

需要一些简单的文件和目录来演示该章节,如果可以的话,请 fork 这个演示项目至你的个人账号下。

https://github.com/datawhalechina-git-samples/app

后续演示均以这个 repo 操作。

4.1 引用修订版本

Git 支持多种方式来引用单个提交、一组提交或一定范围内的提交。

(1)引用 Commit 的记录

你可以通过任意一个提交的 40 位字符的 SHA-1散列值来指定它。

$ 是终端交互的提示符,不需要输入。如果系统或者终端不一样,只需输入$后的内容即可,本文后续不再累述

切换至本项目工作目录,执行 git log 能看到类似提交日志的输出。(shell 通过 pipe | 将输出信息传递给 more 做多页显示)。

$ git log | more

commit 44328544187650f2f6ecc253ef3a2b099c51baa5
Author: Martin Xu <martin.xus@gmail.com>
Date:   Wed May 4 13:41:55 2022 +0800

    add model module

commit a55ea122894272b13c3a43129ca0b74cfd2b6a4a
Author: Martin Xu <martin.xus@gmail.com>
Date:   Wed May 4 13:33:17 2022 +0800

    Initial commit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

从日志能明显的看到多次提交的记录,每次包括 commit + 一串字符、作者、提交时间 和详细信息等。

这里的主角就是 commit 后跟的 40 位的字符,这个值是一个 SHA-1 哈希值。它是对内容和头信息 Header 的一个校验和 checksum,Git 使用 SHA-1 并不是为了数据的安全性,而是数据的完整性;它保证,在很多年后,你重新 checkout 某个 commit 时,一定是当时的状态,完全一摸一样。 有兴趣进一步了解这个 SHA-1 的值,可以 参考这里

想查看某次提交信息,可以通过 git show 来查看,如:

$ git show 44328544187650f2f6ecc253ef3a2b099c51baa5

commit 44328544187650f2f6ecc253ef3a2b099c51baa5 (HEAD -> main, origin/main, origin/HEAD)
Author: Martin Xu <martin.xus@gmail.com>
Date:   Wed May 4 13:41:55 2022 +0800

    add model module

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..f9d131a
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "model"]
+       path = model
+       url = https://github.com/datawhalechina-git-samples/model
diff --git a/model b/model
new file mode 160000
index 0000000..a8328fd
--- /dev/null
+++ b/model
@@ -0,0 +1 @@
+Subproject commit a8328fd6ee683ef8f6a2d7c4edfefed2923b0795

  • 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

查看所有所有提交 SHA-1 字符串

$ git log|grep '^commit'|awk '{print $2}'

44328544187650f2f6ecc253ef3a2b099c51baa5
a55ea122894272b13c3a43129ca0b74cfd2b6a4a
  • 1
  • 2
  • 3
  • 4

Git 非常聪明的知道在没有歧义的情况下,通过前几个字符来替代上述 40 位字符,如上可简化成:

 $ git show 4432854
  • 1

甚至简化成

$ git show 4432
  • 1

当然你的确保没有歧义。Git 可以为 SHA-1 值生成出简短且唯一的缩写,可以在 git log 后加 --abbrev-commit 参数,输出结果就会显示简短且唯一的值了。默认情况使用 7 个字符,有时为来避免歧义,会增加字符数。

$ git log --abbrev-commit

commit 4432854 (HEAD -> main, origin/main, origin/HEAD)
Author: Martin Xu <martin.xus@gmail.com>
Date:   Wed May 4 13:41:55 2022 +0800

    add model module

commit a55ea12
Author: Martin Xu <martin.xus@gmail.com>
Date:   Wed May 4 13:33:17 2022 +0800

    Initial commit

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

通过在 git log后增加 --pretty=oneline简化输出内容

$ git log --abbrev-commit --pretty=oneline

4432854 (HEAD -> main, origin/main, origin/HEAD) add model module
a55ea12 Initial commit
  • 1
  • 2
  • 3
  • 4

(2)引用分支

如果你要查看一个分支的最后一次对象,可以通过分支名查看。查看本地分支列表通过git branch查看

$ git branch

  develop
  main
* stable
  • 1
  • 2
  • 3
  • 4
  • 5

* 表示当前工作的分支

查看远程分支通过后加参数-r

$ git branch -r

  origin/HEAD -> origin/main
  origin/main
  origin/stable
  • 1
  • 2
  • 3
  • 4
  • 5

我们尝试通过git show stable查看指定分支最后一次提交信息

$ git show stable

commit 11671bae8489621c02a4c99dbcf24b0dede1b1b1 (HEAD -> stable)
Author: Martin Xu <martin.xus@gmail.com>
Date:   Wed May 4 14:16:00 2022 +0800

    stable model for app

diff --git a/.gitmodules b/.gitmodules
index f9d131a..47d8924 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,4 @@
 [submodule "model"]
        path = model
        url = https://github.com/datawhalechina-git-samples/model
+       branch = stable
diff --git a/model b/model
index a8328fd..ca79fae 160000
--- a/model
+++ b/model
@@ -1 +1 @@
-Subproject commit a8328fd6ee683ef8f6a2d7c4edfefed2923b0795
+Subproject commit ca79fae869c9b4ddd7999f06ffd48ac25971b9dd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

如果你的 branch 的名称和当前目录名称很不巧的重名了,那么应该会出现意外的输出

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/515867
推荐阅读
相关标签