Git Interactive Rebase keine Commits zu wählen

105

Ich bin Meister und habe es getan rebase -i <my_branch>

Verstanden:

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.
#

Ich möchte einige Commits auswählen, nicht alle, da einige von ihnen nicht willkommen sind. Wie arbeiten Sie auch, wenn Sie einige Dateien oder Änderungen in einem Zweig immer "lokal" behalten möchten? Gibt es einen Helfer wie .gitignore?

Lukasz
quelle

Antworten:

85

Wie bei einer nicht interaktiven Rebase müssen Sie auf ein bestimmtes Commit zurückgreifen.

Wenn Sie bei einer nicht interaktiven Rebase einen direkten Vorfahren des aktuellen Commits angeben, ändern Sie nichts. Mit einer interaktiven Rebase können Sie Commits nach dem Commit bearbeiten, auf das Sie neu basieren, auch wenn das Commit ein direkter Vorfahr Ihres aktuellen Commits ist. Sie müssen jedoch dieses Commit angeben, ab dem Sie es bearbeiten möchten.

Ich kenne die Details Ihrer Situation nicht, aber Sie möchten vielleicht so etwas:

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

oder

# Edit some of the last ten commits
git rebase -i HEAD~10 # Note that ~10 uses a tilde("~") not a dash("-"_) !
CB Bailey
quelle
Die Verwendung der HEAD~*Syntax hat bei mir funktioniert, die erste jedoch nicht.
Dev Yego
25

rebase -iOhne Commit-Bereich werden keine Commits angezeigt. Verwenden Sie Folgendes, um die letzten 7 Commits neu zu starten:

git rebase -i HEAD~7

Seien Sie jedoch vorsichtig, dass dies die Geschichte neu schreibt. Tun Sie es nicht, wenn die Commits bereits gepusht sind


Ihre zweite Frage: einen Zweig mit Änderungen haben (im Grunde eine Konfigurationszweig) und regelmäßig die anderen Zweige verschmelzen in ihm. Auf diese Weise werden die Änderungen nicht in andere Zweige verschoben

stricken
quelle
9

Wenn Sie verwenden git rebase -i, müssen Sie normalerweise angeben, für welches Commit Sie die Rebase durchführen möchten. Wenn Sie beispielsweise einige der Commits unter den letzten 10 für den aktuellen Zweig entfernen möchten, gehen Sie wie folgt vor:

git rebase -i HEAD~10
svick
quelle
6

Wie bereits erwähnt, müssen Sie einen Festschreibungsbereich angeben.

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

(Angenommen, Sie befinden sich im selben Zweig wie das zu bearbeitende Commit.) -

Um die Commits anzugeben, können Sie die Abkürzungen HEAD ~ 5 oder die sha-Prüfsumme verwenden (die Sie erhalten können git log ).

Tatsächlich funktioniert jedes Commit, wenn es Vorgänger / Vorfahr der Commits ist, die Sie im Baum löschen / bearbeiten / umformulieren möchten. Dadurch werden alle Commits seit dem aufgelistet<latest-commit-to-be-retained> im Editor auf (definiert in Ihrer Git-Konfiguration). Um ein Commit aus der Liste zu löschen, löschen Sie einfach diese bestimmte Zeile, speichern und beenden Sie (vi habbits :)) die Datei + den Editor und tun Sie diesgit rebase --continue

Bei der zweiten Antwort stimme ich knittl zu

Haben Sie einen Zweig mit Ihren Änderungen (im Grunde ein Konfigurationszweig) und führen Sie die anderen Zweige regelmäßig darin zusammen. Auf diese Weise werden die Änderungen nicht in andere Zweige verschoben

0xc0de
quelle