为什么我看不到我在哪个分支?
Why can't I see what branch I am in?
我刚刚创建了一个全新的 git 存储库:
git init
现在我想看看我在哪个分支,所以,我执行:
git branch
此命令不输出任何内容(我的预期是我只会看到一个分支 "master" 而我会在那里)。
所以,我猜根本就没有分店。所以,我尝试通过以下方式创建一个分支:
git checkout -b aaa
结果我看到:
Switched to a new branch 'aaa'
但是当我执行
git branch
我又没有输出。那么,如何验证我在特定的分支中呢?
你可以做一个 git status
。
第一行将是:On branch aaa
。
是正确的——运行ning git status
会告诉你你在哪个分支——但没有说明 为什么 git branch
什么也没给你看。原因是你状态特殊
您刚刚通过 git init
.
创建了一个新的空存储库——一个完全没有提交的存储库
现在,Git 中关于分支名称的事情是它们总是——总是——指向一个特定的提交 .但是你根本没有提交,那么像 master
或 aaa
这样的分支名称怎么能指向一个呢?
答案是不能,所以没有,Git通过尚未创建分支实现了这一点。很简单,你在一个不存在的分支上。
当存储库是新的并且完全没有提交时,这种特殊状态 必须 发生,但如果您使用 git checkout --orphan <newbranch>
也会发生这种情况。这会将您置于新分支上,而无需先 创建 分支,因此新分支不存在。
当分支不存在时,您 "on" 那个分支 git status
术语,并且您 运行 git commit
, Git像往常一样创建一个新提交,1 并在该过程结束时,Git 更新当前分支名称,使其指向刚刚进行的新提交。如果分支以前不存在,现在它存在了!
因此,在一个新的空存储库中,您所在的 "on" 分支不存在,使用 git checkout -b
切换到另一个新分支会使您进入另一个继续的新分支不存在。你曾所在的分支,本来不存在的,只是消失在稀薄的空气中:它从未存在过,它只是你曾"on"的幻影,现在你在一个新的和不同的幻影上。
(之后的 git checkout --orphan <newbranch>
也发生了同样的事情:它把你带到了这种幽灵般的不存在的分支上,如果你随后切换到另一个新的分支,你将继续处于一个幽灵般的不存在的分支上-existent 分支。运行 git checkout master
,或使用任何实际现有分支的名称,将把你切换回现有分支,假设 git checkout
本身成功。)
1git commit
过程是这样工作的,尽管各个步骤的精确顺序有些变化,而像git commit --only <files>
这样的选项会有更大的变化。
- 确保提交看起来没问题(进行任何所需的提交前测试,包括运行设置一个提交前挂钩)。
- 将当前索引内容转换为至少一个树对象,为现在索引中的所有文件("blobs")做一个快照。 (这是
git write-tree
命令。)
- 将您的姓名、电子邮件和时间戳收集在一起作为 "author" 并再次作为此提交的 "committer"。添加提交日志消息。
- 找出哪些提交是此提交的父项。
- 创建新的提交对象 (
git commit-tree
)。
- 更新当前分支名称,使其指向新的提交。
在这种特殊的 "branch that is yet to be created" 条件下,实际上是第 6 步创建了分支。
请注意,在第 4 步中,"figure out parents"、Git 注意到相同的 "branch that is yet to be created" 情况。此条件的结果是新提交没有 no 父级:新提交是 root 提交。不过,通常情况下,第 4 步读取 HEAD
的目的是找到当前提交的哈希 ID:HEAD
包含分支名称,分支确实存在并包含当前提交哈希 ID。
在解决git merge
的冲突后提交合并结果时,第4步使用git merge
留下的跟踪文件来确定额外的父提交哈希(正常合并)或哈希("octopus"合并)。当前或 HEAD 或 @
提交仍然像往常一样是第一个父项。
使用 git branch -a
- 它会显示本地存储库中存在的所有分支
和 git status
- 显示当前分支和更新文件
作为 Git 的初学者,您应该看到这个 Git learning game
这绝对有助于增加您的知识:)
我刚刚创建了一个全新的 git 存储库:
git init
现在我想看看我在哪个分支,所以,我执行:
git branch
此命令不输出任何内容(我的预期是我只会看到一个分支 "master" 而我会在那里)。
所以,我猜根本就没有分店。所以,我尝试通过以下方式创建一个分支:
git checkout -b aaa
结果我看到:
Switched to a new branch 'aaa'
但是当我执行
git branch
我又没有输出。那么,如何验证我在特定的分支中呢?
你可以做一个 git status
。
第一行将是:On branch aaa
。
git status
会告诉你你在哪个分支——但没有说明 为什么 git branch
什么也没给你看。原因是你状态特殊
您刚刚通过 git init
.
现在,Git 中关于分支名称的事情是它们总是——总是——指向一个特定的提交 .但是你根本没有提交,那么像 master
或 aaa
这样的分支名称怎么能指向一个呢?
答案是不能,所以没有,Git通过尚未创建分支实现了这一点。很简单,你在一个不存在的分支上。
当存储库是新的并且完全没有提交时,这种特殊状态 必须 发生,但如果您使用 git checkout --orphan <newbranch>
也会发生这种情况。这会将您置于新分支上,而无需先 创建 分支,因此新分支不存在。
当分支不存在时,您 "on" 那个分支 git status
术语,并且您 运行 git commit
, Git像往常一样创建一个新提交,1 并在该过程结束时,Git 更新当前分支名称,使其指向刚刚进行的新提交。如果分支以前不存在,现在它存在了!
因此,在一个新的空存储库中,您所在的 "on" 分支不存在,使用 git checkout -b
切换到另一个新分支会使您进入另一个继续的新分支不存在。你曾所在的分支,本来不存在的,只是消失在稀薄的空气中:它从未存在过,它只是你曾"on"的幻影,现在你在一个新的和不同的幻影上。
(之后的 git checkout --orphan <newbranch>
也发生了同样的事情:它把你带到了这种幽灵般的不存在的分支上,如果你随后切换到另一个新的分支,你将继续处于一个幽灵般的不存在的分支上-existent 分支。运行 git checkout master
,或使用任何实际现有分支的名称,将把你切换回现有分支,假设 git checkout
本身成功。)
1git commit
过程是这样工作的,尽管各个步骤的精确顺序有些变化,而像git commit --only <files>
这样的选项会有更大的变化。
- 确保提交看起来没问题(进行任何所需的提交前测试,包括运行设置一个提交前挂钩)。
- 将当前索引内容转换为至少一个树对象,为现在索引中的所有文件("blobs")做一个快照。 (这是
git write-tree
命令。) - 将您的姓名、电子邮件和时间戳收集在一起作为 "author" 并再次作为此提交的 "committer"。添加提交日志消息。
- 找出哪些提交是此提交的父项。
- 创建新的提交对象 (
git commit-tree
)。 - 更新当前分支名称,使其指向新的提交。
在这种特殊的 "branch that is yet to be created" 条件下,实际上是第 6 步创建了分支。
请注意,在第 4 步中,"figure out parents"、Git 注意到相同的 "branch that is yet to be created" 情况。此条件的结果是新提交没有 no 父级:新提交是 root 提交。不过,通常情况下,第 4 步读取 HEAD
的目的是找到当前提交的哈希 ID:HEAD
包含分支名称,分支确实存在并包含当前提交哈希 ID。
在解决git merge
的冲突后提交合并结果时,第4步使用git merge
留下的跟踪文件来确定额外的父提交哈希(正常合并)或哈希("octopus"合并)。当前或 HEAD 或 @
提交仍然像往常一样是第一个父项。
使用 git branch -a
- 它会显示本地存储库中存在的所有分支
和 git status
- 显示当前分支和更新文件
作为 Git 的初学者,您应该看到这个 Git learning game 这绝对有助于增加您的知识:)