Aufgrund anderer Antworten hier war ich etwas verwirrt darüber, wie git rebase -i
ein Commit entfernt werden kann. Ich hoffe, dass es in Ordnung ist, meinen Testfall hier aufzuschreiben (sehr ähnlich dem OP).
Hier ist ein bash
Skript, das Sie einfügen können, um ein Test-Repository im /tmp
Ordner zu erstellen :
set -x
rm -rf /tmp/myrepo*
cd /tmp
mkdir myrepo_git
cd myrepo_git
git init
git config user.name me
git config user.email me@myself.com
mkdir folder
echo aaaa >> folder/file.txt
git add folder/file.txt
git commit -m "1st git commit"
echo bbbb >> folder/file.txt
git add folder/file.txt
git commit -m "2nd git commit"
echo cccc >> folder/file.txt
git add folder/file.txt
git commit -m "3rd git commit"
echo dddd >> folder/file.txt
git add folder/file.txt
git commit -m "4th git commit"
echo eeee >> folder/file.txt
git add folder/file.txt
git commit -m "5th git commit"
An dieser Stelle haben wir eine file.txt
mit folgenden Inhalten:
aaaa
bbbb
cccc
dddd
eeee
Zu diesem Zeitpunkt befindet sich HEAD beim 5. Commit, HEAD ~ 1 wäre das 4. - und HEAD ~ 4 wäre das 1. Commit (also würde HEAD ~ 5 nicht existieren). Angenommen, wir möchten das dritte Commit entfernen - wir können diesen Befehl im myrepo_git
Verzeichnis ausgeben :
git rebase -i HEAD~4
( Beachten Sie, dass die git rebase -i HEAD~5
Ergebnisse mit "fatal: Benötigt eine einzelne Revision; ungültiger Upstream-HEAD ~ 5" angezeigt werden . ) Ein Texteditor (siehe Screenshot in der Antwort von @Dennis ) wird mit folgenden Inhalten geöffnet:
pick 5978582 2nd git commit
pick 448c212 3rd git commit
pick b50213c 4th git commit
pick a9c8fa1 5th git commit
# Rebase b916e7f..a9c8fa1 onto b916e7f
# ...
Wir erhalten also alle Commits seit (aber nicht einschließlich ) unserem angeforderten HEAD ~ 4. Löschen Sie die Zeile pick 448c212 3rd git commit
und speichern Sie die Datei. Sie erhalten diese Antwort von git rebase
:
error: could not apply b50213c... 4th git commit
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".
Could not apply b50213c... 4th git commit
Öffnen Sie an dieser Stelle myrepo_git / folder/file.txt
in einem Texteditor. Sie werden sehen, dass es geändert wurde:
aaaa
bbbb
<<<<<<< HEAD
=======
cccc
dddd
>>>>>>> b50213c... 4th git commit
Grundsätzlich git
sieht man, dass, als HEAD zum 2. Commit kam, Inhalt von aaaa
+ war bbbb
; und dann hat es einen Patch mit cccc
+ hinzugefügt, dddd
den es nicht an den vorhandenen Inhalt anhängen kann.
Also hier git
können Sie sich nicht entscheiden - es ist Sie , die eine Entscheidung zu treffen hat: durch die 3. Entfernen begehen, können Sie entweder die Änderungen , indem sie eingeführt halten (hier die Linie cccc
) - oder eben nicht. Wenn Sie dies nicht tun, entfernen Sie einfach die zusätzlichen Zeilen - einschließlich der cccc
- in folder/file.txt
einem Texteditor, damit es so aussieht:
aaaa
bbbb
dddd
... und dann speichern folder/file.txt
. Jetzt können Sie die folgenden Befehle im myrepo_git
Verzeichnis ausgeben :
$ nano folder/file.txt # text editor - edit, save
$ git rebase --continue
folder/file.txt: needs merge
You must edit all merge conflicts and then
mark them as resolved using git add
Ah - so um Marke , dass wir den Konflikt gelöst haben, wir müssen git add
das folder/file.txt
, bevor Sie git rebase --continue
:
$ git add folder/file.txt
$ git rebase --continue
Hier öffnet sich wieder ein Texteditor, der die Zeile anzeigt 4th git commit
- hier haben wir die Möglichkeit, die Commit-Nachricht zu ändern (die in diesem Fall sinnvoll in 4th (and removed 3rd) commit
oder ähnlich geändert werden könnte ). Angenommen, Sie möchten nicht - verlassen Sie einfach den Texteditor, ohne zu speichern. Sobald Sie das tun, erhalten Sie:
$ git rebase --continue
[detached HEAD b8275fc] 4th git commit
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.
An diesem Punkt haben Sie jetzt eine solche Historie (die Sie auch mit say gitk .
oder anderen Tools überprüfen können) des Inhalts von folder/file.txt
(mit anscheinend unveränderten Zeitstempeln der ursprünglichen Commits):
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| dddd
| +eeee
Und wenn wir uns zuvor entschlossen hätten, die Zeile cccc
beizubehalten (der Inhalt des 3. Git-Commits, den wir entfernt haben), hätten wir Folgendes gehabt:
1st git commit | +aaaa
----------------------------------------------
2nd git commit | aaaa
| +bbbb
----------------------------------------------
4th git commit | aaaa
| bbbb
| +cccc
| +dddd
----------------------------------------------
5th git commit | aaaa
| bbbb
| cccc
| dddd
| +eeee
Nun, dies war die Art von Lektüre, von der ich gehofft hatte, dass ich sie gefunden hätte, um herauszufinden, wie das git rebase
Löschen von Commits / Revisionen funktioniert. also hoffe es könnte auch anderen helfen ...