在这个 Git 入门系列的第三篇中,我们来学习一下如何添加和删除 Git 分支。
在本系列的前两篇文章中,我们开始使用 Git,学会如何克隆项目,修改、增加和删除内容。在这第三篇文章中,我将介绍 Git 分支,为何以及如何使用分支。
tree branches
不妨用树来描绘 Git 仓库。图中的树有很多分支,或长或短,或从树干延伸或从其它分支延伸。在这里,我们用树干比作仓库的 master 分支,其中 master
代指 ”master 分支”,是 Git 仓库的中心分支或***个分支。为简单起见,我们假设 master
是树干,其它分支都是从该分支分出的。
为何在 Git 仓库中使用分支
使用分支的主要理由为:
- 如果你希望为项目增加新特性,但很可能会影响当前可正常工作的代码。对于该项目的活跃用户而言,这是很糟糕的事情。与其将特性加入到其它人正在使用的
master
分支,更好的方法是在仓库的其它分支中变更代码,下面会给出具体的工作方式。 - 更重要的是,Git 其设计用于协作。如果所有人都在你代码仓库的
master
分支上操作,会引发很多混乱。对编程语言或项目的知识和阅历因人而异;有些人可能会编写有错误或缺陷的代码,也可能会编写你觉得不适合该项目的代码。使用分支可以让你核验他人的贡献并选择适合的加入到项目中。(这里假设你是代码库唯一的所有者,希望对增加到项目中的代码有完全的控制。在真实的项目中,代码库有多个具有合并代码权限的所有者)
创建分支
让我们回顾本系列上一篇文章,看一下在我们的 Demo 目录中分支是怎样的。如果你没有完成上述操作,请按照文章中的指示从 GitHub 克隆代码并进入 Demo 目录。运行如下命令:
pwd
git branch
ls -la
pwd
命令(是当前工作目录的英文缩写)返回当前你所处的目录(以便确认你在 Demo
目录中),git branch
列出该项目在你主机上的全部分支,ls -la
列出当前目录下的所有文件。你的终端输出类似于:
Terminal output
在 master
分支中,只有一个文件 README.md
。(Git 会友好地忽略掉其它目录和文件。)
接下来,运行如下命令:
git status
git checkout -b myBranch
git status
***条命令 git status
告知你当前位于 branch master
,(就像在终端中看到的那样)它与 origin/master
处于同步状态,这意味着 master 分支的本地副本中的全部文件也出现在 GitHub 中。两份副本没有差异,所有的提交也是一致的。
下一条命令 git checkout -b myBranch
中的 -b
告知 Git 创建一个名为 myBranch
的新分支,然后 checkout
命令将我们切换到新创建的分支。运行第三条命令 git status
确保你已经位于刚创建的分支下。
如你所见,git status
告知你当前处于 myBranch
分支,没有变更需要提交。这是因为我们既没有增加新文件,也没有修改已有文件。
Terminal output
如果希望以可视化的方式查看分支,可以运行 gitk
命令。如果遇到报错 bash: gitk: command not found...
,请先安装 gitk
软件包(找到你操作系统对应的安装文档,以获得安装方式)。
(LCTT 译注:需要在有 X 服务器的终端运行 gitk
,否则会报错)
下图展示了我们在 Demo 项目中的所作所为:你***一次提交(的对应信息)是 Delete file.txt
,在此之前有三次提交。当前的提交用黄点标注,之前的提交用蓝点标注,黄点和 Delete file.txt
之间的三个方块展示每个分支所在的位置(或者说每个分支中的***一次提交的位置)。由于 myBranch
刚创建,提交状态与 master
分支及其对应的记为 remotes/origin/master
的远程 master
分支保持一致。(非常感谢来自 Red Hat 的 Peter Savage 让我知道 gitk
这个工具)
Gitk output
下面让我们在 myBranch
分支下创建一个新文件并观察终端输出。运行如下命令:
echo "Creating a newFile on myBranch" > newFile
cat newFile
git status
***条命令中的 echo
创建了名为 newFile
的文件,接着 cat newFile
打印出文件内容,*** git status
告知你我们 myBranch
分支的当前状态。在下面的终端输出中,Git 告知 myBranch
分支下有一个名为 newFile
的文件当前处于 untracked
状态。这表明我们没有让 Git 追踪发生在文件 newFile
上的变更。
Terminal output
下一步是增加文件,提交变更并将 newFile
文件推送至 myBranch
分支(请回顾本系列上一篇文章获得更多细节)。
git add newFile
git commit -m "Adding newFile to myBranch"
git push origin myBranch
在上述命令中,push
命令使用的分支参数为 myBranch
而不是 master
。Git 添加 newFile
并将变更推送到你 GitHub 账号下的 Demo 仓库中,告知你在 GitHub 上创建了一个与你本地副本分支 myBranch
一样的新分支。终端输出截图给出了运行命令的细节及命令输出。
Terminal output
当你访问 GitHub 时,在分支选择的下拉列表中可以发现两个可供选择的分支。
GitHub
点击 myBranch
切换到 myBranch
分支,你可以看到在此分支上新增的文件。
GitHub
截至目前,我们有两个分支:一个是 master
分支,只有一个 README.md
文件;另一个是 myBranch
分支,有两个文件。
你已经知道如何创建分支了,下面我们再创建一个分支。输入如下命令:
git checkout master
git checkout -b myBranch2
touch newFile2
git add newFile2
git commit -m "Adding newFile2 to myBranch2"
git push origin myBranch2
我不再给出终端输出,需要你自己尝试,但你可以在 GitHub 代码库 中验证你的结果。
删除分支
由于我们增加了两个分支,下面删除其中的一个(myBranch
),包括两步:
-
删除本地分支 你不能删除正在操作的分支,故切换到
master
分支 (或其它你希望保留的分支),命令及终端输出如下:git branch
可以列出可用的分支,使用checkout
切换到master
分支,然后使用git branch -D myBranch
删除该分支。再次运行git branch
检查是否只剩下两个分支(而不是三个)。 -
删除 GitHub 上的分支 使用如下命令删除
myBranch
的远程分支:git push origin :myBranch
Terminal output
上面 push
命令中分支名称前面的冒号(:
)告知 GitHub 删除分支。另一种写法为:
git push -d origin myBranch
其中 -d
(也可以用 --delete
) 也用于告知 GitHub 删除你的分支。
我们学习了 Git 分支的使用,在本系列的下一篇文章中,我们将介绍如何执行 fetch
和 rebase
操作,对于多人同时的贡献的项目而言,这是很必须学会的。