git - konflikt scalania, gdy lokalny jest usuwany, ale plik istnieje w zdalnym

116

Jestem bardzo nowy w git i zastanawiałem się, jak powinienem zająć się scalaniem, w którym w lokalnym repozytorium usunąłem kilka plików z gałęzi głównej, ale te pliki istnieją w gałęzi zdalnej.

Po wykonaniu git-merge pokazuje konflikty, które wystąpiły.

Używając git gui, pokazuje, że plik lokalny został usunięty, podczas gdy zdalny plik gałęzi ma zawartość.

Jak zapobiec konfliktom tych plików? Czy istnieje prosty sposób korzystania z git gui?

Wielkie dzięki

binarycreations
źródło
W przeszłości jedną rzeczą, którą zrobiłem, było pozostawienie „usuniętych” plików w kontroli źródła, ale wykluczenie ich z projektu / makefile / cokolwiek. Jest to przynajmniej dobre tymczasowe obejście konfliktów scalania.
Mark Rushakoff
2
Naprawiasz to w ten sam sposób, w jaki naprawiasz każdy konflikt scalania: dodaj żądaną wersję (plik lub brak pliku) do indeksu, a następnie zatwierdź. Który chcesz?
Cascabel
@MarkRushakoff Chciałbym przeformułować twoją radę tak, że „kiedy napotkam sytuację, w której muszę rozwiązać konflikt, po prostu nie rozwiązuję ich naprawdę, po prostu je maskuję, aby ugryźli kogoś (prawdopodobnie nie mnie) w przyszłości”. To naprawdę dobra rada dla kogoś, kto chciałby wnieść więcej problemów do projektu.
Victor Yarema

Odpowiedzi:

155

Powinieneś rozwiązać konflikty według własnego uznania. Jeśli plik naprawdę ma zostać usunięty i zamierzasz opublikować tę zmianę w miejscu pochodzenia, usuń ją ponownie:

git rm path/to/file

Jeśli plik ma być nadal śledzony, dodaj go (wersja w drzewie roboczym będzie wersją z pochodzenia):

git add path/to/file

Po wykonaniu jednej z tych czynności w celu rozwiązania konfliktu zatwierdź połączenie.

Cascabel
źródło
Miałem kilka plików, wszystkie w tym samym katalogu i wszystkie z tym samym przyrostkiem. Czy istnieje skrót, aby usunąć je wszystkie naraz, zachowując pozostałe pliki w katalogu?
chiborg,
@chiborg: To tylko pytanie powłoki. cddo katalogu i git rm *.ext. Twoja powłoka (nie Git) rozszerza się *.extna wszystkie pasujące nazwy plików.
Cascabel
A jeśli chcę zachować niektóre pliki? git rmnie ma -iflagi.
chiborg
@chiborg: Powiedziałeś, że chcesz usunąć wszystko z podanym sufiksem i pozostawić wszystko inne nienaruszone. Właśnie to ci powiedziałem, jak to zrobić. Czy miałeś na myśli git rm *-suffix.ext? Ta sama różnica. Jeśli masz problem ze zrozumieniem, jak używać symboli wieloznacznych powłoki, zapytaj na unix.stackexchange.com. Jeśli wiesz na pewno, że to, czego chcesz, nie może być zrobione z globbingiem, użyj rm -ii podążaj za nimi, git add -uaby odebrać skreślenia.
Cascabel
2
@Jefromi, jeśli określam, -s recursive -X oursdlaczego nadal konieczne jest git rmi git add?
Noel Yap
27

Jako dodatkowa wskazówka oprócz zaakceptowanej odpowiedzi, w „usuniętym przez nas” , jeśli chcesz zobaczyć zmiany wprowadzone w usuniętym pliku, abyś mógł zastosować te zmiany w innym miejscu, z którego możesz skorzystać:

git diff ...origin/master -- path/to/file

Jeśli jest to scenariusz „usunięty przez nich” i chciałbyś zobaczyć zmiany, aby móc je zastosować w innym miejscu, możesz użyć:

git diff origin/master... -- path/to/file
Joseph Ravenwolfe
źródło
6
tak! Ma to kluczowe znaczenie, jeśli nie chcesz po prostu usunąć zmian, które scalasz, na przykład gdy właśnie zmieniono nazwę pliku lub jego zawartość została przeniesiona przed usunięciem pliku.
Edward Anderson
8
Dla przypomnienia: to nie działa, gdy konflikt ma miejsce podczas przebudowy bazy . Muszą być wyraźne, jakgit diff mybranch@{1}...origin/master -- path/to/file
nschum
@nschum Thanks! Właśnie tego szukałem.
Chuim
2
Możesz również użyć git diff --base(zobacz moją drugą odpowiedź).
Dorian Marchal
Cześć Joseph, wciąż utknąłem, mimo że ta odpowiedź wygląda obiecująco. Jeśli masz chwilę, z chęcią odpowiesz tutaj: stackoverflow.com/q/63044843/470749 Dzięki!
Ryan
9

W graficznym interfejsie użytkownika Git wybierz plik będący w konflikcie, a następnie kliknij prawym przyciskiem myszy główny obszar tekstowy, w którym wyświetlany jest tekst będący w konflikcie.

W wyświetlonym menu kontekstowym możesz wybrać opcję „Zdalny” lub „Lokalny”. Jeśli więc plik został usunięty zdalnie, możesz wybrać opcję „Zdalnie”, aby propagować usuwanie lokalnie i odwrotnie.

Zajęło mi to miesiąc, zanim to rozgryzłem ... byłoby miło, gdyby graficzny interfejs użytkownika Git rzeczywiście miał dokumentację ...

Joel Freeman
źródło
4

Najlepiej oceniana odpowiedź skupia się na sposobie rozwiązania konfliktu.

Wcześniej prawdopodobnie chciałbyś wiedzieć, co zmienił pilot w lokalnie usuniętych plikach.

Aby to zrobić, możesz zobaczyć zmiany za pomocą:

git diff --base

Z https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

Porównaj drzewo robocze z wersją „podstawową” […]. Indeks zawiera te etapy tylko dla niescalonych wpisów, tj. Podczas rozwiązywania konfliktów.

Dorian Marchal
źródło
Oto dobre wyjaśnienie git diff --base stackoverflow.com/a/60484874/470749
Ryan
0

W EGit też znalazłem problemy. Moje rozwiązanie brzmiało:

  • Użyto widoku Git Staging.
  • Dwukrotne kliknięcie każdego pliku wyświetlanego na niestopionych zmianach w celu otwarcia komparatora
  • Kliknij ikonę „Kopiuj wszystko od lewej do prawej”
  • Zapisz plik (zniknie z niestarzonej listy)
borjab
źródło
0

Jak podano w tej przydatnej odpowiedzi na powiązane pytanie , możesz użyć, git mergetoolaby otworzyć okno dialogowe, w którym możesz wybrać, czy chcesz pobrać zmodyfikowaną, czy usuniętą wersję pliku (ów).

Amos Egel
źródło