如何检查 Git 分支是否为孤儿分支

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查一个 Git 分支是否为孤立分支。我们将探究 git log 命令,以了解没有父提交的提交,这是仓库中初始提交的特征。

此外,你将使用 git branch --no-merged 命令来识别其更改尚未合并到当前分支的分支。最后,你将通过创建并检查一个新的孤立分支来测试这些概念。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BranchManagementGroup -.-> git/branch("Handle Branches") git/BranchManagementGroup -.-> git/checkout("Switch Branches") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/add -.-> lab-560048{{"如何检查 Git 分支是否为孤儿分支"}} git/status -.-> lab-560048{{"如何检查 Git 分支是否为孤儿分支"}} git/commit -.-> lab-560048{{"如何检查 Git 分支是否为孤儿分支"}} git/branch -.-> lab-560048{{"如何检查 Git 分支是否为孤儿分支"}} git/checkout -.-> lab-560048{{"如何检查 Git 分支是否为孤儿分支"}} git/log -.-> lab-560048{{"如何检查 Git 分支是否为孤儿分支"}} end

检查 git log 中无父提交的情况

在这一步中,我们将进一步探究 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

在这一步中,你将了解 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 命令。该命令用于列出尚未合并到当前分支的分支,这是识别可能为孤儿分支或包含未集成更改的分支的关键技术。本次实验还包含了一个步骤,通过创建并检查一个新的孤儿分支来测试这些概念。