Rozwiązywanie konfliktu Gita z plikami binarnymi

Używam Git na Windows (msysgit) do śledzenia zmian w niektórych pracach projektowych, które wykonywałem.

Dzisiaj pracowałem na innym komputerze (ze zdalnym repo brian) i próbuję teraz scalić wykonane dziś edycje z powrotem do mojej zwykłej lokalnej wersji na moim laptopie.

Na moim laptopie, użyłem git pull brian master, Aby pobrać zmiany do mojej lokalnej wersji. Wszystko było w porządku poza głównym dokumentem InDesign - to pokazuje jako konflikt.

Wersja na PC (brian) jest najnowszy, który chcę zachować, ale nie wiem, jakie polecenia nakazują repo używać tego.

Próbowałem bezpośrednio skopiować plik na mój laptop, ale to chyba przerywa cały proces scalania.

Czy ktoś może wskazać mi właściwy kierunek?
Author: Kevin Wilson, 2008-11-10

9 answers

git checkout przyjmuje opcję --ours lub --theirs w takich przypadkach. Więc jeśli masz konflikt scalania i wiesz, że chcesz tylko Plik z gałęzi, w której się łączysz, możesz to zrobić:

$ git checkout --theirs -- path/to/conflicted-file.txt

Aby użyć tej wersji pliku. Podobnie, jeśli wiesz, że chcesz, aby Twoja wersja (nie ta, która jest scalana), możesz użyć

$ git checkout --ours -- path/to/conflicted-file.txt
 725
Author: mipadi,
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
2017-07-20 22:01:45

Musisz rozwiązać konflikt ręcznie (skopiować plik), a następnie zatwierdzić plik (bez względu na to, czy skopiowałeś go lub użyłeś lokalnej wersji) w następujący sposób

git commit -a -m "Fix merge conflict in test.foo"

Git zwykle wykonuje polecenia automatycznie po połączeniu, ale gdy wykryje konflikty, których sam nie może rozwiązać, stosuje wszystkie łaty, które wymyślił, a resztę pozostawia do ręcznego rozwiązania i zatwierdzenia. Strona podręcznika Git Merge , Git-SVN Crash Course lub ten wpis na blogu może rzucić trochę światło na to, jak to ma działać.

Edit: Zobacz post poniżej, nie musisz sam kopiować plików, ale możesz użyć

git checkout --ours -- path/to/file.txt
git checkout --theirs -- path/to/file.txt

Aby wybrać żądaną wersję pliku. Kopiowanie / edytowanie pliku będzie konieczne tylko, jeśli chcesz mieć mieszankę obu wersji.

Proszę o zaznaczenie odpowiedzi mipadis jako prawidłowej.

 138
Author: VolkA,
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
2011-07-05 15:25:29

Możesz również przezwyciężyć ten problem za pomocą

git mergetool

Co powoduje, że git tworzy lokalne kopie skonfliktowanych binarnych i odtwarza na nich domyślny edytor:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

Oczywiście nie można edytować plików binarnych w edytorze tekstu. Zamiast tego kopiujesz nowy plik {conflicted}.REMOTE nad {conflicted} bez zamykania edytora. Następnie po zamknięciu edytora git zobaczysz, że niedekorowana kopia robocza została zmieniona i Twój konflikt scalania jest rozwiązany w zwykły sposób.

 104
Author: RobM,
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
2018-01-29 09:07:50

Aby rozwiązać problem zachowując wersję w bieżącej gałęzi (zignoruj wersję z gałęzi, w której się łączysz), po prostu dodaj i zatwierdź plik:

git commit -a

Aby rozwiązać problem poprzez nadpisanie wersji w bieżącej gałęzi z wersją z gałęzi, w której się łączysz, musisz najpierw pobrać tę wersję do katalogu roboczego, a następnie dodać / zatwierdzić:

git checkout otherbranch theconflictedfile
git commit -a

Wyjaśnione bardziej szczegółowo

 13
Author: Joshua Flanagan,
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
2010-01-29 17:43:30

Odpowiedź Mipadi nie do końca mi odpowiadała, musiałem to zrobić:

Git checkout --nasza ścieżka / do / pliku.bin

Lub, aby Wersja była łączona w:

Git checkout --ich ścieżka / do / pliku.bin

Then

Git Dodaj ścieżkę / do / pliku.bin

I wtedy znów udało mi się zrobić "git mergetool" i kontynuować kolejny konflikt.

 7
Author: kris,
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-11-24 02:45:01

Z git checkout docs

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
Podczas sprawdzania ścieżek z indeksu, sprawdź stage #2 (ours) lub #3 (theirs) dla niezerowanych ścieżek.

Indeks może zawierać niezerowane wpisy z powodu poprzedniego nieudanego scalenia. Domyślnie, jeśli spróbujesz wymeldować taki wpis z indeksu, operacja kasowania zakończy się niepowodzeniem i nic nie zostanie wymeldowane. Użycie -f zignoruje te niezarejestrowane wpisy. Zawartość z określonej strony scalenia można sprawdzić z indeksu za pomocą --ours lub --theirs. Za pomocą -m zmiany wprowadzone w pliku drzewa roboczego mogą zostać odrzucone, aby odtworzyć oryginalny wynik scalania powodujący konflikt.

 5
Author: user456814,
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-05-30 01:07:13

Natknąłem się na podobny problem (chcąc wyciągnąć commit zawierający niektóre pliki binarne, które powodowały konflikty podczas scalania), ale natknąłem się na inne rozwiązanie, które można zrobić w całości używając Gita (tzn. nie trzeba ręcznie kopiować plików). Pomyślałem, że to tu umieszczę, więc przynajmniej zapamiętam, kiedy będę tego potrzebował. :) Kroki wyglądają tak:

% git fetch

To pobiera najnowsze commity ze zdalnego repozytorium (może być konieczne podanie zdalnej gałęzi nazwa, w zależności od konfiguracji), ale nie próbuje ich scalić. Zapisuje commit w FETCH_HEAD

% git checkout FETCH_HEAD stuff/to/update

To pobiera kopię plików binarnych, które chcę i nadpisuje to, co jest w drzewie roboczym z wersją pobraną ze zdalnej gałęzi. git nie próbuje scalać, więc kończysz z dokładną kopią pliku binarnego ze zdalnej gałęzi. Gdy to zrobisz, możesz dodać / zatwierdzić nową kopię tak jak zwykle.

 3
Author: Brian Webster,
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
2009-07-28 03:57:39

Natknąłem się na dwie strategie zarządzania diff/merge plików binarnych z Git na windows.

  1. Tortoise Git pozwala Ci skonfigurować narzędzia diff/merge dla różnych typów plików w oparciu o ich rozszerzenia. Zob. pkt 2.35.4.3. Diff/Merge Advanced Settings http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html . ta strategia oczywiście opiera się na dostępnych narzędziach diff/merge.

  2. Używając atrybutów git możesz określić narzędzie / polecenie do przekonwertuj plik binarny na tekst, a następnie pozwól domyślnemu narzędziu diff/merge to zrobić. Zobacz http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes . artykuł podaje nawet przykład użycia metadanych do obrazów różnicujących.

Mam obie strategie do pracy z plikami binarnymi modeli oprogramowania, ale zdecydowaliśmy się na Gita tortoise, ponieważ konfiguracja była łatwa.

 1
Author: BoJohDoh,
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-11-27 15:46:40

Jeśli plik binarny jest czymś więcej niż dll lub czymś, co może być edytowane bezpośrednio Jak obraz, lub plik mieszany (i nie trzeba kosza / wybierz jeden plik lub drugi) prawdziwe scalanie będzie takie jak:

Proponuję poszukać narzędzia diff zorientowanego na to, czym jest plik binarny, na przykład są jakieś darmowe dla plików graficznych, na przykład

I porównać je.

Jeśli nie ma narzędzia do porównywania plików, to jeśli masz oryginalny generator pliku bin (tj. istnieje edytor ... podobnie jak blender 3D, możesz następnie ręcznie sprawdzić te pliki, zobaczyć również dzienniki i zapytać drugą osobę, co powinieneś uwzględnić) i wykonaj wyjście plików z https://git-scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend

 1
Author: tyoc213,
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-08-13 21:03:13