我搞砸了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
。我该如何处理?
答案 0 :(得分:2)
默认情况下,git checkout -b
从HEAD
开始,即当前分支,在这种情况下,该分支在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。 分支名称(例如branch1
或branch2
),请记住一个哈希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
。两个名称feature2
和master
仍指向提交H
。
如果我们在feature1
上进行第二次提交,Git将更新 name 以指向新的提交:
I--J <-- feature1 (HEAD)
/
...--G--H <-- master, feature2
如果我们现在运行git checkout feature2
或git switch feature2
,Git将把HEAD
上的feature1
移走,并将其附加到feature2
上。我们将再次使用提交H
中的内容:
I--J <-- feature1
/
...--G--H <-- master, feature2 (HEAD)
如果我们现在进行两次新的提交K
和L
,我们将得到:
I--J <-- feature1
/
...--G--H <-- master
\
K--L <-- feature2 (HEAD)
如果我们将这两个分支中的一个或两个发送到另一个Git(例如GitHub上的一个),并打开审阅请求,则审阅请求似乎只为I-J
提交feature1
,并且K-L
仅feature2
。但是实际上,通过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
)。