492 Stimmen

Bestimmte Übertragung entfernen

Ich habe mit einem Freund an einem Projekt gearbeitet, und er hat eine Reihe von Dateien bearbeitet, die nicht hätten bearbeitet werden dürfen. Irgendwie habe ich seine Arbeit mit meiner verschmolzen, entweder, als ich sie abgerufen habe, oder als ich versucht habe, nur die Dateien herauszusuchen, die ich wollte. Ich habe lange gesucht und herumgespielt, um herauszufinden, wie man die Commits entfernt, die die Änderungen an diesen Dateien enthalten, es scheint eine Entscheidung zwischen revert und rebase zu sein, und es gibt keine eindeutigen Beispiele, und die Dokumentation geht davon aus, dass ich mehr weiß als ich tue.

Hier ist also eine vereinfachte Version der Frage:

Wie entferne ich in dem folgenden Szenario die Übergabe 2?

$ mkdir git_revert_test && cd git_revert_test

$ git init
Initialized empty Git repository in /Users/josh/deleteme/git_revert_test/.git/

$ echo "line 1" > myfile

$ git add -A

$ git commit -m "commit 1"
[master (root-commit) 8230fa3] commit 1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 myfile

$ echo "line 2" >> myfile

$ git commit -am "commit 2"
[master 342f9bb] commit 2
 1 files changed, 1 insertions(+), 0 deletions(-)

$ echo "line 3" >> myfile

$ git commit -am "commit 3"
[master 1bcb872] commit 3
 1 files changed, 1 insertions(+), 0 deletions(-)

Das erwartete Ergebnis ist

$ cat myfile
line 1
line 3

Hier ist ein Beispiel dafür, wie ich versucht habe, umzukehren

$ git revert 342f9bb
Automatic revert failed.  After resolving the conflicts,
mark the corrected paths with 'git add <paths>' or 'git rm <paths>'
and commit the result.

2voto

manuskc Punkte 774

Kürzlich begegnete ein ähnliches Problem und endete damit, dies zu tun, die einfacher fühlte, die für einige Fälle funktionieren kann.

Mein Szenario:

% git log --oneline

4ad59d6 commit 3
f244533 commit 2
c5b4688 commit 1

Wir wollten Commit 4 erstellen, wobei die Änderungen in Commit 2 rückgängig gemacht werden sollten. Das haben wir getan:

  1. Holen Sie sich die Änderungen in Commit 2:

    % git show > ~/patches/commit.2.patch

  2. Machen Sie die Änderungen rückgängig:

    % git apply -R ~/patches/commit.2.patch

  3. Erstellen Sie einen neuen Commit:

    % git commit -Am "commit 4: macht Änderungen in commit 2 rückgängig"

P.S.: Dies funktioniert für Fälle, in denen wir leicht revert anwenden können - wenn dieselben Codezeilen im Laufe der Zeit geändert wurden, würde dies nicht funktionieren.

1voto

Frans Punkte 3123

Sie haben also etwas gearbeitet und es veröffentlicht, nennen wir sie Commits A und B. Ihr Kollege hat auch etwas gearbeitet, Commits C und D. Sie haben die Arbeit Ihres Kollegen mit Ihrer zusammengeführt (Merge-Commit E), dann haben Sie weiter gearbeitet, auch das committed (Commit F), und entdeckt, dass Ihr Kollege einige Dinge geändert hat, die er nicht hätte ändern sollen.

Ihr Commit-Verlauf sieht also wie folgt aus:

A -- B -- C -- D -- D' -- E -- F

Sie wollen C, D und D' wirklich loswerden. Da du sagst, dass du die Arbeit deines Kollegen mit deiner zusammengeführt hast, sind diese Commits bereits "da draußen", also ist das Entfernen der Commits z.B. mit Git Rebase ein No-No. Glauben Sie mir, ich habe es versucht.

Ich sehe zwei Auswege:

  • Wenn Sie E und F noch nicht an Ihren Kollegen oder eine andere Person (typischerweise Ihren "Ursprungsserver") weitergegeben haben, können Sie diese vorerst noch aus dem Verlauf entfernen. Dies ist Ihre Arbeit, die Sie sichern wollen. Dies können Sie mit einem

    git reset D'

    (ersetzen Sie D' durch den tatsächlichen Commit-Hash, den Sie von einer git log

    Zu diesem Zeitpunkt sind die Übertragungen E und F verschwunden und die Änderungen sind wieder nicht übertragene Änderungen in Ihrem lokalen Arbeitsbereich. An diesem Punkt würde ich sie in einen Zweig verschieben oder sie in einen Patch umwandeln und für später speichern. Nun stellen Sie die Arbeit Ihres Kollegen zurück, entweder automatisch mit einem git revert oder manuell. Wenn Sie das getan haben, spielen Sie Ihre Arbeit noch einmal darauf ab. Es kann zu Konflikten bei der Zusammenführung kommen, aber zumindest sind sie im Code enthalten. Sie geschrieben hat, anstatt den Code Ihres Kollegen.

  • Wenn Sie die Arbeit, die Sie nach den Commits Ihres Kollegen gemacht haben, bereits gepusht haben, können Sie immer noch versuchen, einen "Reverse Patch" zu bekommen, entweder manuell oder mit git revert aber da Ihre Arbeit sozusagen "im Weg" ist, werden Sie wahrscheinlich noch mehr und noch verwirrendere Zusammenführungskonflikte bekommen. Sieht so aus, als wären Sie in dieser Situation gelandet...

1voto

fayabobo Punkte 51

Hier ist ein kurzes Beispiel dafür, wie man dies mit egit macht:

  1. Ich möchte die Übergabe 3 löschen, bei der ich die Datei 3 hinzugefügt habe. enter image description here
  2. Klicken Sie mit der rechten Maustaste auf die Übergabe vor der zu löschenden Übergabe und wählen Sie "interactive rebase". enter image description here
  3. Wählen Sie in der Rebase-Ansicht die drei Übertragungen und klicken Sie auf das Symbol Überspringen oben. Wenn Sie über dieses Symbol fahren, wird Ihnen mitgeteilt, dass die Übertragung gelöscht wird. enter image description here
  4. Klicken Sie auf rebase starten. enter image description here
  5. Gehen Sie in Git Staging und klicken Sie auf Push. enter image description here
  6. In dem erscheinenden Popup klicken Sie auf force und gehen weiter enter image description here
  7. Danach können Sie sehen, dass die Übertragung gelöscht wurde. enter image description here

0voto

Sushil Punkte 101

Der einfachste Weg, Suchen Sie einfach nach dem Log und zählen Sie die Commits und prüfen Sie die Commit-msg, die Sie löschen möchten.

Ersetzen Sie x mit der Anzahl, ich werde alle Commit-msg anzeigen, löschen Sie einfach die Commit-msg, die Sie entfernen möchten.

# git rebase -i HEAD~x

-3voto

Mansur Ul Hasan Punkte 2026

Ich würde einen sehr einfachen Weg sehen

git reset --hard HEAD <YOUR COMMIT ID>

und dann den entfernten Zweig zurücksetzen

git push origin -f

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X