Git(标签、分支和合并)1
git tag 命令
创建标签
git tag
命令用来标记特定的 commit 。当添加新的 commit 时,标签不会移动。
$ git tag -a beta
此命令将:
- 向最近的 commit 添加标签
- 如果提供了 SHA,则向具体的 commit 添加标签
注意,在命令 (git tag -a v1.0
) 中,使用了 -a
选项。该选项告诉 git 创建一个带注释的标签
。如果你没有提供该选项(即 git tag v1.0
),那么它将创建一个轻量级标签
。
建议使用带注释的标签,因为它们包含了大量的额外信息,例如:
- 标签创建者
- 标签创建日期
- 标签消息
上述命令将打开代码编辑器,并等待你为标签输入信息。
验证标签
保存并退出编辑器后,命令行上什么也不会显示。那么如何知道已经向项目中添加了标签呢?只需输入 git tag
,命令行会显示仓库中的所有标签。
git log --decorate
,显示新建的标签。
标签与 commit 相绑定
。因此,标签与 commit 的 SHA 位于同一行。
删除标签
如何修正这个错误?最简单的方法是删除这个标签并重新创建。
可以通过输入 -d
选项 (表示 delete 删除!)加上标签名称来删除 git 标签:
$ git tag -d v1.0
分支
分支的工作原理以及如何在分支之间切换的概述:
上图中每个白框表示一次提交,当在仓库中进行提交时,该提交会被添加到分支上,分支指针也会移动并指向它。标签是关联于某次提交的永久指针,它不会移动。但在添加新的提交时,分支会移动。
我们在仓库中添加一个新的分支 sidebar
。分支非常强大,我们可以借助它,在不同的隔离环境中对同一个项目进行操作
。它是如何工作的?当前 HEAD 指针指向 master
分支,master
是活跃分支。我们可以使用 checkout
命令来切换指针所指向的分支。
如果现在进行提交,该提交会被添加到 HEAD 所指向的 master
分支上。
让我们切换到 sidebar
分支上,并添加一个提交,现在作出的提交将添加到 sidebar
分支。
最近的提交和过去的提交相连
。红线表示 master
分支中的所有提交,所以提交 7 和 b 不在 master
分支中。所以我们打开代码编辑器,我们对提交 f、4、7、b 所做的更改将不会出现在当前 master 分支的任何文件中,git 仅显示 master
分支中的提交。但不要担心,其它分支的提交也都被安全的保存在仓库中
,要将这些提交从仓库中调出,只需切换到我们想要查找的提交所在的分支即可。
git branch
命令用来管理 git 中的分支:
# 列出所有分支
$ git branch
# 创建新的"footer-fix"分支
$ git branch footer-fix
# 删除"footer-fix"分支
$ git branch -d footer-fix
# 强制删除"footer-fix"分支
$ git branch -D footer-fix
列出所有分支
如果我们只输入 git branch
,则 git 将列出仓库中的分支:
创建分支
要创建分支,只需使用 git branch
+ 分支名称
。
虽然你创建了 sidebar
分支,但是它还不是当前分支。你需要切换到该分支。
git checkout
命令
注意,在进行 commit 时,该 commit 将添加到当前分支上。虽然我们创建了新的 sidebar 分支,但是没有向其添加新的 commit,因为我们尚未切换到该分支。如果我们现在进行 commit 的话,该 commit 将添加到 master 分支,而不是 sidebar 分支。我们已经在演示中看到这一情况,要在分支之间进行切换,我们需要使用 git 的 checkout 命令
。
$ git checkout sidebar
请务必了解该命令的工作方式
。运行该命令将:
- 从工作目录中删除 git 跟踪的所有文件和目录(git 跟踪的文件存储在仓库中,因此什么也不会丢失)
- 转到仓库,并提取分支指向的 commit 所对应的所有文件和目录
因此此命令将删除 master 分支中的 commit 引用的所有文件。它会将这些文件替换为 sidebar 分支中的 commit 引用的文件
。理解这一部分十分重要,所以请务必多读几遍工作方式。
当前 sidebar 和 master 都指向同一 commit,因此当你在这两个分支之间切换时,看起来什么也没变。
git checkout
命令也可以创建一个新的分支
。如果你添加 -b
选项,则能够用一个命令创建分支并切换到该分支
。
# 创建新的 footer 分支并让此 footer 分支的起点位置与 master 分支的一样:
$ git checkout -b footer master
日志中的分支
在上述输出中,注意我们之前见到的特殊指示符"HEAD"具有一个指向 sidebar 分支的箭头
。它指向 sidebar 是因为sidebar 分支是当前分支
,现在提交的任何 commit 将添加到 sidebar 分支
。
活跃分支
提示符将显示活跃分支。但这是我们对提示符进行的特殊自定义,如果你使用的是不同的计算机,判断活跃分支的最快速方式是查看 git branch
命令的输出结果。活跃分支名称旁边会显示一个星号
。
# 将创建 alt-sidebar-loc 分支,使其指向 SHA 为 42a69f 的 commit
$ git branch alt-sidebar-loc 42a69f
删除分支
分支用来进行开发或对项目进行修正,不会影响到项目(因为更改是在分支上进行的)。在分支上做出更改后,你可以将该分支组合到 master
分支上。
合并了分支的更改后,你可能不再需要该分支了。如果你想删除分支,可以使用 -d
选项。
$ git branch -d sidebar
注意,无法删除当前所在的分支。因此要删除 sidebar
分支,你需要切换到 master
分支,或者创建并切换到新的分支。
删除内容让人比较紧张。但是不用担心。如果某个分支上有任何其他分支上都没有包含的 commit(也就是这个 commit 是要被删除的分支独有的),git 不会删除该分支
。如果你创建了 sidebar 分支,向其添加了 commit,然后尝试使用 git branch -d sidebar
删除该分支,git 不会让你删除该分支,因为你无法删除当前所在的分支
。如果你切换到 master 分支并尝试删除 sidebar 分支,git 也不会让你删除,因为 sidebar 分支上的新 commit 会丢失!
要强制删除,你需要使用大写的 D 选项 - git branch -D sidebar
。
同时查看所有分支
git log
命令非常强大,可以显示此信息。我们将使用新的 --graph
和 --all
选项:
$ git log --oneline --decorate --graph --all
运行此命令将显示仓库中的所有分支和 commit
: