konflikt scalania git rebase

91

Rozwidliłem repozytorium github i pracowałem nad repozytorium github.
Wykonałem żądania ściągnięcia i zostało to zakończone.

Po tym upstream miał więcej zatwierdzeń, więc teraz chcę zmienić bazę, myślę, że to jest to, co muszę zrobić.
Ale otrzymuję te konflikty scalania:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

Nie wiem, jak to naprawić, proszę o pomoc.

pahnin
źródło
Spójrz na moją odpowiedź w tym poście: stackoverflow.com/questions/48307297/…
Abhishek

Odpowiedzi:

121

Rebasing może być prawdziwym bólem głowy. Musisz rozwiązać konflikty scalania i kontynuować przebudowę. Na przykład możesz użyć narzędzia scalania (które różni się w zależności od ustawień)

git mergetool

Następnie dodaj zmiany i kontynuuj

git rebase --continue

Powodzenia

iltempo
źródło
2
tak, rebasing to ból głowy, czy mogę użyć git pull upstream master?
pahnin
2
Tak, możesz tego spróbować. Różnica polega na tym, że twoje commity nie są wtedy umieszczane na wierzchu tych z upstreamu. Potencjalnie jest mniej konfliktów podczas łączenia.
iltempo
7
@iitempo Nie musisz wykonywać zatwierdzenia. Wystarczy dodać git, aby umożliwić kontynuację rebase.
enigmaticPhysicist
45

W przypadku konfliktu podczas rebase masz trzy możliwości:

  • Możesz biec, git rebase --abortaby całkowicie cofnąć rebase. Git przywróci stan Twojego oddziału, taki jaki był przed wywołaniem git rebase.

  • Możesz uruchomić, git rebase --skipaby całkowicie pominąć zatwierdzenie. Oznacza to, że żadna ze zmian wprowadzonych przez problematyczne zatwierdzenie nie zostanie uwzględniona. Zdarza się, że wybrałbyś tę opcję.

  • Możesz rozwiązać konflikt, jak powiedział iltempo. Kiedy skończysz, musisz zadzwonić git rebase --continue. Moje narzędzie scalające to kdiff3, ale istnieje wiele innych, których możesz użyć do rozwiązywania konfliktów. Musisz tylko ustawić narzędzie do scalania w ustawieniach git, aby można było je wywołać, gdy wywołasz git mergetool https://git-scm.com/docs/git-mergetool

Jeśli żadne z powyższych nie działa dla Ciebie, idź na spacer i spróbuj ponownie :)

Uga Buga
źródło
2
Tak, ale jak rozwiązać konflikt?
oto
@KansaiRobot Jedna opcja, aby wykonać ręczną naprawę: otwórz konfliktowany plik w edytorze tekstu i poszukaj<<<<<
spinup
16

Jeśli masz dużo zatwierdzeń do zmiany bazy, a część z nich powoduje konflikty, to naprawdę boli. Mogę jednak zasugerować mniej znane podejście, jak „zdusić wszystkie konflikty”.

Najpierw wyewidencjonuj gałąź tymczasową i rozpocznij standardowe scalanie

git checkout -b temp
git merge origin/master

Będziesz musiał rozwiązać konflikty, ale tylko raz i tylko te prawdziwe. Następnie przygotuj wszystkie pliki i zakończ scalanie.

git commit -m "Merge branch 'origin/master' into 'temp'"

Następnie wróć do swojego oddziału (niech tak będzie alfa ) i zacznij od nowa, ale z automatycznym rozwiązywaniem wszelkich konfliktów.

git checkout alpha
git rebase origin/master -X theirs

Oddział został przebudowany, ale projekt jest prawdopodobnie w nieprawidłowym stanie. W porządku, mamy ostatni krok. Musimy tylko przywrócić stan projektu, więc będzie dokładnie taki, jak w gałęzi „temp”. Z technicznego punktu widzenia wystarczy skopiować jego drzewo (stan folderu) za pomocą polecenia niskiego poziomu git commit-tree . Plus scalenie z bieżącą gałęzią właśnie utworzonego zatwierdzenia.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

I usuń tymczasową gałąź

git branch -D temp

To wszystko. Zrobiliśmy rebase poprzez ukryte scalanie.

Napisałem również skrypt, który można zrobić w dialogu, możesz go znaleźć tutaj .

baur
źródło
13

Uwaga: w przypadku Git 2.14.x / 2.15 (III kwartał 2017 r.) Rozszerzenie git rebase komunikat w przypadku konfliktów będzie wyraźniejszy.

Zobacz commit 5fdacc1 (16 lipca 2017) autorstwa Williama Duclot ( williamdclt) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu 076eeec , 11 sierpnia 2017 r.)

rebase: spraw, aby komunikat o rozwiązaniu był wyraźniejszy dla niedoświadczonych użytkowników

Przed:

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort"

Po:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

Interfejs użytkownika git można ulepszyć, kierując komunikaty o błędach do tych, którym pomagają: niedoświadczonych i zwykłych użytkowników git.
W tym celu warto upewnić się, że terminy użyte w tych wiadomościach są zrozumiałe dla tego segmentu użytkowników i że prowadzą ich do rozwiązania problemu.

W szczególności niepowodzenie zastosowania poprawki podczas rebase git jest częstym problemem, który może być bardzo destabilizujący dla niedoświadczonego użytkownika.
Ważne jest, aby poprowadzić ich w kierunku rozwiązania konfliktu (który jest procesem 3-etapowym, a więc złożonym) i zapewnić ich, że mogą uciec od sytuacji, z którą sobie nie radzą ” --abort”.
To zatwierdzenie odpowiada na te dwa punkty, szczegółowo opisując proces rozwiązywania i unikając tajemniczego git linguo.

VonC
źródło
1
Ładny! Strona pomocy mówi, aby rozwiązać konflikt poprzez zatwierdzenie zmiany, ale nie! Tutaj musimy pominąć zatwierdzenie i zamiast tego kontynuować scalanie! (strona pomocy: help.github.com/articles/… )
Jerther