如何创建零个先前提交的分支?

时间:2020-07-06 23:35:08

标签: git github

我搞砸了git分支。当我使用此命令git checkout -b todo创建新分支时,请进行特定更改,然后进行commit + pull request。当我想创建另一个git checkout -b todo-other分支来处理其他事务并应用commit + pull request时,我发现todo分支中的先前提交与新的{{1 }} commits todo-other

当我从pull request.分支中执行pull request时,我只希望在该分支中找到新的todo-other。我该如何处理?

2 个答案:

答案 0 :(得分:2)

默认情况下,git checkout -bHEAD开始,即当前分支,在这种情况下,该分支在todos中。

您可以通过将特定分支附加到命令来强制将其作为基础:

git checkout -b todo-other master

答案 1 :(得分:1)

您专门询问了一个分支,该分支没有 no 个先前的提交,但这不是您想要的。

更准确地说,个分支与大多数其他分支共享个提交。

它可以帮助大多数人绘制提交图。这样做的原因是,在Git中,每个提交都会记住其先前的提交或 parent 提交。这使得提交(如分支发现)为长序列或链状,如下所示:

... <-F <-G <-H   <-- branch1
               \
                I <-J <-K   <-- branch2

每个提交都有唯一的哈希ID。 (这些大写字母代表实际的哈希ID,您在git log输出中看到了这些ID,但它们太大又难看,以至于人类无法使用。)

提交本身具有这些哈希ID。 分支名称(例如branch1branch2),请记住一个哈希ID,这是名称指向的特定提交,但该提交本身会记住其父级的哈希ID。因此,通过使用名称 branch1,我们(或Git)可以快速找到提交H。但是从提交H开始,Git可以向后工作以提交G,然后提交F,依此类推。

通常,我们可能在分支master上进行一系列提交,并以某些特定的哈希H结尾:

...--G--H   <-- master

由此,我们可以创建两个功能分支。实际上,我们首先将两个要素分支都创建为,以直接标识提交H

...--G--H   <-- master, feature1, feature2

然后我们告诉Git,我们要使用feature1或(自Git 2.23起)git checkout 使用名称git switch。我们可以这样绘制结果:

...--G--H   <-- master, feature1 (HEAD), feature2

然后,我们以通常的方式进行新提交(编辑文件git add,运行git commit)。 Git进行新的提交,并为其赋予一个新的唯一的哈希ID(一个新的丑陋数字),但我们将其称为I

          I   <-- feature1 (HEAD)
         /
...--G--H   <-- master, feature2

Git更新特殊名称HEAD所附加的名称。在这种情况下为feature1。因此,名称feature1现在指向新的提交I。两个名称feature2master仍指向提交H

如果我们在feature1上进行第二次提交,Git将更新 name 以指向新的提交:

          I--J   <-- feature1 (HEAD)
         /
...--G--H   <-- master, feature2

如果我们现在运行git checkout feature2git switch feature2,Git将把HEAD上的feature1移走,并将其附加到feature2上。我们将再次使用提交H中的内容:

          I--J   <-- feature1
         /
...--G--H   <-- master, feature2 (HEAD)

如果我们现在进行两次新的提交KL,我们将得到:

          I--J   <-- feature1
         /
...--G--H   <-- master
         \
          K--L   <-- feature2 (HEAD)

如果我们将这两个分支中的一个或两个发送到另一个Git(例如GitHub上的一个),并打开审阅请求,则审阅请求似乎只为I-J提交feature1,并且K-Lfeature2。但是实际上,通过H进行的提交现在位于所有三个分支上。 GitHub只是向我们显示了在“基本分支”(master)上 没有的拉取请求中的那些。

因此,您想要告诉Git您的新分支(无论被称为什么)都将使用其他名称标识的提交来创建-也许master,但也许更好,{{1 }}或origin/master。如您所建议,您可以使用:

... origin/develop然后git checkout master ...

或与git checkout -b other等效的内容。您可以使用:

git switch

或:

git checkout -b other master

(但是如果您的git switch -c other master 落后了,您可能还是要在这里使用origin/master)。

相关问题