/ / Dlaczego Mercurial czasami pozwala na połączenie z przodkiem? - mercurial, merge, branch, dvcs

Dlaczego Mercurial czasami pozwala na łączenie się z przodkiem? - mercurial, merge, branch, dvcs

Jestem zdziwiony ta historia repozytorium. Na tej stronie zobaczysz mały oddział file-content który jest połączony z powrotem do oddziału default chociaż jedna głowa była przodkiem drugiej.

Kiedy próbuję zrobić coś podobnego, otrzymuję wiadomość o przerwaniu, chyba że

  1. gałąź boczna jest zamknięta i
  2. Łączę się od przodka do zamkniętej głowy gałęzi (ale nie na odwrót). (W tym repo chwycie, file-content gałąź jest oznaczona jako nieaktywna, nie zamknięta). </ strike>

Edytuj: rzeczywiste warunki, w których można łączyć się z przodkiem, opisano w mojej odpowiedzi.

Co się tutaj dzieje?

Odpowiedzi:

3 dla odpowiedzi № 1

Nie ma żadnego technicznego powodu, dla którego nie można się połączyćz przodkiem: jak się dowiedziałeś, Mercurial wspiera go w pewnych okolicznościach, więc jest to wyłącznie ograniczenie GUI. Rozumowanie tego jest takie, że kiedy hg update dałby taki sam wynik, jak hg merge, powinieneś użyć tego zamiast tego dla uproszczenia.

ZA łączyć to tylko połączenie trzech stanów repozytorium: wspólny przodek i dwa zestawy zmian, które łączysz Łączenie trzykierunkowe odbywa się w oparciu o porcję podstawową. Tabela łączenia lokalnego ze zdalnym wygląda następująco:

ancestor  local  remote -> merge
old       old    old       old (nobody changed the hunk)
old       new    old       new (I changed the hunk)
old       old    new       new (you changed the hunk)
old       new    new       new (hunk was cherry picked onto both branches)
old       foo    bar       <!> (conflict, both changed hunk but differently)

Gdyby local jest przodkiem remote, następnie ancestor == local. Stół staje się:

ancestor  local  remote -> merge
old       old    old       old (nobody changed the hunk)
old       old    new       new (you changed the hunk)

W obu przypadkach merge kolumna zawiera to, co było w remote kolumna. W twoim przykładzie local jest default i remote jest file-content:

$ hg update default
$ hg merge file-content

Rezultatem jest zestaw zmian scalania, który wygląda tak samo file-content.


3 dla odpowiedzi № 2

Jest to dziwnie słabo udokumentowane, ale jeśli skorzystasz z linku na dole https://www.mercurial-scm.org/wiki/Merge, zobaczysz tam wyjątek od reguły przeciwko łączeniu się z przodkiem. Nie wymaga to, aby potomek był zamkniętą gałęzią, jak początkowo przypuszczałem.

  1. Musisz połączyć się z przodkiem (tzn. Katalog roboczy musi zostać zaktualizowany do elementu nadrzędnego, a nie do innego zestawu zmian)
  2. Nazwy gałęzi rodzica katalogu roboczego i zestawu zmian, z którymi się łączysz, muszą się różnić. Na przykład. jedna ma domyślną nazwę gałęzi, druga ma nazwę-funkcji

To, co nam to pozwala, to możliwość uruchomienia nowego oddziału i scalenia go z powrotem, nawet jeśli nie wykonujemy żadnej pracy w pierwotnym oddziale w międzyczasie.