2011-12-15 8 views
55

Mam do czynienia z problemem, który nie jestem pewien, jak rozwiązać.Git rebase - kontynuuje narzeka nawet wtedy, gdy wszystkie konflikty zostały rozwiązane.

Zrobiłem rebase wobec pana z mojego oddziału:

git rebase master 

i mam następujący błąd

First, rewinding head to replay your work on top of it... 
Applying: checkstyled. 
Using index info to reconstruct a base tree... 
Falling back to patching base and 3-way merge... 
Auto-merging AssetsLoader.java 
CONFLICT (content): Merge conflict in AssetsLoader.java 
Failed to merge in the changes. 
Patch failed at 0001 checkstyled. 

więc poszedłem do mojego ulubionego edytora, stałe konflikt 1 linia, zapisany plik i uzyskałem status git i otrzymałem następujące dane wyjściowe:

# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: PassengerContactHandler.java 
# 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both modified:  AssetsLoader.java 
# 

Zrobiłem git dodać AssetsLoader .java i git status i mam następujące:

# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: AssetsLoader.java 
# modified: PassengerContactHandler.java 
# 

i kiedy zrobiłem git rebase --continue uzyskać:

git rebase --continue 
You must edit all merge conflicts and then 
mark them as resolved using git add 

wiem, że mogę pominąć poprawkę i kontynuować rebase, ale Nie jestem pewien, czy zmiany w PassengerContactHandler.java zostaną ponownie wprowadzone do mojego oddziału, czy nie.

więc nie jestem pewien, jak powinienem kontynuować?

Edycja: Czy plik z rozstrzygniętym konfliktem może być identyczny z oryginalną wersją?

dziękuję, Lucas

Edycja, po prostu zdarzyło mi znowu:

To właśnie zdarzyło mi się raz,

(307ac0d...)|REBASE)$ git status 
# Not currently on any branch. 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: assets/world/level1/Level-1.xml 
# modified: George.java 
# modified: DefaultPassenger.java 
# 
# Untracked files: 
# (use "git add <file>..." to include in what will be committed) 
# 
# mb-art/originalAssets/27dec/ 

((307ac0d ...) | rebase) $ git rebase --continue

You must edit all merge conflicts and then 
mark them as resolved using git add 

git --version

git version 1.7.1 
+0

To jest pełne wyjście statusu 'git', prawda? Brak brakującej sekcji poniżej? – Cascabel

+0

tak, wkleiłem wszystko ... – Lucas

+0

'git-rebase' nigdy nie powinien zgłaszać, że są nierozwiązane konflikty, jeśli ich nie ma. Jeśli uda Ci się odtworzyć problem w prostszym przypadku testowym, byłoby znacznie łatwiej debugować, ale nadal, jeśli masz "status git", nie zgłaszając żadnych konfliktów, gdy 'git rebase --continue' ma, a twoja wersja Git jest aktualny, możesz spróbować wysłać wiadomość e-mail na listę dyskusyjną Git dev pod adresem [email protected] z jak największą ilością informacji diagnostycznych. – Cascabel

Odpowiedz

3

Brakowało konfliktu scalania w AssetsLoader.java. Otwórz go i poszukaj znaczników konfliktu (">>>>", "====", "< < < < <"), a następnie ponownie wykonaj git. Zrób "git diff --staged", jeśli masz trudności ze znalezieniem go.

+2

zrobiłem grep na wszystkich śledzonych plikach i nie było żadnych znaczników konfliktu. – Lucas

+0

Czy 'git diff --staged' ujawnia coś użytecznego? Wskazuje zmiany, które zamierzasz zatwierdzić, aby rozwiązać konflikty w tym momencie w bazie danych. Powinien istnieć "oops, to nie jest to, co zamierzałem zrobić, aby rozwiązać ten bit" w jednym z plików. – Ether

+4

Git nie szuka znaczników konfliktu podczas próby przejścia. Sprawdza tylko, czy indeks jest w stanie czystym. Jeśli wystawiłeś plik, który nadal zawiera znaczniki konfliktu, oznacza to, że chcesz go zatwierdzić w nim. To prawdopodobnie zawsze błąd, ale pozwoli ci to zrobić. – Cascabel

3

Spróbuj uruchomić to w wierszu poleceń:

$ git mergetool 

powinien wychować interaktywny edytor pozwala rozwiązywać konflikty. Łatwiejsze niż próby zrobienia tego ręcznie, a także git rozpozna, kiedy wykonujesz scalenie. Unika także sytuacji, w których nie nastąpi całkowite scalenie przez przypadek, które może się zdarzyć, gdy spróbujesz zrobić to ręcznie.

+0

Tak, znam narzędzie, ale wolę zrobić to ręcznie. – Lucas

+0

Pomyślałem, że może to być łatwiejsze, a także pozwoli uniknąć takich sytuacji w przyszłości. – Batkins

+1

Uratowałeś mój wieczór. Chociaż jest to proste narzędzie, ale nigdy nie będę w stanie wymyślić, jak rozwiązać moje konflikty bez tego narzędzia. – Eonil

4

Ive właśnie miał ten problem, a jednocześnie myślę, że może być kilka przyczyn, oto mój ...

miałem git pre-commit, który odrzucił zobowiązuje pod pewnymi warunkami.To jest w porządku, gdy wykonujesz ręcznie, ponieważ wyświetli wyjście haka i mogę go naprawić lub zignorować za pomocą commit --no-verify.

Problem polega na tym, że przy ponownym zakładaniu, rebase --continue również wywoła hak (aby zatwierdzić ostatnią próbę zmian). Ale rebase nie wyświetli wyniku hook, zobaczy tylko, że się nie udało, a następnie wypluwa mniej konkretny błąd: "Musisz edytować wszystkie konflikty scalania, a następnie oznaczyć je jako rozwiązane za pomocą git add"

Aby naprawić to, scenie wszystkie zmiany, i zamiast robić "git rebase --continue", spróbuj "git commit". Jeśli cierpisz na ten sam problem z hakiem, powinieneś zobaczyć przyczyny jego niepowodzenia.

Co ciekawe, podczas gdy git rebase nie wyświetla wyniku z git hook, akceptuje on --no-verify by ominąć haki.

+1

Miałem podobny problem. Nic więcej tutaj nie działało dla mnie, ale samo zrobienie "git commit", a następnie przerwanie, wydawało się magicznie rozwiązać wszelkie rozbieżności, jakie istniały, a następnie udało mi się pomyślnie "git rebase --continue". – patrickvacek

+0

Dla przypomnienia, ponieważ ostatnio zmagałem się z podobnym problemem, 'git rebase' akceptuje opcję' --no-verify'. Pomija jednak tylko hak 'przed ponowną bazą ', ale opcja ta nie jest stosowana w kolejnych wywołaniach' git commit'. – pkrysiak

58

Dzieje się tak, ponieważ podczas rozwiązywania konfliktu usunąłeś cały kod z łaty, która została zastosowana do gałęzi, na którą się opierasz. Użyj numeru git rebase --skip, aby kontynuować.

trochę więcej szczegółów:

Normalnie, przy ustalaniu konflikt podczas podścielanie, będzie edytować konflikt pliku, zachowując część lub cały kod w patch obecnie stosowanej do oddziału ty rebase na . Po zamocowaniu plaster i robi

git add your/conflicted/file 
git status 

dostaniesz (zazwyczaj zielona) linia pokazuje zmodyfikowany plik

modyfikowany: Twój/skonfliktowany/pliku

git rebase --continue będzie dobrze działać w tej sytuacji.

Czasami podczas rozwiązywania konfliktu usuwasz wszystko z nowej łatki, zachowując tylko kod z oddziału, na którym się opierałeś. Teraz, po dodaniu pliku, będzie on dokładnie taki, jak ten, na którym próbowałeś dokonać ponownego wyboru. Status git nie pokazuje zielonej linii wyświetlającej zmodyfikowane pliki. Teraz, jeśli nie

git rebase --continue 

git będzie narzekać z

żadne zmiany - nie można zapomnieć używać 'git add'?

Co git faktycznie chce zrobić w tej sytuacji jest użycie

git rebase --skip 

pominąć poprawkę. Wcześniej nigdy tego nie robiłem, ponieważ zawsze nie byłem pewien, co by mnie omijało, gdybym to zrobił, nie było dla mnie oczywiste, co naprawdę oznacza "pomiń tę poprawkę". Ale jeśli się nie zielona linia z

modyfikowany: Twój/skonfliktowany/plik

po edycji plik skonfliktowany, dodając go i robi git status, to możesz być pewien, że usunięto Cała łatka i możesz zamiast tego używać

git rebase --skip 

, aby kontynuować.

oryginalny post powiedział to czasami działa:

git add -A 
git rebase --continue 
# works magically? 

... ale nie należy polegać na tym (i pamiętaj, aby nie dodawać pliki resztki w repozytorium folderów)

+0

Wydawało mi się, że mam ten sam problem i to samo rozwiązanie, wydawało mi się również magiczne! –

+0

Miałem ten sam problem, wygląda na to, że jeśli refaktoryzowałeś w gałęzi rebased i dodawałeś nowe pliki, a proces scalania wprowadził zmiany do tych nowych plików, musisz jawnie dodać je ponownie. – Ibrahim

+0

Nie rób tego, chyba że chcesz śledzić wszystkie niepotrzebne pliki na repozytorium. –

1

Po naprawieniu konfliktu upewnij się, że zmienione pliki zostały dodane do plików etapowych. To rozwiązało problem dla mnie.

Powiązane problemy