2010-01-06 24 views
10

Gerade jetzt ich engagierte und schob etwas (ja, mein Fehler auf dem Push), dass ich entschied, ich sollte "rückgängig machen" oder "rückgängig machen". Also wurde mir gesagt, ich solle git reset --soft HEAD^ an meinem Ende ausstellen, und ich dachte mir, dass dies irgendwie eine 'revert'-Übereinkunft erzeugen würde, die es einmal so machen würde, als ob die Veränderung nie passiert wäre. Es macht mir nichts aus, wenn die Geschichte der Veränderung überhaupt da ist, genau das, was ich mir vorgestellt habe.Kann nicht nach Git Reset - SOFT HEAD^

Wie auch immer, nachdem ich das getan habe, habe ich es erneut begangen, und dann, als ich versuchte zu drücken, 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.

Antwort

7

Wenn ich Ihr Problem richtig verstehen könnten Sie versuchen, die folgenden:

(Ich gehe davon aus das ist Ihr ‚Master‘ Zweig und Sie drängen auf ‚Herkunft‘)

Sync mit Ihrem Fern um in denselben Staat zu kommen.

git remote update 
git checkout master 
git merge origin/master 

Jetzt zurückkehren Ihre

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

Sync verpflichten sich mit der Fernbedienung

git push 
0

Sie wollten git revert HEAD verwenden, um eine neue zu erstellen begehen das wäre der bei HEAD begehen rückgängig machen. Stattdessen haben Sie HEAD zurück zum Commit vor dem aktuellen HEAD verschoben.

+0

Danke, das macht Sinn, obwohl das wahrscheinlich besser als Kommentar gewesen wäre, da es mein Problem nicht wirklich behebt. Trotzdem danke. –

5

Jetzt möchte ich nur auf die Zeit zurück zu gehen, bevor ich den Reset ausgegeben

Wenn Sie nur abbrechen möchten die git reset --soft Sie tat genau, können Sie den ehemaligen HEAD begehen ID in der nachschlagen reflogs

$ git reflog 
$ git reset --soft formerCommit 

Und dann können Sie Ihre git revert

+0

Danke, das ist ähnlich dem, was jemand im IRC mir gesagt hat, aber es ist ziemlich verwirrend, also werde ich mit der Antwort von rnicholson zu Dokumentationszwecken gehen. –

+1

Ich war nicht vertraut mit Git Reflog. Sehr cool. Etwas Neues gelernt. Dies ist wahrscheinlich eine bessere Lösung, da es die ersten 3 Schritte meiner Antwort auf einen Befehl komprimiert. – rnicholson

0

vorbereiten Obwohl meine Antwort über das, was Sie fragen, Ich denke, das ist genau das, was Sie vorhaben.

Sie haben git reset --soft HEAD^ verwendet, um das von Ihnen vorgenommene Commit rückgängig zu machen. Dadurch wird die Arbeitskopie in den Zustand vor Ihrer commit (seit HEAD Punkte zu Ihrem aktuellen begehen, und HEAD^ Punkte auf der einen, bevor es (vorausgesetzt, es ist nur ein Elternteil).

Aber jetzt, wenn Sie git push Sie etwas gesagt wie:

! [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 wird sagen, dass die Commits nicht in einer Reihe aufstellen und es ist da, um Sie zu verhindern, einen Fehler zu machen Die Fehlermeldung ein wenig irreführend ist und Sie nicht wollen, zu tun, was es vermuten lässt. (ein Pull, um Ihren Zweig synchron zu machen.) Sie können nur NICHT wissen, dies aufgrund Ihrer Absichten zu tun.

Sie können einfach dieses Problem umgehen, mit einem --force (oder -f) (*):

git push --force 

Sie müssen möglicherweise erneut die Upstream einzustellen:

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

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

Probleme zu vermeiden, immer nur auf Ihre Zweige tun drückt (nicht einige kommunale Zweig - zum Beispiel die development Zweig die Entwickler ihre Funktion alle Verzweigungen in merge) und sicher sein, offene Kommunikation in Ihrem Team haben.

Ein Entwickler würde typischerweise Verwendung dieses Muster für das, was ich nenne Freitag Nachmittag verpflichtet, wo Sie Ihre Arbeit vor dem Wochenende im Fall von Hardware-Fehlern speichern möchten (aber auf die Rückkehr pre-commit Zustand am Montag) .

*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 auf diese Weise zu tun, im Vergleich zu einem git revert in einer anderen Antwort erwähnt, ist extra 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 Geschichte schreiben wird, so ist viel sicherer, vor allem, wenn Sie nicht sicher sind, was Sie tun.

(*) In der Regel sind Repositorys so konfiguriert, dass Sie dies nicht zu beherrschen, sondern einen Zweig reparieren und stattdessen eine Pull-Anforderung 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).

Verwandte Themen