2011-06-26 3 views
61

jestem na pana i zrobiłem rebase -i <my_branch>Git interaktywny rebase nie zobowiązuje się odebrać

Got 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 odebrać niektóre nie zobowiązuje wszystko jak niektórzy z nich nie są mile widziane. Również, jak pracujesz, gdy chcesz zachować niektóre pliki lub zmiany zawsze "lokalne" w niektórych oddziałach? Czy jest jakiś pomocnik, taki jak .gitignore?

Odpowiedz

58

Podobnie jak nieinteraktywny rebase, należy dokonać ponownego podziału na określone zatwierdzenie.

Przy nieinteraktywnym podbiciu, jeśli podasz bezpośredni przodek bieżącego zatwierdzenia, nic nie zmieniasz; przy użyciu interaktywnego rebase'a możesz edytować commit po zatwierdzeniu, na które się opierasz, nawet jeśli commit jest bezpośrednim przodkiem twojego bieżącego commit, ale musisz określić to zatwierdzenie, od którego chcesz dokonać edycji.

Nie znam szczegółów sytuacji, ale może chcesz coś 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("-"_) ! 
20

rebase -i bez zakresu zatwierdzenia nie będzie wyświetlać żadnych zatwierdzeń. w celu ponownego wprowadzenia ostatniego, powiedzmy, 7 commitów użyj:

git rebase -i HEAD~7 

uważaj jednak, że to przerobi historię. nie rób tego, jeśli commity już popychany


do drugiego pytania: mieć filię ze swoimi zmianami (w zasadzie gałąź Konfiguracja) i regularnie łączyć inne oddziały do nim. w ten sposób zmiany nie zostaną przeniesione do innych oddziałów.

8

Kiedy używasz git rebase -i, zwykle trzeba określić, od którego zatwierdzenia chcesz wykonać rebase. Tak więc, jeśli na przykład chcesz usunąć niektóre zobowiązuje między ostatnim 10 do bieżącego oddziału, zrobiłbyś:

git rebase -i HEAD~10 
4

Jak wspominają inni, trzeba określić zakres popełnienia.

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

(Zakładając, że jesteś w tej samej branży, jak popełnić być edytowane) -

Aby określić zobowiązuje, można użyć głowicy ~ 5 Shorthands lub użyj sha kontrolną (które można get by git log)

W rzeczywistości każde zatwierdzenie zrobi, jeśli jest wcześniejsze/przodek do zatwierdzeń, które chcesz usunąć/edytować/przełączyć w drzewie. Spowoduje to wyświetlenie wszystkich zatwierdzeń od <latest-commit-to-be-retained> w edytorze (zdefiniowanych w konfiguracji git).Z listy, aby usunąć popełnienia, po prostu usunąć ten konkretny wiersz, zapisać i wyjść (vi habbits :)) + plik edytora, a nie git rebase --continue

Na drugą odpowiedź, zgadzam się z Knittla

ma gałąź z Twoimi zmianami (w zasadzie gałąź konfiguracji) i regularnie scalają z nią inne gałęzie. w ten sposób zmiany nie zostaną przeniesione do innych oddziałów