Mam trochę plików lokalnych, ściągam ze zdalnej gałęzi i są konflikty. Wiem, że chciałbym zachować moje lokalne zmiany i zignorować zmiany zdalne powodujące konflikty. Czy istnieje polecenie, którego mogę użyć, aby powiedzieć „oznacz wszystkie konflikty jako rozwiązane, użyj lokalnego”?
git
merge
conflict
git-merge-conflict
Tom DeMille
źródło
źródło
Odpowiedzi:
git checkout
ma--ours
opcję sprawdzenia wersji pliku, który miałeś lokalnie (w przeciwieństwie do--theirs
wersji, którą ściągnąłeś). Możesz przejść,.
abygit checkout
powiedzieć mu, aby sprawdził wszystko w drzewie. Następnie należy oznaczyć konflikty jako rozwiązane, co można zrobićgit add
, i po zakończeniu zlecić swoją pracę:Zwróć uwagę
.
nagit checkout
polecenie. To bardzo ważne i łatwe do pominięcia.git checkout
ma dwa tryby; jeden, w którym przełącza gałęzie, i jeden, w którym sprawdza pliki z indeksu do kopii roboczej (czasami najpierw wyciągając je do indeksu z innej wersji). Wyróżnia go to, czy podałeś nazwę pliku; jeśli nie podałeś nazwy pliku, spróbuje zamienić gałęzie (chociaż jeśli nie podasz też gałęzi, po prostu spróbuje ponownie sprawdzić bieżącą gałąź), ale odmawia tego, jeśli istnieją zmodyfikowane pliki to by miało wpływ. Jeśli więc chcesz zachować zachowanie, które zastąpi istniejące pliki, musisz przekazać.
lub nazwę pliku, aby uzyskać drugie zachowaniegit checkout
.Dobrym nawykiem jest także przekazywanie nazwy pliku, aby to zrównoważyć
--
, npgit checkout --ours -- <filename>
. Jeśli tego nie zrobisz, a nazwa pliku pasuje do nazwy gałęzi lub znacznika, Git pomyśli, że chcesz sprawdzić tę wersję, zamiast sprawdzić nazwę pliku, i użyj pierwszej formycheckout
polecenia .Rozwińę trochę, jak konflikty i scalanie działają w Git. Kiedy scalasz się w czyimś kodzie (co dzieje się również podczas ściągania; ściąganie to w zasadzie pobranie, a następnie scalenie), istnieje kilka możliwych sytuacji.
Najprostsze jest to, że korzystasz z tej samej wersji. W tym przypadku „jesteś już na bieżąco” i nic się nie dzieje.
Inną możliwością jest to, że ich wersja jest po prostu twoją potomką, w takim przypadku domyślnie będziesz miał „szybkie przewijanie do przodu”, w którym twój
HEAD
jest właśnie aktualizowany do zatwierdzenia, bez łączenia się (to można wyłączyć, jeśli naprawdę chcę nagrać scalenie, używając--no-ff
).Następnie przechodzisz do sytuacji, w których faktycznie potrzebujesz scalić dwie wersje. W takim przypadku istnieją dwa możliwe wyniki. Jednym z nich jest to, że scalanie odbywa się czysto; wszystkie zmiany są w różnych plikach lub w tych samych plikach, ale wystarczająco daleko od siebie, aby oba zestawy zmian można było zastosować bez problemów. Domyślnie, gdy nastąpi czyste scalenie, jest ono automatycznie zatwierdzane, ale możesz to wyłączyć,
--no-commit
jeśli musisz go wcześniej edytować (na przykład, jeśli zmienisz nazwę funkcjifoo
nabar
, a ktoś inny doda nowy wywołujący kodfoo
, scali się czysto , ale produkuj złamane drzewo, więc możesz to wyczyścić w ramach zatwierdzenia scalania, aby uniknąć przerwania zatwierdzeń).Ostateczna możliwość polega na tym, że istnieje prawdziwe scalenie i konflikty. W tym przypadku, Git zrobi tyle scaleniu jak to możliwe, a pliki produkt z markerów konfliktowych (
<<<<<<<
,=======
, i>>>>>>>
) w kopii roboczej. W indeksie (znanym również jako „obszar przejściowy”; miejsce przechowywania plikówgit add
przed ich zatwierdzeniem ) będziesz mieć 3 wersje każdego pliku z konfliktami; istnieje oryginalna wersja pliku pochodząca od przodka dwóch gałęzi, które scalasz, wersja zHEAD
(twojej strony scalania) i wersja ze zdalnego oddziału.Aby rozwiązać konflikt, możesz edytować plik znajdujący się w kopii roboczej, usuwając znaczniki konfliktu i naprawiając kod tak, aby działał. Lub możesz sprawdzić wersję z jednej lub drugiej strony scalenia, używając
git checkout --ours
lubgit checkout --theirs
. Po ustawieniu pliku w żądanym stanie, oznaczasz, że skończyłeśgit add
scalać plik i jest on gotowy do zatwierdzenia za pomocą , a następnie możesz zatwierdzić scaleniegit commit
.źródło
git add --all
dodaje wszystkie pliki do repozytorium, więc może dodać więcej plików, niż zamierzono, chyba że.gitignore
wzorce są w idealnym stanie.git add -u
jest prawdopodobnie bardziej odpowiedni w tej sytuacji, rzadziej wprowadzane są zmiany w plikach śledzonych, których nie chcesz dodawać podczas rozwiązywania scalania.git checkout --ours .
. To.
jest ważne; przekazując nazwę pliku (w tym przypadku cały katalog) wybiera się dwa różne tryby działaniacheckout
, jeden, który przełącza gałęzie i jeden, który przenosi pliki z indeksu do kopii roboczej. Zgadzam się, to bardzo mylące. Możesz takżegit checkout --ours -- <filename>
sprawdzić pojedynczy plik na raz.Upewnij się, że od początku konfliktu: czy jest to wynik o tematyce
git merge
patrz Brian Campbell „s odpowiedź .Ale jeśli jest to wynikiem
git rebase
, aby odrzucić zdalne (ich) zmiany i użyć zmian lokalnych , musisz wykonać:Zobacz „ Dlaczego znaczenie„
ours
”i„theirs
”jest odwrócone” ”, aby zobaczyć, jakours
itheirs
są zamieniane podczas zmiany bazy (ponieważ gałąź nadrzędna jest wyewidencjonowana).źródło