如何进行 git 分支管理?

本地分支管理

创建和切换分支

创建分支

在本地终端运行 git branch『分支名称』 新建一个分支,如新建一个名为『learn-branch』的分支命令如下:

$ git branch learn-branch

切换分支

创建完分之后使用git branch命令查看分支:

$ git branch
* master
  learn-branch

可以看到『 master 』分支上有一个『*』,说明当前是处在『 master 』分支上,也就是说创建完分支后需要我们手动切换到『learn-branch』,使用git checkout 『分支名称』命令:

$ git checkout learn-branch
Switched to branch 'learn-branch'

再使用git branch命令查看,会发现已经切换到『learn-branch』分支:

$ git branch
* learn-branch
  master

创建和切换分支两条命令可以合起来,使用git checkout -b『分支名称』命令可以创建一个分支并切换到此分支上。

合并分支

快进模式合并

快进式合并分支,也叫『Fast Foreword』,简单的理解就是当要合并的分之和目标分支之间没有冲突,只是多做了一些修改时就会采取『Fast Foreword』模式

例如,我们切换到新建的『learn-branch』分支上,对『learn-git.txt 』文件加一行文字:

I am learning to use git.

然后提交此文件:

 $git add learn-branch.txt
 $git commit -m "edit learn-git.txt"
 [learn-git fce6c4e] branch test
  1 files changed, 1 insertions(+)

接着使用$ git checkout master命令切换回『 master 』分支,再查看『learn-git.txt 』文件,发现刚才添加的内容并不存在!因为那个提交是在『learn-branch』分支上,而『 master 』分支此刻的提交点并没有变。

现在,我们把『learn-branch』分支的内容合并到『 master 』分支上:

 $ git merge learn-branch
 Updating ca62ea0..fce6c4e
 Fast-forward
  learn-branch.txt | 1 +
  1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支,示例中是把指定分支『learn-branch』合并到『 master 』分支上。

合并完成后会发现『 master 』分支上的『learn-git.txt 』文件内容和在『learn-branch』分支上编辑后的内容完全一样。此时如果想删除『learn-branch』分支,可以使用命令$ git branch -d 『分支名称』

普通模式合并

当要合并的分之和目标分支之间存在冲突,就无法使用快进合并模式,需要先手动解决冲突,再提交。

例如,我们先切换到『learn-branch』分支,在『learn-git.txt 』文件中写入下面文字并提交

I am on "learn-branch" branch.

然后切换到『 master 』分支,在『learn-git.txt 』文件中写入下面文字并提交

I am on "master" branch.

接着输入git merge learn-branch命令:

$ git merge learn-branch
  Auto-merging learn-branch.txt
  CONFLICT (content): Merge conflict in learn-git.txt
  Automatic merge failed; fix conflicts and then commit the result.

Git 返回结果提醒我们『learn-git.txt 』文件存在冲突,需要我们手动解决冲突。运行 git status 命令,也可以看到出现冲突状况:

$ git status
 On branch master
 You have unmerged paths.
   (fix conflicts and run "git commit")

 Unmerged paths:
   (use "git add ..." to mark resolution)

       both modified:      learn-git.txt

 no changes added to commit (use "git add" and/or "git commit -a")

现在我们打开『learn-git.txt 』,会发现 Git 加入了冲突解决标记:

  <<<<<<< HEAD
  I am on master branch
  =======
  I am on learn-branch branch
  >>>>>>> learn-branch

可以看到 ======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时的工作分支)中的内容,下半部分是在 learn-branch 分支中的内容。解决冲突的办法无非是二者选其一或者人工亲自整合到一起。把上述内容修改为这样:

I am on master branch

接下来运行 git add 来告诉 Git 冲突已经解决,并运行 git commit 来完成合并:

 $git add learn-git.txt
 $git commit -m "conflict resolved"
 [master cadd265] conflict resloved

Coding 在线分支管理

创建和切换分支

创建分支

登录 Coding.net,进入项目,点击『代码 -> 分支 -> 新建分支』,输入分支名称新建一个分支

图片

切换分支

进入项目,点击『代码 -> 分支』,在分支下拉菜单选项中选择一个分支

图片

合并分支

私有项目合并(MR)
  1. 进入项目,点击『代码 -> 分支 -> 新建合并请求(MergeRequest)』图片
  2. 选择缘分支和目标分支,填入合并请求标题和内容,点击『提交』图片
  3. 点击『合并』,在弹出对话框中选择是否删除源分支,再次点击『合并』图片图片

在创建新的合并请求时,可以填写代码评审,并引用项目内任务进行关联。 合并请求(MR) 发起人可以在该MR被合并前,随时对代码评审和引用任务进行编辑。点击提交,即可以创建一个合并请求( MR ) ,系统会自动判断出该 MR 的是否处于可以合并状态。

在 MR 页面里面,MR 的提交者可以取消 MR ,MR 目标分支的管理者(对该分支有写权限的项目成员),可以选择合并或者拒绝。MR 支持 Markdown 语法评论。

FastForward 模式合并 MR

MR 在合并的时候默认会产生一个合并提交,但是如果在合并的时候勾选了『Fast-Forward 模式合并』,服务器会在合并的时候判断该 MR 是否符合『快进模式』合并,如果符合则会按照『快进模式』合并,不产生合并提交,如果是不符合『快进模式』合并的情况,则忽略该选项,依然以产生合并提交的方式合并。这个选项相当于 git merge 的 --ff参数。

img

设置保护分支

『保护分支』是 Coding 针对 Git 中有关代码权限开发的一个功能,阅读之前,请先了解分支的基本概念和用法。简而言之,保护分支就是将特定的分支保护起来,防止被破坏。

进入项目里『代码 -> 分支 -> 设置保护分支』即可开启保护分支。

图片

图片

分支名称左边有一个 『lock』标志,表示该分支是保护分支。我们可以点击右侧的绿色盾牌标志来设置开关保护分支和设置保护分支成员。如下图:

图片 勾选某个项目成员,即代表改成员对该分支有『 write』权限(可以 push 至该分支,可以接受该分支的 MR)。其他成员没有权限 push 至该分支,当其尝试 push 至该分支的时候,会得到如下错误提示:

图片

所以,当你看到这个错误提示的时候,就知道是因为没有该保护分支权限而导致 push 失败了。

当对 Git 仓库某分支开启禁止 Force Push 的选项后,服务器会对推送至这个分支的更新做 『快进模式检查』(FastForwarded Update Check),如果不是以 『快进模式(FastForwarded)』更新,则会被服务器拒绝更新,以防误操作导致丢失代码历史,会在命令行提示如下错误:

img

允许『ForcePush』

保护分支默认禁止『ForcePush』,欲使用『 Force Push 』可以在设置里勾选『允许 Force Push 』。

图片

特色功能

通过命令行创建 MR

  • push 到 mr/master/branch_name 分支即可自动创建远端分支并提交 MR(合并入 master),如$ git push origin Feature-X:mr/master/Feature-X
  • 自动创建的使用最后一个『commit message』作为标题和内容
  • 自动解析『commit message』中 @ 的人,自动加成评审者,自动# 加为关联资源
  • 自动创建出来的新的分支,只能由创建者再次『push』到这个分支,也允许『Force push』

『Merge Request』 中的代码评审

『Merge Request』可以进行代码评审。『Merge Request』的发起者,可以在创建 『Merge Request』 的时候选择邀请项目内的其他成员来评审此 『Merge Request』。 图片

也可以在 『Merge Request』 被创建后,在 『Merge Request』 的右侧选择添加或取消评审者。 图片

项目内所有拥有代码访问权限的成员都可以对未合并的 『Merge Request』进行评审。 评审的内容包括:

  • 直接评论 『Merge Request』;
  • 针对 『Merge Request』 的文件改动中的某一行代码进行评论;
    图片

非 『Merge Request』 发起人可以对此 『Merge Request』 进行『+1』操作 ,『+1』自己的会出现在『Merge Request』右侧评审者中 图片 图片

『Merge Request』 发起者邀请的评审者与自发前来评审的区别为:

  • 被邀请的评审者会收到评审通知;
  • 邀请的评审者 +1 后,右侧显示的样子会有所不同。 图片

当 『Merge Request』 的发起者不具备目标分支的编辑权限时,拥有目标分支编辑权限的用户,可以对此 『Merge Request』 进行授权操作。授权后,『Merge Request』 的发起人,可自行合并此 『Merge Request』。 图片

使用『#』符号引用资源

每个任务,讨论,MR 也有一个独特的引用 ID, 并通过『#ID』被引用到项目内其它地方。 项目内支持 Markdown 编辑器的地方都支持『#』自动提示(任务描述、讨论、合并请求描述等),并引用相应资源。

  • 讨论

图片

  • 『Merge Request』图片

代码行级比对

代码行级比对( Line Notes ) 是 Coding 开发的可以针对代码的『diff』进行行级别的评论功能,支持 Markdown 语法,可以方便的用来进行『Code Review』。 你可以在代码『commit』页面,以及合并请求( MR  ) 页面使用该功能。

相关文章