it-swarm.com.de

Wie kann ich mich von einem fehlerhaften git Push-f Origin-Master erholen?

Ich habe gerade die falsche Quelle mit der --force-Option in mein Projekt übernommen.

Kann man zurückkehren? Ich verstehe, dass alle vorherigen Zweige mit der -f-Option überschrieben wurden. Daher habe ich möglicherweise meine vorherigen Revisionen falsch gemacht.

65
mrdavenz

Git wirft im Allgemeinen nichts weg, aber es kann immer noch schwierig sein, sich davon zu erholen.

Wenn Sie die richtige Quelle haben, können Sie sie einfach mit der Option --force in die Fernbedienung schieben. Git hat keine Zweige gelöscht, es sei denn, Sie haben es gesagt. Wenn Sie Commits tatsächlich verloren haben, lesen Sie diese nützliche Anleitung zum Wiederherstellen von Commits . Wenn Sie die SHA-1 der Commits kennen, die Sie wollen, sind Sie wahrscheinlich in Ordnung.

Das Beste, was Sie tun können: Sichern Sie alles und sehen Sie, was sich noch in Ihrem lokalen Repository befindet. Tun Sie dasselbe auf der Fernbedienung, wenn möglich. Verwenden Sie git fsck, um zu sehen, ob Sie Dinge wiederherstellen können, und vor allem NICHT git gc ausführen.

Verwenden Sie vor allem die Option --force nur, wenn Sie es wirklich wirklich meinen.

44
Cameron Skinner

Wenn Sie den Commit-Hash kennen, ist es einfach, erstellen Sie einfach Ihren Zweig neu.

5794458...b459f069 master -> master (forced update)

Löschen Sie den entfernten Zweig:

git Push Origin :master

erstellen Sie dann Ihren Zweig mit den folgenden Befehlen neu:

git checkout 5794458
git branch master
git Push Origin master
42
user1094125

Die Lösung wird bereits erwähnt hier

# work on local master
git checkout master

# reset to the previous state of Origin/master, as recorded by reflog
git reset --hard Origin/[email protected]{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, Push the master branch (and only the master branch) to the server
git Push -f Origin master
19
Abdelhafid

Wenn Sie sich nicht in dem lokalen Repo befinden, von dem der erzwungene Push stammt, gibt es auf Origin/Master-Ebene keine Möglichkeit, sich zu erholen. Aber wenn Sie das Glück haben GitHub oder GitHub for Enterprise zu verwenden, können Sie eine haben Schauen Sie sich die REST API an und rufen Sie das verlorene Commit als Patch ab, Beispiel:

  1. Listen Sie Ereignisse auf und suchen Sie das Langformat "commit sha1"

https://api.github.com/repos/Apache/logging-log4j2/events

  1. Laden Sie das verlorene Commit herunter und rufen Sie den zugehörigen Patch im json-Pfad .files []/patch ab

https://api.github.com/repos/Apache/logging-log4j2/commits/889232e28f3863d2a17392c06c1dd8cac68485de

  1. Lokal anwenden und erneut drücken

git apply patch.patch && git commit -m "wiederhergestelltes Festschreiben" && git Push Origin master

6

Eine andere Methode, um das verlorene Commit wiederherzustellen oder um herauszufinden, welche Commits verloren gegangen sind, wenn der vorherige Push nicht von Ihrem lokalen Repo stammt, besteht darin, Ihren CI-Computer zu betrachten.

Wenn Sie einen Job haben, der den Master-Zweig nach jedem Commit (oder einer Reihe von aufeinanderfolgenden Commits) testet, den Sie haben sollten, können Sie einen Blick darauf werfen, was er zuletzt getestet hat. Das ist das Commit, das Sie wiederherstellen müssen.

Der CI-Computer kann sogar einen lokalen Klon des Repos enthalten, von dem aus Sie diese Wiederherstellung durchführen können.

Quelle: wahrscheinlich Continuous Delivery: Zuverlässige Softwareversionen durch Build-, Test- und Bereitstellungsautomatisierung (Addison-Wesley Signature Series (Fowler))

2
user7610

Ich habe dasselbe getan, während ich einen letzten Push für nur eine Datei rückgängig gemacht habe. Am Ende ging es zurück in den ursprünglichen Zustand des Repositorys. Ich habe Git-Befehle von Linus verwendet, da ich die lokale Kopie unter Linux hatte. Zum Glück war diese Kopie noch intakt.

Alles, was ich tat, war (nachdem ich einige weitere Exemplare des lokalen Repos gemacht hatte):

git add .
git status

(es hieß, dass Origin/Master 68 Commits voraus war, gut ... das waren alle Commits, die ich gelöscht habe) 

git remote set-url Origin <GIT_SSH_URL>
git Push

Und alles wurde so wiederhergestellt, wie es war, bevor ich kräftigen Stoß gemacht hatte. Das Wichtigste, an das ich mich erinnern muss, ist, niemals einen Git-Checkout zu machen. nachdem du kräftig gestoßen hast. Die beste Methode ist jedoch, die Push-Option zu deaktivieren. Ich benutze es nie wieder. Ich habe meine Lektion gelernt !! 

2
Pran

Hier können Sie Entscheidungen lesen https://evilmartians.com/chronicles/git-Push---force-and-how-to-deal-with-it

Der zweite half mir ... Ich habe diese Befehle falsch gemacht

1) (some-branch) git pull -> correct command was git pull Origin some-branch

2) (some-branch) git Push -f Origin some-branch

Nach diesen Befehlen habe ich drei Commits verloren. Um sie wiederzugewinnen, schaute ich zum Terminal, wo ich fälschlicherweise "git pull" gemacht habe und dort Output gesehen habe 

60223bf ... 0b258eb some-branch -> Origin/some-branch

Der zweite Hash 0b258eb war genau das, was ich brauchte. Also nahm ich diesen Hash und produziere den Befehl

git Push --force Origin 0b258eb:some-branch
0
Andrey