参数详情

  • -d, --delete 删除一个分支。该分支必须已完全合并到其上游分支中,或者如果未设置上游分支(使用 --track 或 --set-upstream),则必须合并到 HEAD。
  • -D --delete --force 的快捷方式。
  • -m, --move 移动/重命名分支及其对应的引用日志。
  • -M --move --force 的快捷方式。
  • -r, --remotes 列出或删除(如果与 -d 一起使用)远程跟踪分支。
  • -a, --all 列出远程跟踪分支和本地分支。
  • --list 激活列表模式。git branch <pattern> 会尝试创建一个分支,使用 git branch --list <pattern> 列出匹配的分支。
  • --set-upstream 如果指定的分支尚未存在,或者使用了 --force,则行为与 --track 完全相同。否则,设置配置项,类似于 --track 创建分支时的行为,只是分支指向的位置不会更改。

14.1 创建和切换到新分支

要创建一个新分支,同时保持在当前分支上,使用:

git branch <name>

通常,分支名称不能包含空格,并且还受其他规范的约束。要切换到现有分支:

git checkout <name>

要创建一个新分支并切换到它:

git checkout -b <name>

要在一个不同于当前分支最后一个提交的点创建分支(也称为 HEAD),可以使用以下命令之一:

git branch <name> [<start-point>]
git checkout -b <name> [<start-point>]

<start-point> 可以是 Git 已知的任何修订版本(例如另一个分支名称、提交哈希值,或符号引用,如 HEAD 或标签名称):

git checkout -b <name> some_other_branch
git checkout -b <name> af295
git checkout -b <name> HEAD~5
git checkout -b <name> v1.0.5

要从远程分支创建一个分支(默认的 <remote_name> 是 origin):

git branch <name> <remote_name>/<branch_name>
git checkout -b <name> <remote_name>/<branch_name>

如果给定的分支名称仅在远程上找到,你可以简单地使用:

git checkout -b <branch_name>

这等同于:

git checkout -b <branch_name> <remote_name>/<branch_name>

有时你可能需要将几个最近的提交移动到一个新分支。这可以通过分支和“回滚”来实现,如下所示:

git branch <new_name>
git reset --hard HEAD~2 # 回退 2 个提交,你将丢失未提交的工作。
git checkout <new_name>

以下是此技术的说明性解释:

阶段 操作 分支状态
初始状态 无操作 A-B-C-D-E (HEAD)
git branch <new_name> 创建新分支 <new_name> A-B-C-D-E (HEAD)
newBranch
git reset --hard HEAD~2 回退 2 个提交 A-B-C-D-E (HEAD)
master
newBranch

14.2 列出分支

Git 提供了多个命令用于列出分支。所有命令都使用 git branch 函数,该函数将根据命令行上的选项提供一定分支的列表。Git 尽可能在当前选中的分支旁边用星号(*)表示。

目标 命令
列出本地分支 git branch
列出本地分支(详细) git branch -v
列出远程和本地分支 git branch -a 或 git branch --all
列出远程和本地分支(详细) git branch -av
列出远程分支 git branch -r
列出远程分支及其最新提交 git branch -rv
列出已合并分支 git branch --merged
列出未合并分支 git branch --no-merged
列出包含特定提交的分支 git branch --contains [<commit>]

注意:在 -v 后添加额外的 v,例如 $ git branch -avv 或 $ git branch -vv,将打印上游分支的名称。

远程分支将以红色显示。

14.3 删除远程分支

要删除远程仓库中的分支,对于 Git 版本 1.5.0 及更高版本,可以使用:

git push origin :<branchName>

从 Git 版本 1.7.0 开始,可以使用以下命令删除远程分支:

git push origin --delete <branchName>

要删除本地远程跟踪分支:

git branch --delete --remotes <remote>/<branch>
git branch -dr <remote>/<branch> # 简写

要删除多个过时的跟踪分支:

git fetch <remote> --prune
git fetch <remote> -p # 简写

要本地删除一个分支。注意,如果该分支有任何未合并的更改,此命令将不会删除分支:

git branch -d <branchName>

要删除一个分支,即使它有未合并的更改:

git branch -D <branchName>

14.4 快速切换到上一个分支

你可以使用以下命令快速切换到上一个分支:

git checkout -

14.5 检出一个新分支以跟踪远程分支

有三种方法可以创建一个新分支 feature,使其跟踪远程分支 origin/feature:

git checkout --track -b feature origin/feature
git checkout -t origin/feature
git checkout feature # 假设本地没有 `feature` 分支,且只有一个远程分支 `feature`

要设置上游以跟踪远程分支,可以使用:

git branch --set-upstream-to=<remote>/<branch> <branch>
git branch -u <remote>/<branch> <branch>

其中:

  • <remote> 可以是 origin、develop 或用户创建的其他远程名称。
  • <branch> 是用户希望在远程跟踪的分支名称。

要验证你的本地分支正在跟踪哪些远程分支:

git branch -vv

14.6 本地删除分支

$ git branch -d dev

如果分支 dev 的更改已合并到其他分支且不会丢失,将删除该分支。如果 dev 分支包含尚未合并的更改,这些更改将丢失,git branch -d 将失败:

$ git branch -d dev
error: The branch 'dev' is not fully merged.
If you are sure you want to delete it, run 'git branch -D dev'.

根据警告信息,你可以使用 -D 标志强制删除分支(并丢失该分支中未合并的更改):

$ git branch -D dev

14.7 创建一个孤儿分支(即没有父提交的分支)

git checkout --orphan new-orphan-branch

在此新分支上进行的第一次提交将没有父提交,并且将成为新历史的根,与所有其他分支和提交完全断开连接。

14.8 重命名分支

重命名你已检出的分支:

git branch -m new_branch_name

重命名另一个分支:

git branch -m branch_you_want_to_rename new_branch_name

14.9 在分支中搜索

要列出包含特定提交或标签的本地分支:

git branch --contains <commit>

要列出包含特定提交或标签的本地和远程分支:

git branch -a --contains <commit>

14.10 将分支推送到远程

用于将本地分支上的提交推送到远程仓库。

git push 命令接受两个参数:

  • 一个远程名称,例如 origin
  • 一个分支名称,例如 master

例如:

git push <REMOTENAME> <BRANCHNAME>

通常,你运行 git push origin master 将本地更改推送到在线仓库。

使用 -u(--set-upstream 的简写)将在推送期间设置跟踪信息:

git push -u <REMOTENAME> <BRANCHNAME>

默认情况下,git push 会将本地分支推送到具有相同名称的远程分支。例如,如果你有一个名为 new-feature 的本地分支,如果你推送该本地分支,它将创建一个名为 new-feature 的远程分支。如果你希望为远程分支使用不同的名称,可以在本地分支名称后追加远程名称,两者之间用 :: 分隔:

git push <REMOTENAME> <LOCALBRANCHNAME>:<REMOTEBRANCHNAME>

14.11 将当前分支的 HEAD 移动到任意提交

分支只是一个指向提交的指针,因此你可以自由移动它。要使分支指向提交 aabbcc,运行以下命令:

git reset --hard aabbcc

请注意,这将覆盖分支的当前提交及其整个历史记录。如果你这样做了,可能会丢失一些工作。如果发生这种情况,你可以使用引用日志恢复丢失的提交。建议你不要在当前分支上执行此命令,而是在新分支上执行。

然而,此命令在变基或其他大型历史修改时特别有用。