问题描述
我目前在dev
分支上,并且在local/dev
分支上有一些更改。
我确实做了基准调整
$ git rebase dev local/dev
Created autostash: 92915886
Applied autostash.
Successfully rebased and updated detached HEAD.
提交已重新设置,但dev
指针未更新:
阅读man git rebase
:
由当前分支中的提交所做的所有更改,但不在
中的所有更改 保存到临时区域
**这是在第二张图片上标记为>
的提交
当前分支重置为 ...
** upstream
是dev
。所以我目前在dev
上
然后将提交重新应用于当前分支
**提交重新应用于dev
为什么 是否应该应用一些选项将当前的 更新 dev
的指针没有被HEAD
移到顶部?
dev
与HEAD
移到顶部?
这是非常非常的阶段。当dev
和local/dev
的班轮不同并且可以转发时,我的dev
会在我期望的工作位置上移动。没有任何额外的git branch -f dev
git checkout dev
解决方法
local/dev
是一个远程分支。它不会仅仅因为您想对其重新设置基准而移动。该操作将在detached HEAD
中完成,然后由您决定将其插入local/dev
git push local -f HEAD:dev
您还可以将dev
移至HEAD
,然后将其签出:
git branch -f dev
git checkout dev
,
为什么dev
指针没有被HEAD
移动到顶部? –因为它在重新设置基准时不是当前分支。 / p>
仔细阅读documentation of git rebase
。它在第一段中说明:
git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase> | --keep-base] [<upstream> [<branch>]]`
如果指定了
<branch>
,则git rebase
将自动执行git switch <branch>
,然后再执行其他操作。否则,它将保留在当前分支上。
用简单的英语来说,如果git rebase
被两个分支(<upstream>
和<branch>
)调用,它将首先切换到第二个分支,然后将其重新建立在第一个分支之上。 sup> *
这意味着:
git rebase dev local/dev
是以下操作的快捷方式:
git switch local/dev
git rebase dev
rebase期间的当前分支为local/dev
;这是唯一受rebase影响的分支。
* <upstream>
不必是分支。标识提交的任何引用(分支,标签,提交,HEAD
,HEAD^2
,HEAD@{1}
等)都可以用作<upstream>
。
<branch>
需要成为一个分支,因为作为重新设置的结果,它将移至其他提交。
更新
您错误地解释了文档。您在问题中说:
当前分支重置为
<upstream>
...**上游是dev。所以我现在在开发上
该点上的当前分支不一定是dev
(实际上是如上所述的local/dev
)。
“当前分支重置为<upstream>
” 并不意味着<upstream>
成为当前分支,而是当前分支(local/dev
)已移动<upstream>
标识的提交。此时Git所做的等同于git reset --hard <upstream>
。
更新#2
以上分析忽略了local/dev
是一个远程分支的事实。一开始我没注意到。
命名远程local
有什么意义?这是一种误导。
由于local/dev
不是本地分支,因此git switch local/dev
使存储库处于detached HEAD
状态。其余的重新配置按照文档中的说明进行,但是最后您有了新的历史记录行,并且没有指向它的分支(HEAD
除外)。如果切换分支,则重新设置的结果将丢失。
有两种解决方法:
-
在当前提交上移动分支
dev
。有几种方法可以做到这一点,但最简单的方法是使用git branch -f dev
。 -
放弃更改,切换到
dev
分支并正确进行变基:git switch dev git rebase local/dev
真正的解决方案
总而言之,由于您在命令行中以错误的顺序放置了分支,因此出现了整个情况。应该是:
git rebase local/dev dev
这会检出dev
分支,然后将可从dev
访问的提交和从local/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
那应该做
,我找不到自动将dev
分支移动到HEAD
的选项。
但是在重新设置基准之后,我可以签出回到dev
,并快进到c1692f
:
$ git checkout dev
$ git merge --ff-only c1692f