六、合并代码到开发分支(分支的合并、删除、分支的从属关系信息)

申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。

分支定义
主分支:master
开发分支:develop
功能分支:feature
预发布分支:release
修补bug分支:fixbug
feature、release、fixbug这三种分支都属于临时性需要,使用完以后,应该删除,使得代码库的常设分支始终只有Master和Develop。
 
 

分支的使用规划
master:主分支(远程记录,管理员提交),只用来标记客户使用的发行版,当develop中的一次提交测试完成后,正式给客户使用时,将开发分支合并到主分支并进行标记。
develop:开发分支(远程记录,开发人员提交),记录的主干,功能的开发并不在这里完成。
feature: 用于功能开发(本地临时记录),在这里我们是一个开发人员完成一个功能开发。
开发时先从 develop 分支创建一个以 “功能” 命名的临时分支,一个功能开发完成后合并到 develop 分支,并删除这个临时分支(必须要删除),再次从 develop 分支创建新的临时分支进行下一个功能开发。为什么这样做,等你会用分支树,并需要在以后翻代码时就知道了。

一、合并临时分支到开发分支

  1. 来源分支(feature)要干净:git status
  2. 切换到目标分支:git checkout develop
  3. 目标分支(develop)要干净:git status
  4. 合并到目标分支:git merge --no-ff -m “某某功能完成合并到 develop” feature
  5. 查看分支图:git log --graph --oneline --all
  6. 删除临时分支(必须删):git branch -d feature
  7. 再次查看分支图:git log --graph --oneline --all
  8. 再次开发新功能,重新建立临时分支

合并到目标分支时必须强制使用 “ --no-ff ” 参数,不进行快速合并,通过前后分支图对比 “ 9d5417c (feature) 完成第一个功能 ” 与 “ 9d5417c 完成第一个功能 ” 的差异就在括号这 “ (feature) ” , 这个括号的内容就是来源分支,删除临时分支后来源分支名看不到了,但是这个过程被清楚的记录下来了。

Administrator@PC202008061317 MINGW64 /c/www/git-demo (feature)
$ git status
On branch feature
nothing to commit, working tree clean

Administrator@PC202008061317 MINGW64 /c/www/git-demo (feature)
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$ git merge --no-ff -m "第一个功能完成合并到 develop" feature
Merge made by the 'recursive' strategy.
 README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$ git log --graph --oneline --all
*   ca1008f (HEAD -> develop) 第一个功能完成合并到 develop
|\
| * 9d5417c (feature) 完成第一个功能
|/
* b1aa32a (origin/develop) init develop commit
* ff445e7 (origin/master, origin/HEAD, master) init master commit

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$ git branch -d feature
Deleted branch feature (was 9d5417c).

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$ git log --graph --oneline --all
*   ca1008f (HEAD -> develop) 第一个功能完成合并到 develop
|\
| * 9d5417c 完成第一个功能
|/
* b1aa32a (origin/develop) init develop commit
* ff445e7 (origin/master, origin/HEAD, master) init master commit

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$

二、相关操作

合并

  1. 合并分支:
    git merge “来源分支”
    无冲突时会进行快速合并(Fast forward)

  2. 禁止快速合并:
    git merge --no-ff -m “说明” “来源分支”
         --no-ff 参数表示禁用Fast forward,为本次合并创建一个新的commit
         -m 参数为commit增加描述信息。

    合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

删除分支
git branch -d test:删除本地test分支
git branch -D test: test分支还没有合入当前分支,所以要用-D参数才能删掉。
git push origin --delete test 删除远程test分支
git push origin :test 删除远程test分支

查看命令历史
git reflog

当恢复特定提交版本后,使用查看“git log”命令就看不到此版本之上的提交记录了,此时使用此命令可以看到所有的命令记录,以便确定要回到未来的哪个版本。

查看分支的从属关系信息
git reflog show develop

下面是在 c:\www\git-demo 中模拟开发人员看到的信息

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$ git log
commit ca1008f1e3c0ceedd9093b5264e41e9b6e35d393 (HEAD -> develop)
Merge: b1aa32a 9d5417c
Author: vteetty <vteetty@gmail.com>
Date:   Tue Feb 23 11:19:25 2021 +0800

    第一个功能完成合并到 develop

commit 9d5417cd8a21a6e5658cdda76e21558e5219f9a0
Author: vteetty <vteetty@gmail.com>
Date:   Tue Feb 23 11:11:02 2021 +0800

    完成第一个功能

commit b1aa32a291e4460d9e100372f5b169c0e147ca53 (origin/develop)
Author: vteetty <vteetty@gmail.com>
Date:   Tue Feb 23 10:34:32 2021 +0800

    init develop commit

commit ff445e71fd22479f3b2e63b921f074152518ee50 (origin/master, origin/HEAD, master)
Author: vteetty <vteetty@gmail.com>
Date:   Tue Feb 23 10:29:25 2021 +0800

    init master commit

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$ git reflog show develop
ca1008f (HEAD -> develop) develop@{0}: merge feature: Merge made by the 'recursive' strategy.
b1aa32a (origin/develop) develop@{1}: branch: Created from refs/remotes/origin/develop

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$

下面是在 d:\www\git-demo 中,仓库管理人员看到的信息

Administrator@PC202008061317 MINGW64 /d/www/git-demo (develop)
$ git log
commit b1aa32a291e4460d9e100372f5b169c0e147ca53 (HEAD -> develop, origin/develop)
Author: vteetty <vteetty@gmail.com>
Date:   Tue Feb 23 10:34:32 2021 +0800

    init develop commit

commit ff445e71fd22479f3b2e63b921f074152518ee50 (origin/master, master)
Author: vteetty <vteetty@gmail.com>
Date:   Tue Feb 23 10:29:25 2021 +0800

    init master commit

Administrator@PC202008061317 MINGW64 /d/www/git-demo (develop)
$ git reflog show develop
b1aa32a (HEAD -> develop, origin/develop) develop@{0}: commit: init develop commit
ff445e7 (origin/master, master) develop@{1}: branch: Created from master

Administrator@PC202008061317 MINGW64 /d/www/git-demo (develop)
$

对比开发人员克隆的库与仓库管理人员创建的库:

ca1008f (HEAD -> develop) develop@{0}: merge feature: Merge made by the 'recursive' strategy.
b1aa32a (origin/develop) develop@{1}: branch: Created from refs/remotes/origin/develop
b1aa32a (HEAD -> develop, origin/develop) develop@{0}: commit: init develop commit
ff445e7 (origin/master, master) develop@{1}: branch: Created from master

创建的库中最下面一条为 “ ff445e7 ”创建来自于 “ master ” 分支。
克隆的库中最下面一条为 “ b1aa32a ” 创建于自于 “ refs/remotes/origin/develop ” 分支,这个分支与我们当时创建的过程是一致的。

下面再次比较一下开发人员推送到远程,仓库管理人员拉取最新信息后的情况:

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$  git reflog show develop
ca1008f (HEAD -> develop, origin/develop) develop@{0}: merge feature: Merge made by the 'recursive' strategy.
b1aa32a develop@{1}: branch: Created from refs/remotes/origin/develop

Administrator@PC202008061317 MINGW64 /c/www/git-demo (develop)
$
Administrator@PC202008061317 MINGW64 /d/www/git-demo (develop)
$ git pull
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From gitee.com:vteetty/git-demo
   b1aa32a..ca1008f  develop    -> origin/develop
Updating b1aa32a..ca1008f
Fast-forward
 README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Administrator@PC202008061317 MINGW64 /d/www/git-demo (develop)
$ git reflog show develop
ca1008f (HEAD -> develop, origin/develop) develop@{0}: pull: Fast-forward
b1aa32a develop@{1}: commit: init develop commit
ff445e7 (origin/master, master) develop@{2}: branch: Created from master

Administrator@PC202008061317 MINGW64 /d/www/git-demo (develop)
$
ca1008f (HEAD -> develop, origin/develop) develop@{0}: merge feature: Merge made by the 'recursive' strategy.
b1aa32a develop@{1}: branch: Created from refs/remotes/origin/develop
ca1008f (HEAD -> develop, origin/develop) develop@{0}: pull: Fast-forward
b1aa32a develop@{1}: commit: init develop commit
ff445e7 (origin/master, master) develop@{2}: branch: Created from master
上一篇:Git设置分支保护实现CodeReview卡点


下一篇:Git使用大全