简介
在这个实验中,你将学习如何检查一个 Git 分支是否为孤立分支。我们将探究 git log
命令,以了解没有父提交的提交,这是仓库中初始提交的特征。
此外,你将使用 git branch --no-merged
命令来识别其更改尚未合并到当前分支的分支。最后,你将通过创建并检查一个新的孤立分支来测试这些概念。
在这个实验中,你将学习如何检查一个 Git 分支是否为孤立分支。我们将探究 git log
命令,以了解没有父提交的提交,这是仓库中初始提交的特征。
此外,你将使用 git branch --no-merged
命令来识别其更改尚未合并到当前分支的分支。最后,你将通过创建并检查一个新的孤立分支来测试这些概念。
在这一步中,我们将进一步探究 git log
命令,特别关注它在没有父提交的仓库中的表现。仓库中的第一个提交就是这种情况。
首先,确保你位于 my-time-machine
目录中:
cd ~/project/my-time-machine
现在,让我们使用带有 --pretty=oneline
选项的 git log
命令。该选项将每个提交显示在一行上,这有助于简洁地查看提交历史。我们还将添加 --max-count=1
选项,仅显示最近的提交。
git log --pretty=oneline --max-count=1
你应该会看到类似以下的输出:
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master) Send a message to the future
此输出显示了提交哈希(一长串字符)、所在的分支 (HEAD -> master
) 以及提交消息。
现在,让我们尝试查看这个提交的父提交。由于这是第一个提交,它没有父提交。我们可以在 git log
中使用 --no-walk=parent
选项来尝试显示父提交。
git log --no-walk=parent --pretty=oneline --max-count=1
这个命令可能不会产生任何输出,或者会显示一条错误消息,表明没有可显示的父提交。这是初始提交的预期行为。
理解第一个提交没有父提交是理解 Git 如何构建其提交历史的基础。每个后续提交都会有一个或多个父提交,从而形成一个变更链。
在这一步中,你将了解 git branch
命令,特别是 --no-merged
选项。该选项可帮助你识别那些包含尚未合并到当前分支的更改的分支。
首先,让我们创建一个新分支。可以将分支看作是一个平行时间线,你可以在其中开发新功能或进行实验,而不会影响主时间线(master
)。
确保你位于 ~/project/my-time-machine
目录中。
cd ~/project/my-time-machine
现在,创建一个名为 experiment
的新分支:
git branch experiment
此命令会创建新分支,但不会将你切换到该分支。你仍然位于 master
分支上。
让我们使用 git branch
命令列出仓库中的所有分支:
git branch
你应该会看到类似以下的输出:
experiment
* master
星号 (*
) 表示你当前所在的分支,即 master
。
现在,让我们使用 git branch --no-merged
命令。此命令会列出尚未合并到当前分支(master
)的分支。
git branch --no-merged
你应该会看到:
experiment
此输出表明 experiment
分支包含 master
分支中没有的更改。在这种情况下,由于你刚刚从 master
创建了 experiment
分支,并且尚未在其上进行任何更改,这可能看起来有些违反直觉。然而,--no-merged
选项旨在显示其 末端 提交无法从当前分支的 末端 访问的分支。由于 experiment
目前指向与 master
相同的提交,但 master
尚未“合并” experiment
(在这种情况下这没有实际意义),所以它仍然会列出 experiment
。
在实际场景中,你通常会创建一个新分支,在其上进行一些提交,然后从主分支(如 master
)使用 git branch --no-merged
来查看哪些功能分支已准备好合并。
在这一步中,我们将创建一个新的“孤儿”分支。孤儿分支是一个没有继承先前分支历史的分支,就像在你的时间机器里开启了一条全新的时间线。这在处理文档分支或网站的 gh-pages 分支等场景中非常有用,因为你不希望主代码的历史被包含在内。
确保你位于 ~/project/my-time-machine
目录中。
cd ~/project/my-time-machine
现在,让我们创建一个名为 new-start
的新孤儿分支:
git checkout --orphan new-start
你应该会看到类似以下的输出:
Switched to a new branch 'new-start'
现在你已经切换到了 new-start
分支。注意,master
分支的文件仍然存在于你的工作目录中。这是因为 git checkout --orphan
会为新的根提交准备工作目录和索引,但不会移除现有的文件。
让我们查看一下状态:
git status
你应该会看到类似这样的内容:
On branch new-start
Untracked files:
(use "git add <file>..." to include in what will be committed)
message.txt
nothing added to commit but untracked files present (use "git add" to track)
Git 将 message.txt
视为未跟踪的文件,因为 new-start
分支的历史与 master
分支完全独立。
为了在这个孤儿分支上真正重新开始,我们通常会移除旧文件,然后为这个分支添加新内容。让我们移除 message.txt
文件:
rm message.txt
现在,让我们再次查看状态:
git status
你应该会看到:
On branch new-start
No commits yet
nothing to commit (create/copy files and use "git add" to track)
现在工作目录已经干净了,我们准备在这条全新的、独立的时间线上创建第一个提交。
让我们创建一个特定于这个分支的新文件:
echo "This is a fresh start!" > readme.md
将新文件添加到暂存区:
git add readme.md
最后,在 new-start
分支上创建第一个提交:
git commit -m "Initial commit for new-start branch"
你应该会看到类似以下的输出:
[new-start (root-commit) a1b2c3d] Initial commit for new-start branch
1 file changed, 1 insertion(+)
create mode 100644 readme.md
注意,这个提交也是一个“(root-commit)”,就像 master
分支上的第一个提交一样。这证实了它没有父提交,是一段新历史的开端。
现在,让我们查看这个分支的日志:
git log --pretty=oneline
你应该只会看到我们刚刚创建的那个提交:
a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> new-start) Initial commit for new-start branch
这表明 new-start
分支有自己独立的历史,与 master
分支分开。
在本次实验中,你学习了如何检查一个 Git 分支是否为孤儿分支。首先,你探索了 git log
命令,特别是如何使用 --no-walk=parent
来识别仓库中初始提交是否没有父提交。这展示了 Git 历史的基本概念,即第一个提交没有父提交。
接下来,你了解了 git branch --no-merged
命令。该命令用于列出尚未合并到当前分支的分支,这是识别可能为孤儿分支或包含未集成更改的分支的关键技术。本次实验还包含了一个步骤,通过创建并检查一个新的孤儿分支来测试这些概念。