Interaktywna rebase Git nie wymaga wyboru

105

Jestem na mistrzu i zrobiłem rebase -i <my_branch>

Mieć to:

noop

# Rebase c947bec..7e259d3 onto c947bec
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x <cmd>, exec <cmd> = Run a shell command <cmd>, and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Chciałbym wybrać nie wszystkie commity, ponieważ niektóre z nich nie są mile widziane. Jak pracujesz, gdy chcesz, aby niektóre pliki lub zmiany były zawsze „lokalne” w jakiejś gałęzi? Czy jest jakiś pomocnik .gitignore?

Łukasz
źródło

Odpowiedzi:

85

Podobnie jak nieinteraktywny rebase, musisz ponownie bazować na konkretnym zatwierdzeniu.

Przy nieinteraktywnym rebase, jeśli podasz bezpośredniego przodka bieżącego zatwierdzenia, to niczego nie zmieniasz; z interaktywnym rebase możesz edytować zatwierdzenia po zatwierdzeniu, do którego się odnawiasz, nawet jeśli zatwierdzenie jest bezpośrednim przodkiem twojego bieżącego zatwierdzenia, ale musisz określić to zatwierdzenie, od którego chcesz edytować.

Nie znam szczegółów Twojej sytuacji, ale możesz chcieć czegoś takiego:

# Opportunity to edit or prune commits between origin/master and current branch
git rebase -i origin/master

lub

# Edit some of the last ten commits
git rebase -i HEAD~10 # Note that ~10 uses a tilde("~") not a dash("-"_) !
CB Bailey
źródło
Używanie HEAD~*składni zadziałało dla mnie, ale pierwsza nie.
Dev Yego
25

rebase -ibez zakresu zatwierdzeń nie wyświetli żadnych zatwierdzeń. aby zmienić bazę ostatnich, powiedzmy, 7 zatwierdzeń, użyj następującego:

git rebase -i HEAD~7

uważaj jednak, że to zmieni historię. nie rób tego, jeśli zatwierdzenia są już wysłane


na drugie pytanie: mieć filię ze swoimi zmianami (w zasadzie gałąź Konfiguracja) i regularnie scalić inne branże do niego. w ten sposób zmiany nie zostaną przeniesione do innych branż

knittl
źródło
9

Kiedy używasz git rebase -i, zwykle musisz określić, od którego zatwierdzenia chcesz wykonać rebase. Tak więc, jeśli na przykład chcesz usunąć niektóre zatwierdzenia z ostatnich 10 do bieżącej gałęzi, możesz zrobić:

git rebase -i HEAD~10
svick
źródło
6

Jak wspominali inni, musisz określić zakres zatwierdzenia.

git rebase -i <latest-commit-to-be-retained>

(Zakładając, że znajdujesz się w tej samej gałęzi co zatwierdzenie do edycji) -

Aby określić zatwierdzenia, możesz użyć skrótów HEAD ~ 5 lub użyć sumy kontrolnej sha (którą można uzyskać git log)

W rzeczywistości każde zatwierdzenie będzie działać, jeśli jest przed / przodkiem zmian, które chcesz usunąć / edytować / przeredagować w drzewie. Spowoduje to wyświetlenie wszystkich zatwierdzeń od czasu edycji <latest-commit-to-be-retained>w edytorze (zdefiniowanych w konfiguracji git). Z listy, aby usunąć zatwierdzenie, po prostu usuń tę konkretną linię, zapisz i zamknij (vi habbits :)) plik + edytor i wykonajgit rebase --continue

Jeśli chodzi o drugą odpowiedź, zgadzam się z knittlem

mieć gałąź ze swoimi zmianami (w zasadzie gałąź konfiguracji) i regularnie scalaj z nią inne gałęzie. w ten sposób zmiany nie zostaną przeniesione do innych branż

0xc0de
źródło