Frage Kann nicht nach dem Zurücksetzen von Git --soft HEAD ^ drücken


Gerade jetzt habe ich etwas begangen und geschoben (Ja, mein Fehler beim Push) dass ich entschied, dass ich "rückgängig machen" oder "rückgängig machen" sollte. Also wurde mir gesagt, ich solle ausgeben git reset --soft HEAD^ an meinem Ende, und ich dachte mir, das würde irgendwie ein 'revert'-Commit schaffen, das, wenn es erst einmal begangen wurde, es so machen würde, als wäre die Veränderung nie passiert. Es macht mir nichts aus, wenn die Geschichte der Veränderung überhaupt da ist, genau das, was ich mir vorgestellt habe.

Wie auch immer, nachdem ich das getan habe, habe ich mich wieder verpflichtet, und dann, als ich versuchte zu pushen, bekam ich den Non-Fast-Forward-Fehler. Nun, ich weiß, dass ich etwas mit dem Reset vermasselt habe, etwas in der Art meines Baums und Ursprungsbaums sind jetzt "nicht übereinstimmend", aber ich frage mich, wie ich das beheben kann. Jetzt möchte ich nur zu der Zeit zurückgehen, bevor ich den Reset ausgegeben habe, so dass ich die Änderungen einfach manuell zurücksetzen kann, indem ich sie manuell herausbringe und dann beginne, außer jemand anders kann den richtigen Weg zum Zurücksetzen eines gedrückten Commits empfehlen und durch das meine ich nicht, dass die Geschichte vom Stamm oder irgendetwas weg sein muss.


11
2018-01-06 21:51


Ursprung


Antworten:


Wenn ich Ihr Problem richtig verstehe, könnten Sie Folgendes versuchen:

(Ich gehe davon aus, dass dies dein "Meisterzweig" ist und du zur "Herkunft" drängst)

Synchronisieren Sie mit Ihrer Fernbedienung, um in denselben Zustand zu gelangen.

git remote update
git checkout master
git merge origin/master

Mach jetzt dein Commit rückgängig

git revert HEAD (or where ever the commit you want to revert is now)
git commit -av

Synchronisieren Sie mit Ihrer Fernbedienung

git push

7
2018-01-06 22:05



Jetzt möchte ich nur zu der Zeit zurückgehen, bevor ich den Reset ausgegeben habe

Wenn Sie nur die git reset --soft Sie haben gerade die frühere HEAD-Commit-ID in den Reflogs nachgeschlagen

 $ git reflog
 $ git reset --soft formerCommit

Und dann können Sie Ihre vorbereiten git revert


5
2018-01-06 22:09



Du wolltest es benutzen git revert HEAD um ein neues Commit zu erstellen, das das Commit bei HEAD rückgängig machen würde. Stattdessen haben Sie HEAD zurück zum Commit vor dem aktuellen HEAD verschoben.


0
2018-01-06 22:06



Obwohl meine Antwort über das hinausgeht, was Sie fragen, denke ich, dass es tatsächlich das ist, was Sie beabsichtigen zu tun.

Sie verwendeten git reset --soft HEAD^ um die begangene Verpflichtung rückgängig zu machen. Dies bringt die Arbeitskopie in den Zustand vor dem Commit (seit HEAD zeigt auf Ihren aktuellen Commit, und HEAD^ verweist auf den vorherigen (vorausgesetzt, es gibt nur einen Elternteil).

Aber jetzt, wenn du git push Ihnen wird Folgendes gesagt:

 ! [rejected]            <branch> -> <branch>e (non-fast-forward)
error: failed to push some refs to 'ssh://<remote server>/<remote path>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Dies bedeutet, dass sich die Commits nicht aufreihen und Sie verhindern, dass Sie einen Fehler machen. Die Fehlermeldung ist ein bisschen irreführend und Sie wollen nicht tun, was es vorschlägt (ein Zug, um Ihren Zweig synchron zu bekommen). Sie können nur NICHT wissen, dies aufgrund Ihrer Absichten zu tun.

Du kannst das einfach mit einem umgehen --force (oder -f) (*):

git push --force

Möglicherweise müssen Sie den Upstream erneut einstellen:

git push --force --set-upstream origin <branch>

Seien Sie sich bewusst, dass dies Konsequenzen haben wird, wenn andere Ihre Arbeit bereits gezogen haben, da es verschiedene Commits geben wird, die die gleichen Änderungen (möglicherweise) vornehmen werden. Sehen https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#problems-With-rewritting-history.

Um Probleme zu vermeiden, stoße nur auf deine Filialen (nicht auf einen kommunalen Zweig - zum Beispiel den developmentverzweigen die Devs alle ihre Feature-Zweige in) und sicher sein, zu haben offene Kommunikation in deinem Team.

Ein Entwickler würde typisch benutze dieses Muster für das, was ich anrufe Freitagnachmittag verpflichtet wo Sie Ihre Arbeit vor dem Wochenende im Falle eines Hardware-Fehlers speichern möchten (aber am Montag in den Pre-Commit-Status zurückkehren).

*Friday*

git add --all  # To add all files whether they are tracked or not
git commit -m "Friday afternoon commit"
git --set-upstream push      # --set-upstream is for if the branch doesn't exist on the remote server

*Monday*

git reset --soft HEAD^
git push -f --set-upstream origin <branch>

Der Vorteil, es so zu machen, im Vergleich zu a git revert in einer anderen Antwort diskutiert, ist es, zusätzliche Commits zu vermeiden. Das Zurücksetzen hat 2 Commits und auf diese Weise wird keine (keine zusätzlichen). Der Vorteil von git reset ist, dass es NICHT die Geschichte umschreiben wird, also ist es viel sicherer, vor allem, wenn Sie nicht sicher sind, was Sie tun.

(*) In der Regel sind Repositories so konfiguriert, dass Sie dies NICHT zu beherrschen zulassen, sondern einen Branch reparieren und stattdessen eine Pull-Anfrage erstellen. Denn wenn Sie den obigen Link gelesen haben, hat das Schreiben des Verlaufs auf dem Master schwerwiegende Folgen (es sei denn, Sie sind die einzige Person, die diesen Code jemals klont).


0
2017-11-20 00:29