Git 分支

一、创建分支
要从当前分支的 HEAD 创建一个新的分支,可以使用:

$ git branch dev   

这条命令的基本形式是:
git branch branch [starting-commit ]
如果没有指定的starting-commit,就默认为当前分支上的最近提交。

git branch 命令只是把分支名引进版本库。并没有改变工作目录去使用新的分支。

二、列出分支名
git branch 命令列出版本库中的分支名。

$ git branch
  dev
* master

上面显示了两个分支。当前已检出到工作目录中的分支用星号标记。
如果没有额外的参数,则只列出版本库中的特性分支。可以用 -r 选项列出那些远程追踪分支。也可以用 -a 选项把特性分支和远程分支都列出来。

三、查看分支
git show-branch 命令提供比 git branch 更详细的输出。与 git branch 一样,-r 显示远程追踪分支,-a 显示所有分支。

$ git show-branch
* [dev] add hello to dev
 ! [master] add data to master
--
*  [dev] add hello to dev
 + [master] add data to master
*+ [dev^] add hi to hello.txt

git show-branch 的输出被一排破折号分为两部分。分隔符上半部分列出分支名。每个分支都列出该分支最近提交的日志消息的第一行。
输出的下半部分表示每个分支中提交的矩阵。如果有一个加号(+),星号(*)或减号(-)在分支的列中,对应的提交就会在该分支中显示。加号表示提交在一个分支中,星号突出显示存在于活动分支中的提交,减号表示一个合并提交。

这两个提交是由星号和加号标识的,分别存在于 dev 和 master 分支中。

*  [dev] add hello to dev
+ [master] add data to master

这两个提交不存在于任何其他分支。它们按时间递序排列。
每个提交行上的方括号中,Git 也会显示一个提交名。dev 和 dev^ 是 dev 分支上最近的两次提交。

如果一个提交存在于多个分支中,那么每个分支将会有一个加号或星号作为标识

*+ [dev^] add hi to hello.txt

第一个星号意味着提交在活动分支 dev 中,加号表示该提交还在 master 分支中。

当调用时,git show-branch 遍历所有显示的分支上的提交。在他们最近的共同提交处停止。如果你想要更多的提交历史记录,使用–more=num 选项。

git show-branch 命令接收一组分支名作为参数,允许你限制这些分支的历史记录显示。

$ git branch bug/pr-1 master

$ git show-branch
! [bug/pr-1] add data to master
 * [dev] add hello to dev
  ! [master] add data to master
---
 *  [dev] add hello to dev
+ + [bug/pr-1] add data to master
+*+ [dev^] add hi to hello.txt

如果你只想看 bug/pr-1 和 bug/pr-2 分支的提交历史记录,可以使用一下命令。

$ git show-branch bug/pr-1 bug/pr-2
! [bug/pr-1] add data to master
 ! [bug/pr-2] add data to master
--
++ [bug/pr-1] add data to master

Git 同样允许通配符匹配分支名。使用更简单的 bug/* 分支通配符可以得到相同的结果。

$ git show-branch bug/*
! [bug/pr-1] add data to master
 ! [bug/pr-2] add data to master
--
++ [bug/pr-1] add data to master

四、检出分支
工作目录一次只能反映一个分支,要在不同的分支上开始工作,要发出 git checkout 命令。给定一个分支名, git checkout 会使该分支变成新的当前分支。

Ang@Ang MINGW64 /d/Git/new (dev)
$ git checkout bug/pr-1
Switched to branch 'bug/pr-1'

有未提交的更改时进行检出
如果一个文件的本地修改不同于新分支上的变更,Git 发出如下错误消息,并拒绝检出目标分支。

$ git checkout dev
error: Your local changes to the following files would be overwritten by checkout:
    hello.txt
Please commit your changes or stash them before you switch branches.
Aborting

使用 git add 更新 hello 的内容到索引中只是将该文件的内容放到索引中,它不会提交给任意分支。Git 还是无法检出新分支时保存修改,因此再次提交失败。

$ git add hello.txt

$ git checkout dev
error: Your local changes to the following files would be overwritten by checkout:
    hello.txt
Please commit your changes or stash them before you switch branches.
Aborting

这时可以发出 git commit 命令来提交修改到当前分支。

合并变更到不同分支
上述例子中,工作目录的当前状态与想切换到的分支相冲突。我们需要的是一个合并:工作目录中的改变必须和被检出的文件合并。
如果使用 -m 选项特别要求,Git 通过在你的本地修改和对目标分支之间进行一次合并操作,尝试将你的本地修改加入到新的工作目录中。

$ git checkout -m dev
Switched to branch 'dev'
M       hello.txt

如果 Git 可以检出一个分支,改变它,并且在没有任何合并冲突的情况下清晰地合并本地修改,那么检出成功。

创建并检出新分支:
当你想创建一个新的分支并同时切换到它。Git 提供了一个快捷方式 -b new-branch 选项。

$ git checkout -b bug/pr-3
Switched to a new branch 'bug/pr-3'

命令:

$ git checkout -b new-branch start-point

完全等价于:

$ git branch new-branch start-point
$ git checkout new-branch

分离HEAD分支:
默认情况下,git checkout 会改变期望的分支的头部。
然而,可以检出任何提交。在这样的情况下,Git 会自动创建一种匿名分支,成为一个分离的 HEAD(detached HEAD)。以下情况 Git 会创建一个分离的 HEAD。

  • 检出的提交不是分支的头部
  • 检出一个追踪分支。为了探索最近有什么变更从远程版本库代入到你的版本库中。
  • 检出标签引用的提交
  • 启动一个 git bisect 的操作
  • 使用 git submodule update 命令

在这种情况下,Git 会告诉你,你已经移动到了一个分离的 HEAD。

$ git checkout master~2
Note: checking out 'master~2'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at e818fb2... add hello.txt

如果你在一个分离的头部,然后你决定在该店用新的提交留住它们,那么你首先创建一个新分支。

$ git checkout -b new_branch

这会给你一个基于分离的 HEAD 所在提交的新的正确分支。然后,你可以继续正常开发。从本质上讲,命名的分支以前是匿名的。

为了得知你是否在一个分离的 HEAD 上,只需:

$ git branch
* (HEAD detached at e818fb2)
  master

如果你在分离的 HEAD 上处理完了,想简单地放弃这种状态,你只需输入 git checkout branch ,就可以转换为一个命名的分支。

五、删除分支
命令 git branch -d branch 从版本库中删除分支。Git 阻止你删除当前分支,必须始终选择一个非当前分支。

$ git branch -d bug/pr-3
Deleted branch bug/pr-3 (was 80444d2).

Git 不会让你删除一个包含不存在于当前分支中的提交的分支。

$ 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'.

有的提交只出现在 dev 分支中,如果该分支被删除,就没有其他方式访问该提交了。

如果已删除分支的内容已经存在于另一个分支里,那就可检出该分支,然后要求从上下文中删除分支。

正如错误消息提示的,可以通过 -D 而不是 -d 来覆盖 Git 的安全检查。只有你确定不需要该分支额外的内容时才可以这样做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值