跳到主要内容

分支管理

创建新分支

首先使用 checkoutswitch 命令切换到指定分支。之后使用 git branch命令即可:

git branch [-b] branch_name

-b 参数指基于当前分支创建并直接切换到 branch_name 分支,如果不加该参数仅仅表示基于当前分支创建 branch_name 分支。

也就是说使用 -b 参数相当于下面两条命令合并执行:

git branch branch_name
git switch branch_name

基于 commit 创建新分支

找出指定的 commit,然后使用如下命令即可创建分支:

git branch <分支名> <commit>

示例:

$ git log
commit 907894ee34190bb4f1fca813bf2a975979054cd8
Author: xxxx <xxxx@mail.com>
Date: Tue Sep 14 10:15:18 2021 +0800

fix: 修复日志

commit 595d44718e56760fae7dc65623fb6c5ab8cfdd10
Author: xxxx <xxxx@mail.com>
Date: Mon Sep 13 18:36:45 2021 +0800

feat: xxxx

比如基于 595d44718e56760fae7dc65623fb6c5ab8cfdd10 创建 fix-bug 分支:

git branch fix-bug 595d44718e56760fae7dc65623fb6c5ab8cfdd10

之后既可以将新创建的分支推送远程了:

git push –-set-upstream origin fix-bug

分支删除

删除本地分支

git branch -d branch_name
强制删除

如果你确定已经不需要这个分支上的所有内容,想要强制删除,可以直接使用大写的 -D 选项:

git branch -D branch_name
删除本地其他所有分支

有时候本地分支太多,一个一个的删除又太麻烦,但是 git 又没有提供这种命令,该怎么办呢?

答案很简单,直接在 shell 中使用管道将多个命令组合起来使用,如下:

git branch | grep -v "$(git rev-parse --abbrev-ref HEAD)" | xargs git branch -D

命令解释:

  • git branch:列出所有本地分支
  • grep -v "$(git rev-parse --abbrev-ref HEAD)":过滤掉当前所在的分支。git rev-parse --abbrev-ref HEAD 会输出当前分支的名称,而 grep -v 则表示“不包含”这个名称的行。
  • xargs git branch -Dxargs 会把前面过滤出来的分支名称作为参数,传递给 git branch -D 命令。这里的 -D (大写的D) 意味着强制删除,即使这些分支上有未合并的提交,也会被删除。
NOTE

-D 强制删除会丢失本地未合并的更改,所以在使用前请务必确认你不需要这些分支上的任何内容。如果你希望更安全地删除,只删除已经合并的分支,可以将 -D 替换为 -d

创建别名

如果经常需要执行这类清理操作,可以考虑为该管道命令设置一个 git 别名。这样,以后只需要简单的输入一下命令就可以完成删除操作。

在 Git 配置文件(通常是 ~/.gitconfig 或仓库的 .git/config)中添加以下内容:

[alias]
clean-branches = "!git branch | grep -v \"$(git rev-parse --abbrev-ref HEAD)\" | xargs git branch -D"

保存配置后,就可以直接在命令行中运行 git clean-branches 命令,就能实现删除当前分支外的所有本地分支。

删除远程分支

# 删除远程分支
$ git push --delete origin branch_name

# 之后如果想将本地分支也删除就再执行下下面的命令即可:
$ git branch -d branch_name

修改分支名

分支名修改分为两种情况,要修改的分支已推送到远程和未推送到远程:

分支未推送远程

如果创建的分支还没有 push 到远程修改起来比较简单,直接使用如下命令进行修改即可:

git branch -m OldBranchName NewBranchName

修改完成后直接将该分支推送到远程就万事大吉了。

git push origin NewBranchName

但是如果我们要修改的分支名已经推送到了远程仓库改怎么修改呢?淡定,只需要按照如下步骤操作即可:

分支已推送远程

首先看下当前的仓库分支信息:

git branch -av

其中 -a 是表示列出本地和远程所有分支(all)的意思,-v 可以理解为列出更多详细信息的意思。输出结果如下(示例结果):

* master                01a6944 Initial commit
remotes/origin/HEAD -> origin/master
remotes/origin/dev 01a6944 Initial commit
remotes/origin/master 01a6944 Initial commit

其中 * 表示我当前所处的分支即 remotes/origin/HEAD,注意看当前分支关联的远程分支是 origin/master,这就是本地分支和远程分支建立的联系(--set-upstream-to)。

从列出的分支可以看到远程有个 dev 分支,我现在要将该分支名修改为 develop ,现在看该怎么做。

首先切换到 dev 分支:

$ git switch dev
# 或
$ git checkout dev

之后使用 --delete 选项将远程 dev 分支删除:

# 在删除之前最好先拉取远程分支最新代码
$ git pull origin dev

# 之后再删除远程分支
$ git push --delete origin dev
注意

默认的远程仓库名是 origin,你可以使用 git remote 命令进行查看,如果你的远程仓库名不是 origin 将上面命令中的 origin 改为你的远程仓库名即可。

现在如果你使用 git status 命令可能会输出如下结果,该结果告诉你关联的远程分支 origin/dev 已经被删除。你可以手动执行命令 git branch --unset-upstream 进行取消关联,不过没啥必要,因为之后我们需要 --set-upstream-to 重新关联远程分支。

On branch dev
Your branch is based on 'origin/dev', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)

nothing to commit, working tree clean

现在使用 git branch -m OldBranchName NewBranchName 命令将本地分支名 dev 修改为 develop

git branch -m dev develop

之后再将修改后的分支 push 到远程:

git push origin develop

然后使用 --set-upstream-to 参数将本地分支(develop)和远程 origin/develop 分支建立关联关系:

git branch --set-upstream-to=origin/develop

现在再使用 git status 命令查看输出信息,从输出结果中可以看出已经关联到远程分支 origin/develop

On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean

这样,一次完成的远程分支名称就修改完成了🥳🥳🥳🥳~