为什么在重定基时当前分支不会移动? 真正的解决方案

问题描述

我目前在dev分支上,并且在local/dev分支上有一些更改。

enter image description here

...

enter image description here

我确实做了基准调整

$ git rebase dev local/dev
Created autostash: 92915886
Applied autostash.
Successfully rebased and updated detached HEAD.

提交已重新设置,但dev指针未更新:

enter image description here

阅读man git rebase

由当前分支中的提交所做的所有更改,但不在中的所有更改 保存到临时区域

**这是在第二张图片上标记为>的提交

当前分支重置为 ...

** upstreamdev。所以我目前在dev

然后将提交重新应用于当前分支

**提交重新应用于dev

为什么dev的指针没有被HEAD移到顶部?

是否应该应用一些选项将当前的devHEAD移到顶部?

更新
这是非常非常的阶段。当devlocal/dev的班轮不同并且可以转发时,我的dev会在我期望的工作位置上移动。没有任何额外的

git branch -f dev
git checkout dev

重新设置基准之前的历史记录如何:

enter image description here

以及重新设置后如何:

enter image description here

解决方法

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>不必是分支。标识提交的任何引用(分支,标签,提交,HEADHEAD^2HEAD@{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

结果如下: enter image description here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...