Rebase 的行为与预期不同
Rebase acts differently as expected
以下情况:upstream-dev 和 personal-dev 两个分支,由于尚未合并或拒绝的功能,差异很大。
然后我在 personal-dev 上创建一个新的功能分支。我做了一些提交、测试等。最后,我想将功能分支重新定位到 upstream-dev 以在 github.
上正确创建拉取请求
但是 git 也带来了 personal-dev 和 upstream-dev 之间的许多变化和差异?这是为什么?我虽然 rebase 接受了一个分支的提交并将它们重新应用到另一个分支。
我可以从我的功能分支中完美地挑选提交列表。无需进一步手动交互即可工作。
图形:
K -> L -> M <-- 上游开发
K -> A -> L -> B -> M <-- 个人开发
功能分支:
[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 做的事吗?或者 rebase 只是为了包含来自分支的更新提交,功能分支最初是从哪里派生的?
我在 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”,但我只更改了“setup.php”,我在其中添加了一个注释行.
一些评论:
您在远程和本地克隆中命名为 "L" 和 "M" 的提交不相同:您应该看到提交的不同 sha 哈希值 "L in remote" 和 "L on local"
影响是:git rebase
在两个分支之间寻找起点时,以"K"为起点(不是"M")
git rebase
试图通过查看连续提交生成的差异来猜测哪些提交已被应用,哪些尚未应用:在您的情况下,它看起来像(正确) 排除你的本地 "L" 和 "M" 提交,并且(正确地)发现应该应用 "A" 和 "B"
重新设置分支应该如下所示:
[K -> L -> M] -> A->B -> C->D->E
(是这样吗?)
这里有一个方法可以告诉 git "only replay commits from M (excluding M) to E onto upstream-dev" :
git rebase --onto upstream-dev M E
以下情况:upstream-dev 和 personal-dev 两个分支,由于尚未合并或拒绝的功能,差异很大。
然后我在 personal-dev 上创建一个新的功能分支。我做了一些提交、测试等。最后,我想将功能分支重新定位到 upstream-dev 以在 github.
上正确创建拉取请求但是 git 也带来了 personal-dev 和 upstream-dev 之间的许多变化和差异?这是为什么?我虽然 rebase 接受了一个分支的提交并将它们重新应用到另一个分支。
我可以从我的功能分支中完美地挑选提交列表。无需进一步手动交互即可工作。
图形:
K -> L -> M <-- 上游开发
K -> A -> L -> B -> M <-- 个人开发
功能分支: [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 做的事吗?或者 rebase 只是为了包含来自分支的更新提交,功能分支最初是从哪里派生的?
我在 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”,但我只更改了“setup.php”,我在其中添加了一个注释行.
一些评论:
您在远程和本地克隆中命名为 "L" 和 "M" 的提交不相同:您应该看到提交的不同 sha 哈希值 "L in remote" 和 "L on local"
影响是:
git rebase
在两个分支之间寻找起点时,以"K"为起点(不是"M")git rebase
试图通过查看连续提交生成的差异来猜测哪些提交已被应用,哪些尚未应用:在您的情况下,它看起来像(正确) 排除你的本地 "L" 和 "M" 提交,并且(正确地)发现应该应用 "A" 和 "B"重新设置分支应该如下所示:
[K -> L -> M] -> A->B -> C->D->E
(是这样吗?)
这里有一个方法可以告诉 git "only replay commits from M (excluding M) to E onto upstream-dev" :
git rebase --onto upstream-dev M E