Użyłem git pull
i miałem konflikt scalania:
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
Wiem, że druga wersja pliku jest dobra i że moja jest zła, więc wszystkie moje zmiany powinny zostać porzucone. W jaki sposób mogę to zrobić?
git
version-control
git-merge
git-merge-conflict
Gwyn Morfey
źródło
źródło
[rejected] gh-pages -> gh-pages (non-fast-forward)
Odpowiedzi:
Ponieważ twoje
pull
nie powiodło się, toHEAD
(nieHEAD^
) jest ostatnim „poprawnym” zatwierdzeniem w twoim oddziale:Innym elementem, który chcesz, jest pozwolić, aby ich zmiany zastąpiły zmiany.
Starsze wersje git pozwoliły na użycie „ich” strategii scalania:
Ale od tego czasu zostało to usunięte, jak wyjaśniono w tym komunikacie Junio Hamano (opiekun Git). Jak wspomniano w linku , zamiast tego zrobiłbyś to:
źródło
git fetch origin
->git reset origin (soft reset, your changes are still present)
->git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin)
Nigdy więcej nie używam git pull. Ponieważ w walce między moim najnowszym kodem a źródłem, pochodzenie zawsze powinno wygrywać, ja zawszegit fetch
igit rebase origin
. To sprawia, że moje połączenia i konflikty są nieliczne i dalekie.git log ..@{upstream}
lubgit diff ..@{upstream}
). Potem, podobnie jak ty, zmienię podstawy mojej pracy.git merge -X theirs remote_branch
zamiastgit pull --strategy=theirs remote_branch
jaktheirs
wygląda opcjarecursive
git merge --abort
jest zdecydowanie lepsza.Jeśli twoja wersja git to> = 1.6.1, możesz użyć
git reset --merge
.Ponadto, jak wspomina @Michael Johnson, jeśli twoja wersja git to> = 1.7.4, możesz także użyć
git merge --abort
.Jak zawsze upewnij się, że nie masz żadnych niezatwierdzonych zmian przed rozpoczęciem scalania.
Ze strony podręcznika git merge
git merge --abort
odpowiadagit reset --merge
czasowiMERGE_HEAD
obecności.MERGE_HEAD
jest obecny, gdy trwa scalanie.Ponadto w odniesieniu do niezatwierdzonych zmian podczas rozpoczynania scalania:
Jeśli masz zmiany, których nie chcesz zatwierdzać przed rozpoczęciem scalania, tylko
git stash
je przed scaleniem igit stash pop
po zakończeniu scalania lub przerwaniu.źródło
<commit>
? #GitMoment: -ogit merge --abort
tylko synonimgit reset --merge
? Nazwa z pewnością ma większy sens, ale czy ma taką samą funkcjonalność?http://www.git-scm.com/docs/git-merge
źródło
To takie proste.
Sam Git pokazuje rozwiązanie, gdy masz tego typu problemy i uruchom polecenie git status.
Mam nadzieję, że to pomoże ludziom.
źródło
Myślę,
git reset
że potrzebujesz.Uważaj,
git revert
co oznacza coś zupełnie innego niż, powiedzmy,svn revert
- w Subversion przywrócenie odrzuci twoje (niezatwierdzone) zmiany, przywracając plik do bieżącej wersji z repozytorium, podczas gdygit revert
„cofnie” zatwierdzenie.git reset
powinien zrobić równowartośćsvn revert
, czyli odrzucić niechciane zmiany.źródło
W tym konkretnym przypadku użycia tak naprawdę nie chcesz przerwać scalania, wystarczy rozwiązać konflikt w określony sposób.
Nie ma też szczególnej potrzeby resetowania i przeprowadzania łączenia z inną strategią. Konflikty zostały poprawnie podkreślone przez git, a wymóg akceptacji zmian pozostałych stron dotyczy tylko tego jednego pliku.
W przypadku nie połączonego pliku w konflikcie git udostępnia w indeksie wspólną podstawową, lokalną i zdalną wersję pliku. (To jest miejsce, z którego są odczytywane do użycia w 3-drożnym narzędziu różnicowym
git mergetool
.) Możesz użyć,git show
aby je wyświetlić.Najprostszym sposobem rozwiązania konfliktu przy użyciu dosłownie wersji zdalnej jest:
Lub z git> = 1.6.1:
źródło
git 1.6.1
polecenie ma sens i jest dobre. Właśnie tego bym chciał. Myślę, że rozwiązanie wcześniejsze niż 1.6.1 jest nieeleganckie i wymaga wiedzy o innych częściach git, które powinny być oddzielone od procesu rozwiązywania scalania. Ale nowa wersja jest świetna!Dla scenariusza podobnego zrobiłem
git fetch
igit pull
, wtedy zrozumiałem, że nie było przed gałąź gałąź master, co spowodowało niepożądanych konfliktów.To cofnęło się bez resetowania moich lokalnych zmian.
źródło
Komentarze sugerują, że
git reset --merge
jest to alias dlagit merge --abort
. Warto zauważyć, żegit merge --abort
jest to odpowiednik tylkogit reset --merge
biorąc pod uwagę, żeMERGE_HEAD
jest obecny. Można to odczytać w pomocy git dla polecenia scalania.Po nieudanym scaleniu, gdy nie ma
MERGE_HEAD
, nieudanego scalenia można cofnąćgit reset --merge
, ale niekoniecznie za pomocągit merge --abort
. Są nie tylko starą i nową składnią tego samego .Osobiście uważam, że jest
git reset --merge
znacznie bardziej wydajny w przypadku scenariuszy podobnych do opisanego i ogólnie nieudane scalenia.źródło
git stash apply
spowodowało dla mnie konflikt scalania, alegit merge --abort
nie pomogło migit reset --merge
.Jeśli skończysz z konfliktem scalania i nie masz nic do zatwierdzenia, ale nadal wyświetlany jest błąd scalania. Po zastosowaniu wszystkich wymienionych poniżej poleceń,
Proszę usuń
Plik [wytnij wklej do innej lokalizacji w przypadku odzyskiwania], a następnie wprowadź dowolne z poniższych poleceń w zależności od wybranej wersji.
Mam nadzieję, że to pomaga !!!
źródło
Alternatywą, która zachowuje stan kopii roboczej jest:
Generalnie odradzam to, ponieważ w rzeczywistości przypomina to scalanie w Subversion, ponieważ odrzuca relacje gałęzi w następnym zatwierdzeniu.
źródło
Ponieważ Git 1.6.1.3
git checkout
był w stanie dokonywać transakcji z dowolnej strony scalania:źródło
Stwierdziłem, że dla mnie zadziałało (przywróć pojedynczy plik do stanu sprzed scalenia):
źródło
Sourcetree
Ponieważ nie dokonujesz scalenia, po prostu dwukrotnie kliknij inny oddział (co oznacza, że go kasujesz), a kiedy zostaniesz zapytany o odrzucenie wszystkich zmian, zgódź się :)
źródło