Wie verwende ich interaktives Rebase beim ersten (Root-)Commit eines Zweigs?

Lesezeit: 3 Minuten

Benutzer-Avatar
Shubham Chaudhary

Wenn ich mich in folgender Situation befinde,

$ git log --oneline
* abcdef commit #b
* 123456 commit #a

Ich weiß, dass ich immer laufen kann

$ git reset HEAD~ 
$ git commit --amend

Ich versuchte jedoch zu rennen

$ git rebase -i HEAD~2

aber ich habe

fatal: Needed a single revision
invalid upstream HEAD~2

Daher meine Frage: Gibt es eine Verwendungsmöglichkeit git rebase diese beiden Commits quetschen oder nicht?

Benutzer-Avatar
jub0bs

Sie möchten auf das Root-Commit Ihres rebasen master Zweig. Genauer gesagt, um die beiden Commits zu quetschen, müssen Sie ausführen

git rebase -i --root

und dann ersetzen squash zum pick in der zweiten Zeile im Puffer des sich öffnenden Editors:

pick 123456 a                                                        
squash abcdef b

Ich verweise auf die git-rebase Manpage Weitere Informationen zu dieser Flagge:

--root

Rebasen Sie alle Commits, die von erreichbar sind <branch>anstatt sie mit einem einzuschränken <upstream>. Auf diese Weise können Sie die Root-Commits auf einen Zweig umbasieren. […]

Beispiel für einen interaktiven Rebase der Wurzel

# Set things up
$ mkdir testgit
$ cd testgit
$ git init

# Make two commits
$ touch README
$ git add README
$ git commit -m "add README"
$ printf "foo\n" > README
$ git commit -am "write 'foo' in README"

# Inspect the log
$ git log --oneline --decorate --graph
* 815b6ca (HEAD -> master) write 'foo' in README
* 630ede6 add README

# Rebase (interactively) the root of the current branch: 
# - Substitute 'squash' for 'pick' on the second line; save and quit the editor.
# - Then write the commit message of the resulting commit; save and quit the editor.
$ git rebase -i --root
[detached HEAD c9003cd] add README; write 'foo' in README
 Date: Sat May 16 17:38:43 2015 +0100
 1 file changed, 1 insertion(+)
 create mode 100644 README
Successfully rebased and updated refs/heads/master.

# Inspect the log again
$ git log --oneline --decorate --graph
* c9003cd (HEAD -> master) add README; write 'foo' in README

Benutzer-Avatar
Guido

Es scheint, dass dieser Parameter helfen kann:

--root 

Rebasieren Sie alle Commits, die von aus erreichbar sind, anstatt sie mit einem einzuschränken. Auf diese Weise können Sie die Root-Commits auf einen Zweig umbasieren.

Dies sollte es Ihnen ermöglichen, Ihr zweites Commit auf das erste zu quetschen (ich schätze, Sie möchten es tatsächlich reparieren):

git rebase --root -i

Achten Sie darauf, zu verstehen, was die Option –root tut, denn in Ihrem Fall erfüllt sie Ihre Anforderungen, kann aber zum Beispiel bei der Verwendung in Zweigen schwierig sein, da sie auf den am weitesten entfernten Vorfahren in der Geschichte basiert, der erreichbar ist (d Wurzel des Baumes); Also rebase --root wird umbasieren z an a durch A-B-D-E-X-Y-Z:

master      A-B-C
               \
upstream        D-E  
                   \     
current branch      X-Y-Z

Ich bin auf diese Frage gekommen, weil ich nach einer Antwort auf den Titel gesucht habe. Die akzeptierte Antwort ergibt bei einem sehr großen Repo eine interaktive Rebase für jeden Commit im Hauptzweig (auch bekannt als: Master), nicht nur für die angegebene Branche. Für jemand anderen, der hierher kommt, besteht die Alternative darin, den übergeordneten Zweignamen (oder Commit) zu verwenden:

git rebase -i <base_branch_name>

Ich erkannte dies, nachdem ich in den Git-Dokumenten gegraben und dies gefunden hatte (https://git-scm.com/docs/git-rebase#_interactive_mode):

Beginnen Sie es mit dem letzten Commit, das Sie unverändert beibehalten möchten:

git rebase -i <after-this-commit>

Ein Editor wird mit allen Commits in Ihrem aktuellen Zweig gestartet (wobei Merge-Commits ignoriert werden), die nach dem angegebenen Commit kommen.

Angenommen, Sie haben branch_a von master abgezweigt und möchten alle Commits interaktiv rebasen branch_a. Dazu würden Sie Folgendes tun:

git rebase -i master

Wenn Sie in der Mitte (oder bei einem Commit) beginnen möchten, können Sie alternativ Folgendes tun:

git rebase -i <some-commit-hash-in-the-middle>

Die andere übliche Form ist, wenn Sie wissen: „Ich möchte 5 Commits von meinem jetzigen Standort aus zurücksetzen“

git rebase -i HEAD~5

Ich hoffe, dies hilft jemand anderem, einen Herzinfarkt zu vermeiden, wenn sein Git-Rebase einen Editor mit Tausenden von Zeilen mit Commits öffnet. ─=≡Σ((( つ><)つ

1227320cookie-checkWie verwende ich interaktives Rebase beim ersten (Root-)Commit eines Zweigs?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy