Jak zachować plik lokalny lub plik zdalny podczas scalania za pomocą Git i wiersza poleceń?

194

Wiem, jak scalić modyfikację za pomocą vimdiff, ale zakładając, że wiem, że cały plik jest dobry do przechowywania lub wyrzucenia, jak to zrobić?

Nie chcę otwierać vimdiff dla każdego z nich, zmieniam polecenie, które mówi „bądź lokalny” lub „trzymaj zdalny”.

EG: Dostałem scalenie z plikami oznaczonymi jako zmienione, ponieważ ktoś otworzył je pod oknami, zmieniając EOL, a następnie zatwierdził. Podczas łączenia chcę zachować własną wersję i odrzucić jego wersję.

Interesuje mnie też coś przeciwnego: spieprzyłem dużo czasu i chcę zaakceptować zdalny plik, odrzucając moje zmiany.

e-satis
źródło

Odpowiedzi:

309

Możesz również:

git checkout --theirs /path/to/file

aby zachować plik zdalny i:

git checkout --ours /path/to/file

zachować plik lokalny.

Potem git addoni i wszystko jest zrobione.

Edycja: pamiętaj, że dotyczy to mergescenariusza. Podczas rebase --theirsodnosi się do gałęzi, w której pracowałeś.

Czekam na Dev ...
źródło
4
Zrobiłem to… ale nic się nie dzieje… skąd mam wiedzieć, że bierze prawidłowy plik? Używam, git version 1.8.4jeśli to ma znaczenie.
Rosdi Kasim
3
dlaczego używa się odwrotnego słowa? Zakładam, że „ich” to zdalny plik, a „nasz” to mój plik
phuclv
1
Tak to jest, @ LưuVĩnhPhúc
Oczekiwanie na Dev ...
7
nie, ich znaczenia są odwrócone stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 ich będą to moje pliki, a nasze są w zdalnej gałęzi
phuclv
6
„Łatwo”, tak. Intuicyjny? Nie.
Wilbur Whateley,
108

Takie podejście wydaje się prostsze, unikając konieczności indywidualnego wybierania każdego pliku:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

lub

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Kopiowane bezpośrednio z: Rozwiąż konflikty scalania Git na korzyść ich zmian podczas ściągania

Keflavich
źródło
3
Kocham tą jedną. Zwłaszcza jeśli jest więcej niż jeden plik.
Tek
Pytanie dotyczyło dwóch różnych poleceń, ale nie ma opisu, co one robią. Co robi każda linia?
Alex
Zanim znalazłem to, przejrzałem co najmniej pięć odpowiedzi na przepełnienie stosu, i tego właśnie chciałem. Dzięki.
Bolton Bailey
14

git checkout {branch-name} -- {file-name}

Spowoduje to użycie pliku z wybranej gałęzi.

Podoba mi się to, ponieważ posh-gitautouzupełnianie działa świetnie z tym. Usuwa również niejasności co do tego, która gałąź jest zdalna, a która lokalna. I --theirstak nie działało dla mnie.

Ben Wilde
źródło
Bez dwuznaczności, działa zarówno dla {mine}, jak i ich, obsługuje dodawanie całych katalogów. To powinna być zaakceptowana odpowiedź.
dotancohen
9

Aby uzyskać informacje na temat końca linii, zobacz man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Pamiętaj, aby dodać autocrlf = falsei / lub safecrlf = falseklon systemu Windows (.git / config)

Korzystanie z git scaletool

Jeśli skonfigurujesz narzędzie do łączenia w ten sposób:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

To proste

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Wykonam robotę

Używanie prostych poleceń git

W innych przypadkach zakładam

git checkout HEAD -- path/to/myfile.txt

powinien załatwić sprawę

Edytuj, aby zrobić odwrotnie (ponieważ spieprzyłeś):

git checkout remote/branch_to_merge -- path/to/myfile.txt
sehe
źródło
+1 za wskazówki, ale nie zaakceptowane, ponieważ nie o to prosiłem. Chcę czegoś, co działa we wszystkich przypadkach, nie tylko w przykładowych przypadkach. Plus „git checkout remote / branch_to_merge - path / to / myfile.txt” nie zadziała, jeśli już rozpocząłeś scalanie: powie, że jesteś w trakcie scalania i uniemożliwi ci to.
e-satis,
1
@ e-satis: to zaskakujące. Uważam, że to błąd, ponieważ kasa ze ścieżką nie jest regularną kasą (i nie wpływa na HEAD). Będę go wypróbować, ponieważ teraz nie mogę w to uwierzyć
sehe
1
@ e-satis: Soooo ... Miałem rację; git checkout remote/branch_to_merge -- path/to/myfile.txtdziała jak urok podczas rozwiązywania konfliktu scalania. (git 1.7.1)
patrz
1
Dodano teraz rozwiązanie oparte na git scaletool
patrz