Rebase的行为与预期不同

问题描述 投票:0回答:1

以下情况:两个分支,上游开发者和个人开发者,由于尚未合并或拒绝的功能而变化很大。

然后我在personal-dev上创建一个新的功能分支。我做了一些提交,测试等。最后,我想将功能分支重新绑定到upstream-dev上,以便在github上正确创建一个pull请求。

但是git拖拽了Personal-dev和upstream-dev之间的很多变化和差异呢?这是为什么?我虽然一个rebase接受一个分支的提交并在另一个分支上重新应用它们。

我可以完美地从我的功能分支中挑选提交列表。无需进一步手动互动即可实现。

显卡:

K - > L - > M < - upstream-dev

K - > A - > L - > B - > M < - personal-dev

特征分支:[K - > A - > L - > B - > M] - > C - > D - > E.

我在变基础时的预期行为:[K - > L - > M] - > C - > D - > E < - 特征分支

实际上发生了:[K - > A - > L - > B - > M] - > C - > D - > E(我在github上看到PR试图不仅将C,D和E合并到上游,而且是个人承诺像A和B一样。

我能以某种方式做我想做的事情吗?或者仅仅是为了包含来自分支的更新提交,特征分支最初是由派生出来的?

我对rebase功能有什么问题?

感谢帮助!

编辑:这里展示了我正在尝试做的事情。它是用德语写的,但我可以从你看到的命令,我做的以及它出错了。

$ git checkout develop 
Zu Branch 'develop' gewechselt
Ihr Branch ist auf demselben Stand wie 'mpw/develop'.
$ git status
Auf Branch develop
Ihr Branch ist auf demselben Stand wie 'mpw/develop'.

nichts zu committen, Arbeitsverzeichnis unverändert
$ git pull
Bereits aktuell.
$ git branch testrebase
$ git checkout testrebase 
Zu Branch 'testrebase' gewechselt
$ vim application/Controller/RunController.php 
$ git add application/Controller/RunController.php
$ git commit -m 'Testcommit'
[testrebase 184aae08] Testcommit
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git status
Auf Branch testrebase
nichts zu committen, Arbeitsverzeichnis unverändert
$ git checkout hotfix/v0.17.18 
Zu Branch 'hotfix/v0.17.18' gewechselt
Ihr Branch ist auf demselben Stand wie 'origin/hotfix/v0.17.18'.
$ git rebase hotfix/v0.17.18 testrebase 
Zunächst wird der Branch zurückgespult, um Ihre Änderungen
darauf neu anzuwenden ...
Erzeuge Patches: 100% (15/15), Fertig.
Wende an: remove psd files bloating application size
Wende an: merge commit
Verwende Informationen aus der Staging-Area, um ein Basisverzeichnis nachzustellen ...
M   application/Controller/RunController.php
M   application/Library/Functions.php
M   application/Library/Session.php
M   application/Model/Email.php
M   application/Model/Page.php
M   application/View/public/error.php
M   application/View/public/run/index.php
M   setup.php
.git/rebase-apply/patch:76: trailing whitespace.

warning: 1 Zeile fügt Whitespace-Fehler hinzu.
Falle zurück zum Patchen der Basis und zum 3-Wege-Merge ...
automatischer Merge von setup.php
KONFLIKT (Inhalt): Merge-Konflikt in setup.php
error: Merge der Änderungen fehlgeschlagen.
Anwendung des Patches fehlgeschlagen bei 0002 merge commit
Benutzen Sie 'git am --show-current-patch', um den
fehlgeschlagenen Patch zu sehen.

Lösen Sie alle Konflikte manuell auf, markieren Sie diese mit
"git add/rm <konfliktbehaftete_Dateien>" und führen Sie dann
"git rebase --continue" aus.
Sie können auch stattdessen diesen Commit auslassen, indem
Sie "git rebase --skip" ausführen.
Um abzubrechen und zurück zum Zustand vor "git rebase" zu gelangen,
führen Sie "git rebase --abort" aus.

$ git status
Rebase im Gange; auf adaffc5f
Sie sind gerade beim Rebase von Branch 'testrebase' auf 'adaffc5f'.
  (beheben Sie die Konflikte und führen Sie dann "git rebase --continue" aus)
  (benutzen Sie "git rebase --skip", um diesen Patch auszulassen)
  (benutzen Sie "git rebase --abort", um den ursprünglichen Branch auszuchecken)

Nicht zusammengeführte Pfade:
  (benutzen Sie "git reset HEAD <Datei>..." zum Entfernen aus der Staging-Area)
  (benutzen Sie "git add/rm <Datei>...", um die Auflösung zu markieren)

    von beiden geändert:    setup.php

keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")
$ git rebase --abort

正如你所看到的,它抱怨“setup.php”由两者编辑,虽然我只更改了“application / Controller / RunController.php”,在那里我添加了一条注释行。

git rebase cherry-pick
1个回答
2
投票

一些评论:

  • 你在远程和本地克隆中命名为“L”和“M”的提交都不一样:你应该看到提交“L in remote”和“L on local”的不同sha哈希值
  • 影响是:当git rebase寻找两个分支之间的起点时,它使用“K”作为起点(不是“M”)
  • git rebase试图猜测哪些提交已经被应用,哪些没有通过查看连续提交生成的差异:在你的情况下,看起来它(正确)排除你的本地“L”和“M”提交,并且(正确地)发现应该应用“A”和“B”
  • 重新分支应该看起来像: [K -> L -> M] -> A->B -> C->D->E (这是这种情况吗?)

这是一种告诉git“只允许从M(不包括M)重放提交到E到上游-dev”的方法:

git rebase --onto upstream-dev M E
© www.soinside.com 2019 - 2024. All rights reserved.