分支管理
创建新分支
首先使用 checkout 或 switch 命令切换到指定分支。之后使用 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 -D:xargs会把前面过滤出来的分支名称作为参数,传递给git branch -D命令。这里的-D(大写的D) 意味着强制删除,即使这些分支上有未合并的提交,也会被删除。
-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
这样,一次完成的远程分支名称就修改完成了🥳🥳🥳🥳~