- Git rebase
- przed rebasingiem
- regularny rebase
- interaktywny rebase
- konflikty Merge
Ten przewodnik pomoże Ci zacząć z rebasingiem, wymuszaniem i naprawianiem konfliktów lokalnie.
przed zanurzeniem się w tym dokumencie, upewnij się, że znasz usingGit za pomocą wiersza poleceń.
Git rebase
Rebasing jest bardzo powszechną operacją inGit., Dostępne są następujące opcje rebase:
- zwykła rebase.
- Interaktywna rebase.
przed rebasingiem
git rebase
przepisuje historię zmian. To może być szkodliwe, aby to zrobić w dzielonych gałęziach. Może to powodować złożone i trudne do rozwiązania konflikty scalania. W tych przypadkach,zamiast rebasowania gałęzi względem domyślnej, rozważ jej wyciągnięcie (git pull origin master
). Ma podobny efekt bez narażania pracy twoich współpracowników.,bezpieczniej jest wykonać kopię zapasową swojej gałęzi przed rebasingiem, aby upewnić się, że nie stracisz żadnych zmian. Na przykład rozważ gałąź funkcji o nazwie my-feature-branch
:
-
otwórz swoją gałąź funkcji w terminalu:
git checkout my-feature-branch
sprawdź nową gałąź z niej:
git checkout -b my-feature-branch-backup
wróć do oryginalnej gałęzi:
git checkout my-feature-branch
teraz możesz bezpiecznie ją zmienić., Jeśli coś pójdzie nie tak, możesz odzyskać swoje zmiany, resetującmy-feature-branch
przeciwkomy-feature-branch-backup
:
zauważ,że jeśli dodałeś zmiany domy-feature-branch
po utworzeniu gałęzi kopii zapasowej, tracisz je podczas resetowania.
zwykły rebase
za pomocą zwykłego rebase możesz zaktualizować swoją gałąź funkcji za pomocą domyślnej gałęzi (lub dowolnej innej gałęzi).Jest to ważny krok dla strategii rozwoju opartych na Gita., Możesz upewnić się, że zmiany, które dodajesz do bazy kodowej, nie będą łamać żadnych istniejących zmian dodanych do gałęzi docelowej po utworzeniu gałęzi funkcji.,
For example, to update your branch my-feature-branch
with master
:
-
Fetch the latest changes from
master
:git fetch origin master
-
Checkout your feature branch:
git checkout my-feature-branch
-
Rebase it against
master
:git rebase origin/master
-
Force-push to your branch.,
podczas rebase:
- Git importuje wszystkie commity przesłane do
master
po ich zakończeniu utworzyłeś swoją gałąź funkcji do chwili obecnej. - Git umieszcza commity, które masz w swojej gałęzi feature na wierzchu wszystkich commitów zaimportowanych z
master
:
możesz zastąpić master
dowolną inną gałęzią, którą chcesz zmienić Przeciw, na przykład, release-10-3
., Możesz również zastąpić origin
innymi zdalnymi bazami, na przykład upstream
. Aby sprawdzić, jakie piloty połączyłeś z localrepository, możesz uruchomić git remote -v
.
Jeśli występują konflikty scalania, Git prosi Cię o naprawienie ich przed kontynuowaniem rebase.
aby dowiedzieć się więcej, sprawdź dokumentację Gita na temat strategii rebasingu i rebasingu.
interaktywny rebase
możesz użyć interaktywnego rebase do modyfikowania commitów. Na przykład, zmień commit, squash( połącz wiele commitów w jeden), Edytuj lub usuń polecenia., Użyj rebase do zmiany poprzednich komunikatów i uporządkowania historii zmian w gałęzi, aby utrzymać ją w czystości.
Jeśli chcesz zmienić cokolwiek w ostatnich zatwierdzeniach, użyj interactiverebase, przekazując flagę --interactive
(lub -i
) do polecenia rebase.,
na przykład, jeśli chcesz edytować ostatnie trzy commity w swojej gałęzi(HEAD~3
), Uruchom:
git rebase -i HEAD~3
Git otwiera ostatnie trzy commity w edytorze tekstu terminala i opisuje wszystkie interaktywne opcje rebase, których możesz użyć. Domyślną opcją jest pick
, która zachowuje zatwierdzenie bez zmian. Zastąp słowo kluczowe pick
zgodnie z operacją, którą chcesz wykonać w każdym zatwierdzeniu. Aby to zrobić, musisz edytować commity w edytorze tekstowym twojego terminala.,
na przykład, jeśli używasz Vima jako edytora tekstu w powłoce macOS ZSH
I chcesz squashować wszystkie trzy commity(połączyć je w jeden):
- naciśnij ion klawiaturę, aby przejść do trybu edycji Vima.
- Przejdź za pomocą strzałek klawiatury, aby edytować drugie słowo kluczowe commit od
pick
dosquash
(lubs
). Zrób to samo z trzecim zobowiązaniem.Pierwszy commit powinien pozostać niezmieniony (pick
), ponieważ chcemy zgnieść drugi i trzeci do pierwszego., - naciśnij klawisz Escape, aby opuścić tryb edycji.
- wpisz
:wq
aby „zapisać” (zapisać) i „zamknąć”. - Git wyświetla komunikat commit, więc masz szansę go edytować:
- wszystkie linie zaczynające się od
#
są ignorowane i nie są dołączane do pliku commit. Wszystko inne jest wliczone w cenę. - aby zostawić to tak jak jest, wpisz
:wq
. Aby edytować wiadomość zatwierdzającą: przełącz się na tryb edycji, Edytuj wiadomość zatwierdzającą i zapisz ją tak, jak to właśnie zrobiłeś.,
- wszystkie linie zaczynające się od
- Jeśli nie wypchnąłeś swoich commitów do zdalnej gałęzi przed rebasingiem,wciśnij zmiany normalnie. Jeśli już wypchnąłeś te commity, zamiast tego pchnij siłą.
zauważ, że kroki edycji za pomocą wiersza poleceń mogą być nieznacznie różne w zależności od systemu operacyjnego i używanej powłoki.
Zobacz liczne możliwości cofania w Gitcie, aby głębiej przyjrzeć się interaktywnym rebase.,
Wymuś-push
gdy wykonujesz bardziej złożone operacje, na przykład squash commits, reset lub crebase swojej gałęzi, musisz wymusić aktualizację do zdalnej gałęzi.Operacje te implikują przepisanie historii commitów branch.To Wymuś aktualizację, przekaż flagę --force
lub -f
do polecenia push
. Przykład:
git push --force origin my-feature-branch
wymuszanie aktualizacji nie jest zalecane podczas pracy na sharedbranches.
Alternatywnie możesz przekazać flagę--force-with-lease
., Jest to bezpieczniejsze, ponieważ nie nadpisuje żadnej pracy na remotebranch,jeśli więcej commitów zostało dodanych do zdalnej gałęzi przez kogoś innego:
git push --force-with-lease origin my-feature-branch
Jeśli gałąź, którą chcesz wymusić, jest chroniona, nie możesz jej wymusić, chyba że najpierw ją odłączysz. Następnie można go ponownie zabezpieczyć.,
Merge conflicts
ponieważ Git opiera się na porównywaniu wersji linii po linii, gdy linia zmieniona w Twojej gałęzi zbiega się z tą samą linią zmienioną w gałęzi docelowej (po chwili utworzenia z niej gałęzi feature), Gitidentyfikuje te zmiany jako konflikt merge. Aby to naprawić, musisz wybraćktórą wersję tej linii, którą chcesz zachować.
większość konfliktów można rozwiązać poprzez interfejs GitLab.
w przypadku bardziej złożonych przypadków istnieją różne metody ich rozwiązywania. Istnieją również aplikacje GUI Git, które mogą pomóc poprzez wizualizację różnic.,
aby naprawić konflikty lokalnie, możesz użyć następującej metody:
-
Otwórz terminal i sprawdź swoją gałąź funkcji, na przykład
my-feature-branch
:git checkout my-feature-branch
Rebase Twoja gałąź względem docelowej gałęzi, więc Gitprompts cię z konfliktami:
git rebase origin/master
- zaczyna się od znacznika:
<<<<<<< HEAD
., - Poniżej znajduje się treść z Twoimi zmianami.
- znacznik:
=======
wskazuje koniec zmian. - poniżej znajduje się treść najnowszych zmian w gałęzi docelowej.
- znacznik
>>>>>>>
wskazuje koniec konfliktu.
=======
), którą chcesz zachować, a następnie usuń część zawartości, której nie chcesz w pliku.dokonaj zmian:
git add .
zatwierdź zmiany:
git commit -m "Fix merge conflicts"
Kontynuuj rebasing:
git rebase --continue
uwaga do tego momentu możesz uruchomićgit rebase --abort
, aby zatrzymać proces.Git przerywa rebase i przywraca gałąź do stanu, który miałeś przed uruchomieniem git rebase
.,Po uruchomieniu git rebase --continue
rebase nie może zostać przerwany.
Leave a Reply