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?
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.
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.
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
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:
$LOCAL
plik w gałęzi, w której scalasz; nietknięty przez proces scalania po wyświetleniu$REMOTE
plik na gałęzi, z której scalasz; nietknięty przez proces scalania, gdy zostanie ci pokazany$BASE
wspólny przodek $LOCAL i $REMOTE, tj. punkt, w którym oba oddziały zaczęły przekierowywać rozważane file;$MERGED
plik częściowo scalony, z konfliktami; jest to jedyny plik dotknięty przez proces scalania i w rzeczywistości nigdy nie pokazany wmeld
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
.
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
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:
Zamiast Meld >=1.7 proponuję jedno z dwóch innych rozwiązań.
Pierwsze rozwiązanie :
meld $LOCAL $BASE $REMOTE --auto-merge
Drugie rozwiązanie :
meld $LOCAL $MERGED $REMOTE
.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
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
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.
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
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