Rebase действует иначе, чем ожидалось - PullRequest
0 голосов
/ 07 сентября 2018

Следующая ситуация: две ветви, upstream-dev и personal-dev, которые сильно различаются из-за еще не объединенных или отклоненных функций.

Затем я создаю новую ветку функций в personal-dev. Я делаю некоторые коммиты, тестирую и т. Д. В конце я хочу переместить ветвь функции в upstream-dev, чтобы правильно создать запрос на загрузку на github.

Но git также проводит много изменений и различий между personal-dev и upstream-dev? Это почему? Я, хотя rebase, принимает коммиты ветви и повторно применяет их в другой ветке.

Хотя я могу совершенно точно выбрать список коммитов из моей ветки функций. Это работает без дальнейшего ручного взаимодействия.

Графика:

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

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

Ветка функции: [K -> A -> L -> B -> M] -> C -> D -> E

Ожидаемое поведение при перебазировании: [K -> L -> M] -> C -> D -> E <- функциональная ветвь </p>

На самом деле происходит: [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», где я добавил одну строку комментария.

1 Ответ

0 голосов
/ 07 сентября 2018

Некоторые замечания:

  • коммиты, которые вы называете "L" и "M" как в удаленном, так и в локальном клоне, не одинаковы: вы должны увидеть разные sha хэши для коммита "L в удаленном" и "L в локальном" "

  • влияние таково: когда git rebase ищет начальную точку между двумя ветвями, она использует "K" в качестве начальной точки (не "M")

  • git rebase пытается угадать, какие коммиты уже применены, а какие нет, глядя на разность, генерируемую последовательными коммитами: в вашем случае это выглядит так, как будто (правильно) исключает ваш локальный "L" "и" M "фиксирует, и (правильно) находит, что" A "и" B "должны быть применены

  • перебазированная ветка должна выглядеть так:

     [K -> L -> M] -> A->B -> C->D->E
    

    (это так?)


Вот способ сказать git "только повторные коммиты из M (исключая M) в E на upstream-dev":

git rebase --onto upstream-dev M E
...