Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 我是否可以创建一个新分支,该分支没有来自主分支的任何文件?_Git_Github_Version Control - Fatal编程技术网

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从文件的索引副本进行提交
  • 当您
    git checkout
    a commit时,您的工作树就出现了,因为git索引中的文件是git内部的git-only格式,它只对git有用,而对您或您的计算机软件的其余部分没有用处。您将处理工作树文件,然后使用
    git add
    将它们复制回git的索引,为下一次提交做好准备
  • 新的分支名称通常在您进行提交时就已经指向现有的提交。只有一个
    git签出--orphant
    案例,加上最初完全空的存储库,才是特别的。当您进行提交时,这些将生成新名称。在此之前,您处于一种特殊的未出生分支状态

不太可能。根据定义,分支是对当前代码的修改。但是,根据您希望分支的含义,有一些变通方法。您可以签出第一个提交并从中进行分支。这将意味着你们的分支机构落后于历史。您可以签出主节点,从主节点进行分支,删除所有文件,然后提交该分支。这将使支路电流流入history@slebetman这就是我以前做过的,有没有比这更短的方法呢?!斯莱贝特曼的评论包括两种可能的解决方案,你所说的“那个”指的是哪一种?
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)