Błąd Git przy zatwierdzeniu po scaleniu - krytyczny: nie można wykonać częściowego zatwierdzenia podczas scalania

280

Prowadziłem taki, git pullktóry zakończył się konfliktem. Rozwiązałem konflikt i teraz wszystko jest w porządku (skorzystałem także z narzędzia scaletool).

Po zatwierdzeniu rozwiązanego pliku pojawia git commit file.php -m "message"się błąd:

fatal: cannot do a partial commit during a merge.

Miałem wcześniej ten sam problem i użycie -aw zatwierdzeniu działało idealnie. Myślę, że nie jest to idealny sposób, ponieważ nie chcę zatwierdzać wszystkich zmian. Chcę zatwierdzić pliki osobno z osobnymi komentarzami. Jak mogę to zrobić? Dlaczego git nie pozwala użytkownikom na zatwierdzanie plików osobno po scaleniu? Nie mogłem znaleźć zadowalającej odpowiedzi na ten problem.

pMan
źródło
5
I wiesz, poszukiwanie git wykonuje „pełne zatwierdzenie” zwraca prawie nic użytecznego. Ani jednego odpowiedniego dokumentu ze stron podręcznika Gita. To takie żałosne narzędzie.
jww
6
@Torek - porozmawiaj o innym bałaganie stworzonym przez Git ... Dlaczego cholernie trudno jest pobrać plik będący w konflikcie z innej gałęzi, aby uniknąć konfliktu, dodać go do tej gałęzi, a następnie zatwierdzić ??? A WTF jest częściowym zatwierdzeniem? Nie mogę znaleźć żadnej dokumentacji na ten temat ... Użytkownicy są zmuszeni do wypróbowania poniższych przypuszczeń ...
jww
Jak to zrobiłeś? Mam konflikt i nic nie mogę zrobić
Niklas R.,

Odpowiedzi:

442

Odkryłem, że dodanie „-i” do polecenia commit naprawia ten problem. -I w zasadzie mówi mu, aby wykonał dodatkowe pliki przed zatwierdzeniem. To jest:

git commit -i myfile.php
MikaelHalen
źródło
18
Co Stage additional filesznaczy
jcalfee314
9
@ jcalfee314 inscenizacja w git polega na przygotowaniu pliku do zatwierdzenia. W tym konkretnym przypadku program dokonuje zmiany pliku za pomocą wiersza polecenia przed zatwierdzeniem. Flaga -i jest używana głównie w przypadku kończenia scalania. Możesz przeczytać więcej o flagach zatwierdzenia tutaj .
MikaelHalen
4
@ jcalfee314 Sprawdziłem dokumentację i jest napisane: „Przed dokonaniem zatwierdzenia z zawartości przemieszczanej do tej pory, wypróbuj również zawartość ścieżek podanych w wierszu poleceń. Zazwyczaj nie jest to, czego chcesz, chyba że zakończysz konfliktowe scalenie” . Domyślam się, że pod tym warunkiem istnieje pewna niespójność w obszarze przeciwności, której nie można rozwiązać git add, co powoduje git commitniepowodzenie. Dodanie -ikazałoby gitowi dodać i zatwierdzić w tym samym czasie. Nadal nie jestem pewien, dlaczego, ale wydaje się to mieć sens.
JonSlowCN,
5
W przypadku noobów takich jak ja otrzymasz ten sam błąd, jeśli spróbujesz wiadomości zawierającej spacje bez cudzysłowów. Na przykład. [git commit -m jeden dwa trzy] Poprawnie: [git commit -m „jeden dwa trzy”]
Skychan
2
Komentarz Skychana był dla mnie biletem.
tehbeardedone
106
git commit -am 'Conflicts resolved'

To zadziałało dla mnie. Możesz także tego spróbować.

Pratip Ghosh
źródło
1
Niesamowite, nie wiedziałem tego!
JeanValjean
11
Dodaje to wszystkie zmodyfikowane pliki do zatwierdzenia, nawet te, które są niestacjonarne, co może nie być pożądane. Użytkownicy mogą zrezygnować z flagi „a”
Chase Sandmann
4
Właśnie tego użytkownik nie chce robić, aby uniknąć zatwierdzenia wszystkich plików.
Michael
33

Możesz użyć git commit -iw większości przypadków, ale na wypadek, gdyby to nie zadziałało

Musisz to zrobić git commit -m "your_merge_message". Podczas konfliktu scalania nie możesz scalić jednego pliku, więc musisz

  1. Etapuj tylko plik będący w konflikcie ( git add your_file.txt)
  2. git commit -m "your_merge_message"
aWebDeveloper
źródło
16

Prawdopodobnie masz konflikt z czymś, czego nie wystawiłeś do zatwierdzenia. git nie pozwala ci na samodzielne zatwierdzanie rzeczy (bo to chyba część scalania), więc potrzebujesz git addtego pliku, a potem git commit -m "Merge conflict resolution". -iFlaga dla git commitrobi dodatek dla Ciebie.

Paul Price
źródło
5
Nie w 1.9.0 - commit -idziałało, ale niegit add; git commit
LeeGee
14

Dostałem to, gdy zapomniałem -mw git commit podczas rozwiązywania konfliktu scalania git.

git commit "commit message"

Powinien być

git commit -m "commit message"
wgeorge
źródło
2
ah ah! Znowu zapomniałem!
user2705463
9

Jak pokazuje komunikat o błędzie, po scaleniu nie można wykonać częściowego zatwierdzenia. Zamiast popełniania tylko file.phppowinieneś zatwierdzić wszystkie zmiany.

To powinno działać.

git commit -m "Fixing merge" 
Asim Jalis
źródło
Dzięki, pomogło
Narendra Pandey
Pracowałem dla mnie takim, jakim jest
Shashank Bodkhe
6

Twoja fuzja zatrzymała się w trakcie akcji. Powinieneś dodać swoje pliki, a następnie „git commit”:

git add file_1.php file_2.php file_3.php git commit

Twoje zdrowie

Moyshe Zuchmir
źródło
5

Jeśli chcesz po prostu zrzucić cały zbiór pobrań i zatwierdzić pliki w dowolnych zestawach,

git reset --soft <ID-OF-THE-LAST-COMMIT>

doprowadzi cię tam.

Miękki reset powoduje przesunięcie wskaźnika wskazującego bieżącą HEAD do zatwierdzonego (ish) podanego pliku, ale nie zmienia plików. Twardy reset spowoduje przesunięcie wskaźnika, a także przywrócenie wszystkich plików do stanu w tym zatwierdzeniu (ish). Oznacza to, że przy miękkim resecie możesz usunąć stan scalenia, ale zachować zmiany w rzeczywistych plikach, a następnie zatwierdzić lub zresetować je indywidualnie według własnych upodobań.

Zds
źródło
Czy mógłbyś to wyjaśnić? Prawdopodobnie tego właśnie potrzebuję, ale nie podążam za tym, jak by to działało ... Wszystkie odpowiedzi tutaj brzmią: „dodaj pliki, a następnie zatwierdź!”, Ale to tak banalnie oczywiste; powodem, dla którego tu jestem, jest to, że nie chcę dodawać tych plików przed zatwierdzeniem. -_-;
Kyle Baker,
To pomaga. Dzięki. :)
Kyle Baker
5
  1. przejdź do katalogu projektu
    1. wyświetl ukryte pliki (pojawi się folder .git)
    2. otwórz folder .git
    3. usuń MERGE_HEAD
    4. popełnić ponownie
    5. jeśli git powiedział ci, że git jest zablokowany, wróć do folderu .git i usuń plik index.lock
    6. zatwierdzić ponownie, tym razem wszystko będzie dobrze.
Ahmed Samir
źródło
Wspaniały! To by działało dla mnie. Nawiasem mówiąc, jeśli na MacOS, z terminala można wywołać „open .git”, czarownica wyświetli zawartość „.git” w Finderze
tontonCD
To też działa dla mnie. Należy to zaakceptować jako odpowiedź.
vandu
3

Dla mnie stało się to w SourceTree, gdy próbowałem dokonać scalenia przed rozwiązaniem wszystkich plików. Następnie zaznaczyłem ostatni plik rozwiązany, a mimo to nadal pojawił się ten błąd podczas próby zatwierdzenia. Zamknąłem SourceTree i otworzyłem go ponownie, a potem wszystko poszło dobrze.

Justin
źródło
1
dzięki, ale niestety to nie działało dla mnie. Irytujące było to, że musiałem dokonać przeglądu zarówno prywatnego, jak i scalenia, zanim pozwoli mi to na scalenie.
Coxy,
3

Rozwiązałem to z zupełnie innym podejściem, używając tylko kontroli źródła Xcode.

Tło: Inny zespół wprowadził zmiany do zdalnego repozytorium Git (przez Beanstalk). Z mojej strony pliki .xcodeproj weszły do ​​innego katalogu i zmiany nie zostały wprowadzone. Później, gdy próbowałem dokonać zatwierdzenia, w Xcode wystąpił błąd konfliktu drzewa.

Zrzut ekranu z konfliktem drzew

Ponieważ prawie niemożliwe jest poprawienie za pomocą Xcode, zastąpiłem .xcodeprojplik pobraną wersją z serwera Git. Rezultat ... projekt Xcode najwyraźniej się wyczyścił, jednak wszystkie aktualizacje z uszkodzonego Pulla pojawiały się jako zmiany, które wprowadziłem i zostały zainscenizowane dla Commit.

Spójrz na te wszystkie mody i dodane pliki

Jednak podczas próby zatwierdzenia otrzymałem ten sam błąd „krytyczny: nie mogę wykonać częściowego zatwierdzenia podczas scalania”, omówiony tutaj.

Oto jak rozwiązałem problem ... (Teraz zrozum, że jestem programistą debiutantów, więc mogłem nie rozumieć ... ale moja ignorancja doprowadziła mnie do znalezienia innego sposobu na zrobienie tego.) Najpierw sklonowałem mojego mistrza Rozgałęzienie na oddział dodatkowy i przejście na ten oddział. Następnie utworzyłem kopię roboczą i umieściłem katalog w tej kopii roboczej poza oryginalnym katalogiem projektu. (Nie wiem, czy było to konieczne, ale zrobiłem to, czytając inne techniki rozwiązywania problemów). Następnie przełączyłem gałęzie na master, gdzie zdałem sobie sprawę, że wszystkie moje pliki etapowe (zmiany w Commit) zniknęły. Aby upewnić się, że wszystkie pliki zostały zaktualizowane do najnowszych zmian wprowadzonych przez drugą stronę, utworzyłem nowy oddział o nazwie ThirdBranch, który zduplikował wszystkie pliki, Przekazałem go do serwera Git i pozwól Beanstalk porównać moją wersję serwerową gałęzi master z gałęzią ThirdBrach, którą właśnie wypchnąłem (linia po linii), a wszystkie zmiany wprowadzone przez drugą stronę były obecne na moim Xcode. Oznaczało to, że moje główne repozytorium i główne repozytorium Git były takie same, co potwierdza, że ​​rozwiązałem problem tylko za pomocą Xcode.

Nie pytaj mnie, jak poza tym, co właśnie opisałem ... i na pewno uzupełnij luki, które pominąłem. Jestem w tym nowy i nie rozumiem wszystkiego. Być może doświadczony programista może oddzielić nieistotne informacje od odpowiednich i odtworzyć tę technikę jaśniej, a to po części dlatego publikuję to.

To jest zduplikowana odpowiedź na zduplikowane pytanie z: Nieudane Xcode Git Merge utknął

Pleksander
źródło
2
Nie publikuj duplikatów odpowiedzi. Chociaż podstawowy problem może być taki sam, twoja odpowiedź dotyczy znacznie bardziej konkretnego problemu i tylko zaciemnia odpowiedzi na to ogólne pytanie. Uważam, że w tym przypadku bardziej odpowiedni jest komentarz do pytania, które zawiera link do oryginalnej odpowiedzi.
Fookatchu
2

Podczas łączenia Git chce śledzić oddziały nadrzędne z różnych powodów. To, co chcesz zrobić, nie jest scaleniem, jak widzi to git. Prawdopodobnie będziesz chciał zrobić rebase lub wybrać ręcznie.

Talljoe
źródło
1
Nigdy wcześniej nie korzystałem z rebase lub cherry-pick, po prostu przejrzałem teraz instrukcję, więc co byś sugerował, „git rebase master” po scaleniu konfliktów zadziała?
pMan
1
To równoległy przepływ pracy. Zobacz stackoverflow.com/questions/804115/git-rebase-vs-git-merge Zasadniczo, jeśli chcesz, aby „scalanie” było osobne, zatwierdza zamiast tego gałąź bazowa na końcu gałęzi docelowej.
Talljoe,
1
Wystarczy dodać każdy pojedynczy plik, a następnie zatwierdzić bez -a.
Peter DeWeese,
4
tak naprawdę nie odpowiedziałeś na pytanie, a po prostu dałeś więcej do wyszukiwania. Teraz musimy wiedzieć „czym jest wybieranie wiśni” i „czym jest rebase”.
ftrotter,
2
Zastanawiam się, dlaczego ta odpowiedź została odrzucona. Zawsze miałem ciekawość dziecka, gdy ktoś mówił mi rzeczy, których nigdy wcześniej nie znałem. Jak skomentowałem powyżej, teraz wiem o cherry pick i rebase. Czy to nie było progresywne / pomocne?
pMan
2

git commit -i -m 'merge message'nie działało dla mnie. Powiedziało:

fatal: No paths with --include/--only does not make sense.

FWIW, dostałem się tutaj przez to powiązane pytanie, ponieważ otrzymywałem ten komunikat:

fatal: You have not concluded your merge (MERGE_HEAD exists).

Spróbowałem też narzędzia scaletool, które powiedziało No files need merging . Bardzo mylące! Więc MERGE_HEAD nie ma w pliku, który wymaga scalenia- ??

Na koniec skorzystałem z tej sztuczki, aby dodać tylko zmodyfikowane pliki (nie chciałem dodawać wszystkich plików w moim drzewie, ponieważ mam kilka, które chcę zachować bez śledzenia):

git ls-files -m | xargs git add

W końcu (!) Byłem w stanie dokonać zatwierdzenia i przyspieszenia. Byłoby miło, gdyby git dał ci lepsze wskazówki, co robić w takich sytuacjach.

szeitlin
źródło
1

Jeśli znajduje się w drzewie źródłowym , powinniśmy jawnie oznaczyć plik jako rozwiązany po rozwiązaniu konfliktów. Wybierz plik, który został właśnie rozwiązany, bez konfliktów. Następnie Akcje -> Rozwiąż konflikty -> Oznacz jako rozwiązane . Jeśli masz wiele plików, zrób to samo dla wszystkich. Zaangażuj się teraz.

cgr
źródło
1

Po przeczytaniu wszystkich komentarzy. to była moja rezolucja:
musiałem ją „dodać” jeszcze raz, niż zatwierdzić:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html
FelipeNutz
źródło
1

Jeśli korzystasz z drzewa źródłowego lub innego GUI, upewnij się, że wszystkie pliki są sprawdzone (po scaleniu).

luky
źródło
0

Czasami podczas łączenia pojawiają się konflikty i istnieją delty wymagające ręcznego rozwiązania. W takim przypadku napraw ręczną rozdzielczość dla wymienionych plików.

Teraz, jeśli wydajesz,

git status Lib/MyFile.php

Zobaczysz wynik jak

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Ponieważ już wystawiłeś zatwierdzenie, potrzebujesz tylko wydania

git commit

A twoje zatwierdzenie zostanie wykonane bez żadnych problemów.

Ketan Patel
źródło