我不确定是否搞砸了。我有一个看起来像这样的本地存储库,头上有一个分离的头
:我正在尝试从v0.03标签中分离出一个devel分支,并从devel分支中分离出pscott-au分支。
我做到了:
git checkout master (moved head back to tip)
git branch devel
git reset --hard 0060 (this is where the HEAD was in the picture at v0.03)
git co devel
git co master
所以现在我有一个如下所示的仓库:
我想移动pscott-au,使它脱离倾斜。然后,我想将这些更改同步到GitHub。我对如何进行操作有些迷惑,因为我不确定是否将第一部分搞砸了。
答案 0 :(得分:2)
无论价值多少,pscott-au
已经分支到devel
。它还分支到master
。好吧,因为它分支了任何东西,也就是说,根本没有。 :-)
事实是分支名称只是充当提交的指针。提交是图中的圆形圆圈。
承诺永远不会改变或动摇;他们的联系永远不会改变或移动。 (您可以在其中绘制它们/将它们拖到不同的位置,但是在这种情况下,它们的连接也会随之拖动,因此,即使外观不同,它也表示同一张图。)> 另一方面,
分支名称一直在移动。分支名称只记住一个特定的提交,Git将其称为分支的提示。提交可以在某一时刻成为分支的尖端,然后在下一时刻位于分支的某个深处,或者根本不包含在分支中。这就是当您将名称master
移回以使其指向现在也标记为v0.03
的提交时发生的情况。
使分支名称成为的原因是……好吧,实际上,它的内部拼写是refs/heads/name
,但是键 feature <分支名称的/ em>是,您可以运行git checkout name
,然后运行以git commit
结尾的各种操作。 commit命令进行一次 new 提交(图上的新圆形节点),其父连接返回到您之前签出的提交;然后,在git commit
过程的最后,Git调整 name ,使其指向您刚刚进行的新提交!
各种origin/*
名称是您本地的Git记忆在GitHub上存储在 other Git存储库中的分支名称的位置的方式,这是本地Git上次调用GitHub的位置吉特您可以使用git fetch
从其他Git获得它们。您要求或告诉另一个Git使用git push
来更改它们,就像git push flags origin name1 name2 ...
一样。如果您建议的更改是快进操作,他们将服从请求。 flags
可以包含--force
使其成为命令,而不是礼貌的请求(尽管他们仍然可以违背命令);如果您要进行的更改不是快进
--force-with-lease
)。
您要在此处进行的更改不是一项快进操作,因此您将需要运行git push --force origin devel master
。这将向他们发送您没有的任何新提交(不是,因此非常快),然后命令他们将其devel
设置为其中一个提交(即使请求也可以执行) ),并命令他们将master
设置为另一个(如果您是该存储库的管理员或根据您告诉GitHub强制执行的任何规则进行了授权,他们将服从该命令。)
一旦您的Git知道他们的Git接受了此新名称创建和master
-名称更改,您的Git就会将origin/devel
添加到您的远程跟踪名称中,并移动您的{{ 1}}来记住他们同意用于其origin/master
的提交。
答案 1 :(得分:1)
您已对master
进行了一次硬重置,以将其移回origin/master
之前(忽略>origin/master
;我不知道那是什么,但这很奇怪)。
通常,这是一个坏主意,因为它会重写历史记录,并且默认情况下会被拒绝。您可以通过强制推送来覆盖它(如果确实有此意图),但是它可能会使使用同一存储库的其他任何人烦恼。幸运的是,在这种特定情况下,只要您还推动devel分支,提交实际上就不会丢失(但是,如果您不小心,在其他情况下也可能会丢失)。
要回答您的直接问题:要将pscott-au分支上的两个附加提交移动到devel分支,可以执行以下序列:
git co pscott-au
git rebase devel
此也被视为历史重写,因此需要强制推送到Github。如果您非常确定是您想要的,则可以执行以下操作:
git push origin devel
git push -f origin master pscott-au