参数详情
-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)masternewBranch |
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
请注意,这将覆盖分支的当前提交及其整个历史记录。如果你这样做了,可能会丢失一些工作。如果发生这种情况,你可以使用引用日志恢复丢失的提交。建议你不要在当前分支上执行此命令,而是在新分支上执行。
然而,此命令在变基或其他大型历史修改时特别有用。