Git 我是否可以创建一个新分支,该分支没有来自主分支的任何文件?
我是否可以从主分支创建分支,而不将主分支上保留的任何内容复制到新分支?Git 我是否可以创建一个新分支,该分支没有来自主分支的任何文件?,git,github,version-control,Git,Github,Version Control,我是否可以从主分支创建分支,而不将主分支上保留的任何内容复制到新分支? 我可以这样做吗?git命令可以做什么?可以吗?您可以建立一个空树,这是一种在提交时有效删除所有文件的快速方法git read tree--empty将索引设置为空树。提交此操作将保留历史记录,但会进行删除所有内容的提交。 如果需要单独清除历史记录,请参见TL;博士 没有,但被问到的问题(“从主人那里创造…”迫使回答;我们必须用一种特殊的方式来解释“from”,这就迫使我们选择“no”。有了正确的问题,答案变成“是”。请参阅或
我可以这样做吗?git命令可以做什么?可以吗?您可以建立一个空树,这是一种在提交时有效删除所有文件的快速方法
git read tree--empty
将索引设置为空树。提交此操作将保留历史记录,但会进行删除所有内容的提交。
如果需要单独清除历史记录,请参见TL;博士
没有,但被问到的问题(“从主人那里创造…”迫使回答;我们必须用一种特殊的方式来解释“from”,这就迫使我们选择“no”。有了正确的问题,答案变成“是”。请参阅或阅读下面的详细答案
长的
分支不是从分支创建的。它们是由于提交和/或指向提交而创建的
更具体地说,分支名称只是指向一个提交的指针,Git称之为tip提交。提交本身也可以用作指针:每个提交都向后指向其父级或父级
也就是说,我们有一系列的承诺:
... <-F <-G <-H
创建新的分支名称时,或至少常用的方法是使用:
git branch <new-name> [<start-point>]
您只能使用git checkout master
或git switch master
在其中一个分支上“运行”,例如,git将特殊名称HEAD
附加到一个分支名称上,以记住我们使用的分支名称:
...--F--G--H <-- br, master (HEAD)
所有这些提交现在都位于两个分支上,而不是仅位于一个分支上
当您在某个分支B上进行新的提交时,新的提交将获得一个新的、唯一的哈希ID。因此,假设我们按名称签出br
:
...--F--G--H <-- br (HEAD), master
名称master
不移动。我们不是在主机上
;我们在br
上。名称br
会移动:
现在存储库中有一个commit,它有一些大而难看的hash ID,但我们在这里称它为A
。名称master
现在存在,并指向现有的提交A
你可以随时重现这种困境
您可以随时将Git放回这种情况:只需使用Git checkout--orphan new branch
。Git会将您置于一个不存在的分支名称上git status
会告诉你你在新的分支上,而git log
不会显示任何内容(有时会显示一条错误消息:git作者最终将git修复为智能,只说“还没有提交”)
Git根据Git的索引进行新的提交
Git新手通常认为Git使用了他们的工作树文件。这是一个很大的挫折来源,因为这不是真的。当您要求Git填充您的工作树时,Git将填充它,但它并没有使用它来为新提交创建快照
当您要求Git进行新的提交时:
git commit
Git将Git索引中的所有文件作为新快照写出。这个名字,index,不是一个很好的名字,所以这个东西现在有了另一个名字:Git称它为staging区域。1 Git索引中的文件是进入快照的文件
通常,索引中充满了文件。只是通常情况下,这些文件也会匹配当前提交中的所有文件。也就是说,假设您正在提交H
:
...--F--G--H
\
I
...--G--H <-- master (HEAD)
...--G--H <-- master
I--J--K <-- new-branch (HEAD)
这次新的提交I
没有指向H
。新提交的父项是当前提交的内容,并且git checkout--orphan
安排为没有当前提交。我们有一个当前分支,但该分支不存在,因此没有当前提交
请注意,如果您在步骤1中省略了--orphan
,您将得到以下结果:
...--G--H <-- master
\
I <-- new-branch (HEAD)
您可以在任何时候,git checkout master
选择现有提交H
和分支名称master
。这将从Git的索引中删除当前提交K
中的文件,同时从工作树中删除这些文件,并将H
中的快照提取到Git的索引中,然后将这些文件复制到工作树中
结论
您需要知道的是:
- Git中的历史就是提交
- Git通过从发现tip提交的分支名称开始并向后操作来查找提交
- 进行新提交包括按名称签出分支,以便Git知道更新哪个名称,然后修改Git索引中的文件,因为Git从文件的索引副本进行提交
- 当您
a commit时,您的工作树就出现了,因为git索引中的文件是git内部的git-only格式,它只对git有用,而对您或您的计算机软件的其余部分没有用处。您将处理工作树文件,然后使用git checkout
将它们复制回git的索引,为下一次提交做好准备git add
- 新的分支名称通常在您进行提交时就已经指向现有的提交。只有一个
案例,加上最初完全空的存储库,才是特别的。当您进行提交时,这些将生成新名称。在此之前,您处于一种特殊的未出生分支状态git签出--orphant
A <-- master (HEAD)
git commit
...--G--H <-- master (HEAD)
...--G--H <-- master
I <-- new-branch (HEAD)
...--G--H <-- master
\
I <-- new-branch (HEAD)
...--G--H <-- master, new-branch (HEAD)
...--G--H <-- master
I--J--K <-- new-branch (HEAD)