Git 为什么在重定基址时不移动当前分支?
我目前在Git 为什么在重定基址时不移动当前分支?,git,git-rebase,Git,Git Rebase,我目前在dev分支上,对local/dev分支有一些更改 ... 我确实重新设定了基准: $git-rebase-dev-local/dev 已创建autostash:92915886 应用autostash。 已成功重新设置和更新分离的头部。 提交已重设基础,但未更新dev指针: 阅读曼吉特再基地: 提交在当前分支中所做但不在当前分支中的所有更改 保存到临时区域 **这是第二张图片上标记为的提交 当前分支已重置为 **上游是dev。所以我现在在dev 然后将提交重新应用于当前分支 **
dev
分支上,对local/dev
分支有一些更改
...
我确实重新设定了基准:
$git-rebase-dev-local/dev
已创建autostash:92915886
应用autostash。
已成功重新设置和更新分离的头部。
提交已重设基础,但未更新dev
指针:
阅读曼吉特再基地:
提交在当前分支中所做但不在当前分支中的所有更改
保存到临时区域
**这是第二张图片上标记为
的提交
当前分支已重置为
**上游
是dev
。所以我现在在dev
然后将提交重新应用于当前分支
**提交将重新应用于dev
git push local -f HEAD:dev
为什么dev
指针没有用头移动到顶部?
我应该应用一些选项将当前的dev
移动到头部的顶部吗
更新
这是非常非常严重的。当dev
和local/dev
不一致并且可以被转发时,我的dev
被移动到顶部,因为我需要工作。没有任何额外费用
git branch -f dev
git checkout dev
历史如何看待再基础:
以及在重新设定基础后如何:
本地/dev
是一个远程分支。它不会仅仅因为你想重新设定基准而移动。它将在分离头中完成,然后由您推到本地/dev
git push local -f HEAD:dev
您还可以将dev
移动到HEAD
,然后将其签出:
git branch -f dev
git checkout dev
我找不到自动将dev
分支移动到HEAD
的选项
但在重新设置基址后,我可以返回到dev
,快速前进到c1692f
:
$ git checkout dev
$ git merge --ff-only c1692f
结果如下:
为什么dev
指针没有移动到带有头的顶部因为它在重基期间不是当前分支
仔细阅读这本书。它在第一段中解释:
是以下各项的快捷方式:
git switch local/dev
git rebase dev
重基期间的当前分支为local/dev
;这是唯一一个受再基准影响的分支
*
不需要是分支。任何标识提交的引用(分支、标记、提交、HEAD
、HEAD^2
、HEAD@{1}
等)都可以用作
另一方面,
,需要是一个分支,因为作为重基的结果,它将移动到另一个提交
使现代化
您对文档的解释不正确。你在问题中说:
当前分支被重置为
**上游是dev,所以我现在在dev上
该点上的当前分支不一定是dev
(事实上,它是local/dev
,如上所述)
“当前分支重置为
”并不意味着
成为当前分支,而是意味着当前分支(local/dev
)被移动到
标识的提交。Git在这一点上所做的工作相当于Git重置--hard
更新#2
上面的分析忽略了local/dev
是远程分支这一事实。起初我没有注意到这一点。
为远程本地命名有什么意义?这是误导
因为local/dev
不是本地分支,git-switch-local/dev
使repo处于一种状态。重基的其余部分如文档中所述进行,但最终会有一个新的历史记录行,并且没有指向它的分支(除了HEAD
)。如果切换分支,则重设基础的结果将丢失
有两种方法可以解决问题:
- 在当前提交上移动分支
dev
。有几种方法可以做到这一点,但最简单的方法是使用git branch-f dev
- 放弃更改,切换到
dev
分支,并正确地重新设置基础:
git switch dev
git rebase local/dev
真正的解决办法
总而言之,整个情况之所以出现,是因为您在命令行中以错误的顺序放置了分支。应该是:
git rebase local/dev dev
这将签出dev
分支,然后在local/dev
的顶部移动可从dev
访问和不可从local/dev
访问的提交,同时在移动的提交的顶部保留dev
分支。快速一看,分支dev
似乎是从分支local/dev
的分叉处切下的,然后将该片段嫁接到local/dev
的顶部。如果要移动dev
以获得应用于local/dev
的修订,可以执行以下操作:
git checkout dev
git cherry-pick $( git merge-base HEAD local/dev )..local/dev
这应该可以“重置为上游”并不意味着“签出上游”。要重定基址的分支指向上游分支指向的同一个提交。您只会影响正在重定基址的分支,而不会影响正在重定基址的分支。@LasseV.Karlsen:1。好的,它不会签出到dev
。因此,目前没有分支。man说:然后重新应用到当前分支时是什么意思?2. 您只会影响正在重定基址的分支
。我在上游的local/dev
上重新设置提交的基址。重定基址后的分支local/dev
保持不变。你说它会受到影响是什么意思?谢谢。我不想更改local/dev
。我说的是dev
更是如此。。。您没有要求重新设置dev
,您在那里运行的是要求在dev
之上重新设置local/dev
。如果要在操作完成后将dev设置在当前位置,则需要运行git branch-f dev
。然后你可以考虑检查一下,Voteup,但被接受了
git checkout dev
git cherry-pick $( git merge-base HEAD local/dev )..local/dev