Która Wersja pliku git zostanie ostatecznie użyta: lokalna, podstawowa czy zdalna?

Kiedy podczas git merge dochodzi do kolizji, otwieram mergetool o nazwie Meld . Otwiera trzy pliki lokalne, bazowe i zdalne. Jak przeczytałem LOCAL to moja lokalna gałąź, BASE to wspólny przodek, a REMOTE to gałąź do scalenia.

Teraz moje pytanie: Która wersja pliku zostanie ostatecznie użyta? Jest zdalny? Jeśli tak, czy mogę edytować go tak, jak chcę, niezależnie od tego, co znajduje się na przykład w gałęzi BASE?

Author: kenorb, 2012-06-21

8 answers

To ten w środku: BASE.

W rzeczywistości, BASE nie jest wspólnym przodkiem, ale półproduktywnym połączeniem, w którym konflikty są oznaczone >>>> i <<<<.

Możesz zobaczyć nazwy plików na górze okna edycji meld.

Zobacz zrzut ekranu tutaj

baza meld

Możesz edytować plik BASE, jak chcesz, z poleceniami meld lub bez nich.
Możesz również pozbyć się meld i po prostu edytować plik za pomocą ulubionego edytora tekstu.

  • kod pomiędzy znacznikami <<<< HEAD i ===== jest kodem Twojego pliku lokalnego przed scaleniem.
  • kod pomiędzy ==== a >>>> <branch name> jest kodem zdalnego pliku.
 125
Author: Fabien Quatravaux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 14:31:22

Meld ma ukrytą funkcję scalania trójdrożnego aktywowaną przez podanie czwartego parametru:

meld $LOCAL $BASE $REMOTE $MERGED

Prawe i lewe panele są otwierane w trybie tylko do odczytu, więc nie można przypadkowo połączyć się w niewłaściwy sposób. Środkowy panel pokazuje wynik połączenia. W przypadku konfliktów pokazuje wersję podstawową, dzięki czemu można zobaczyć wszystkie ważne bity: oryginalny tekst w środku i sprzeczne modyfikacje po obu stronach. Na koniec, po naciśnięciu przycisku "Zapisz", plik $ scalony jest napisane-dokładnie tak jak oczekiwał git.

~/.plik gitconfig, którego używam zawiera następujące ustawienia:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

To otwiera meld z 3 zakładkami, 1. i 2. Zakładka zawierająca proste diffy, które próbuję scalić, a 3. zakładka, Otwarta domyślnie, pokazuje 3-way merge view.

powodem, dla którego funkcja jest ukryta, jest to, że nie jest jeszcze wystarczająco dopracowana. Jest to bardzo przydatne, jak to jest teraz, ale Kai Willadsen, autor meld, wskazał na kilka zmarszczek, które wymagają prasowania. Na przykład nie ma GUI do uruchomienia 3-way merge mode, składnia wiersza poleceń jest nieco tajemnicza, i takie. Jeśli mówisz w Pythonie i masz trochę czasu na głowie-wiesz, co robić.

Edytuj: W nowszych wersjach Meld synax nieco się zmienił. Było to w komentarzach, ale należy do odpowiedzi.

Polecenie meld używa teraz opcji --output, więc ostatnia linia z powyższego fragmentu powinna brzmieć:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
 103
Author: Tomek Bury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 11:58:23

Są 4 pliki:

  1. $LOCAL plik w gałęzi, w której scalasz; nietknięty przez proces scalania po wyświetleniu

  2. $REMOTE plik na gałęzi, z której scalasz; nietknięty przez proces scalania, gdy zostanie ci pokazany

  3. $BASE wspólny przodek $LOCAL i $REMOTE, tj. punkt, w którym oba oddziały zaczęły przekierowywać rozważane file;

  4. $MERGED plik częściowo scalony, z konfliktami; jest to jedyny plik dotknięty przez proces scalania i w rzeczywistości nigdy nie pokazany w meld


Plik $MERGED jest Tym, który zawiera <<<<<<, >>>>>>, ===== (i, być może, ||||||) znaczniki (które ograniczają konflikty). ten jest plikiem, który edytujesz ręcznie aby poprawić konflikty.

ręczna edycja konfliktów i wizualna edycja konfliktów są wykonywane na różnych plikach i prezentują różne informacje.

Podczas korzystania z mergetool (Załóżmy meld), pliki, które w nim są: $LOCAL, $BASE, $REMOTE. Zauważ, że nie widzisz pliku $MERGED, chociaż jest on przekazywany jako ukryty parametr do meld, Aby zapisać tam wynik edycji.

Innymi słowy, w meld edytujesz plik w środku, $BASE plik, a wszystkie zmiany wybieramy z lewej lub z prawej ręcznie . Jest to czysty plik, nie dotykany przez proces scalania. Jedyną wadą jest to, że podczas zapisywania nie zapisujesz pliku $BASE, ale w czwartym ukrytym parametrze meld, czyli pliku $MERGED (którego nawet nie widzisz). Plik $BASE nie zawiera żadnych konfliktów lub częściowych udanych połączeń, ponieważ nie jest plikiem $MERGED .

W edycji wizualnej, gdy przedstawienie pliku $BASE (zamiast pliku $MERGED) git zasadniczo odrzuca wszystkie próby scalenia (próby te są widoczne, jeśli chcesz, w pliku $ MERGED) i pozwala całkowicie wykonać scalanie od zera .

najważniejsze jest to, że w ręcznych i wizualnych konfliktach scalania nie patrzysz na te same pliki, ale końcowy wynik jest zapisany w tym samym pliku (czyli pliku $MERGED).

Instrukcja korekta konfliktów odbywa się na $MERGED, ponieważ git nie ma znaczenia, aby przedstawić Ci trzy pliki, więc wycisza informacje z trzech plików ($LOCAL, $BASE, $REMOTE) w tym pliku $MERGED.

Ale narzędzia wizualne mają środki , aby pokazać ci trzy pliki: pokazują $LOCAL, $BASE, $REMOTE Pliki. Wybierasz zmiany z plików $LOCAL i $REMOTE i wprowadzasz je do pliku $BASE, całkowicie przebudowując, a nawet nadpisując nieudane próba scalenia pliku $MERGED.

 47
Author: user1284631,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 21:14:56

Rozwiązanie Cosmina działa, ale Plik $BASE jest aktualizowany-nie $ MERGED . Spowoduje to aktualizację pliku $ MERGED :

v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE
 15
Author: Saad Malik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 07:28:15

Z Meld 1.7 rozwiązanie Tomka Bury już nie działa.

Domyślne ustawienia mnie nie zadowoliły:

Ustawienia domyślne

Zamiast Meld >=1.7 proponuję jedno z dwóch innych rozwiązań.

Pierwsze rozwiązanie :

 meld $LOCAL $BASE $REMOTE --auto-merge

pierwsze rozwiązanie

Drugie rozwiązanie :

 meld $LOCAL $MERGED $REMOTE

drugie rozwiązanie

.gitconfig

Skopiuj i wklej to do pliku .gitconfig, Aby uzyskać rozwiązania zgodnie z opisem powyżej:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

Skopiuj i wklej to do pliku .gitconfig.local, aby ustawić meld17 lub meld16 tylko dla tego urządzenia w przypadku, gdy używasz swojego .gitconfig na wielu maszynach:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17
 13
Author: lumbric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-01 20:23:47

Stwierdziłem, że żaden z wyświetlonych domyślnych plików nie został zapisany. meld pokazywał $LOCAL, $REMOTE i $BASE domyślnie. Aby to zadziałało, musiałem zrobić program meld $MERGED zamiast $BASE. Wstawienie tego w moim ~/.gitconfig naprawiło to dla mnie:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

Używam Arch, z:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1
 11
Author: Thomas Leonard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 17:11:34

Z jakiegoś powodu najnowsze wersje meld nie wyświetlają linii znaczników dodanych do konfliktów (>>>>>>) . Jeśli chcesz zobaczyć te linie, powinieneś zainstalować meld v 1.3.3 lub poprzedni.

 2
Author: wnasich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 19:02:26

Proszę zobaczyć odpowiedź Saada, aby uzyskać poprawną odpowiedź.

Z meld 1.8.1 na Ubuntu otrzymałem

Błędna liczba argumentów dostarczanych do --diff

I dodanie --output przed $MERGED naprawiło to dla mnie:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
 2
Author: cosmin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 09:51:14