Frage

Wie kann ich von meinem aktuellen Zustand zu einem Snapshot wiederherstellen zu einem bestimmten gemacht begehen?

Wenn ich git log tun, dann bekomme ich folgende Ausgabe:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

Wie revert das Festschreiben vom 3. November das heißt 0d1d7fc begehen?

War es hilfreich?

Lösung

Das hängt viel von, was Sie unter „revert“.

Schalter vorübergehend auf einem anderen commit

Wenn Sie vorübergehend wollen es zurück gehen, Herumtollen, dann kommen Sie zurück, wo Sie sind, alles, was Sie tun müssen, ist, überprüfen Sie die gewünschte begehen:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

Oder wenn Sie Commits machen, während Sie dort sind, gehen Sie vor und eine Niederlassung machen, während Sie gerade dabei sind:

git checkout -b old-state 0d1d7fc32

gehen zurück, wo Sie waren, nur um die Filiale überprüfen Sie wieder waren. (Wenn Sie Änderungen vorgenommen haben, wie immer, wenn Zweige wechseln, werden Sie mit ihnen gegebenenfalls zu tun haben Sie könnten zurückgesetzt, sie wegzuwerfen;. Sie könnten bunkern, Kasse, versteck Pop sie mit Ihnen zu nehmen, könnten Sie verpflichten um sie zu einem Zweig dort, wenn Sie einen Zweig gibt.)

Hard löschen nicht veröffentlichten Commits

Wenn auf der anderen Seite, Sie wirklich wollen, um loszuwerden, alles, was Sie seitdem gemacht haben, gibt es zwei Möglichkeiten. Eins, wenn Sie keine dieser Commits veröffentlicht haben, einfach zurück:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Wenn Sie jetzt, Sie haben Ihre lokalen Änderungen bereits weggeworfen, aber man kann zumindest wieder, wo Sie vorher waren von wieder zurückgesetzt wird.

Rückgängig veröffentlicht Commits mit neuen Commits

Auf der anderen Seite, wenn Sie die Arbeit veröffentlicht haben, werden Sie wahrscheinlich nicht wollen, um den Zweig zurückgesetzt, da diese effektiv Geschichte umgeschrieben wird. In diesem Fall könnte man in der Tat die Commits zurück. Mit Git hat revert eine ganz bestimmte Bedeutung: erstellen mit dem Reverse-Patch verpflichten sie aufzuheben. Auf diese Weise kann keine Geschichte neu schreiben.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

Die git-revert manpage deckt tatsächlich eine Menge von diesem in seiner Beschreibung. Ein weiterer nützlicher Link diese git-scm.com Abschnitt diskutieren git -revert .

Wenn Sie sich entscheiden, Sie wollten nicht, nachdem alle zurückkehren, können Sie die zufließen (wie hier beschrieben) oder zurückzusetzen, bevor der revert (siehe vorheriger Abschnitt).

Sie können auch diese Antwort hilfreich in diesem Fall finden:
Wie HEAD zurück zu einer vorherigen Position zu bewegen? (Frei stehend Kopf)

Andere Tipps

Viele komplizierte und gefährliche Antworten hier, aber es ist eigentlich einfach:

git revert --no-commit 0766c053..HEAD
git commit

Das wird alles von der HEAD wieder zurückkehren zu dem Hash begehen, was bedeutet, es wird neu erstellt, dass Staat im Arbeits Baum begehen als ob jeden commit seit zurück ging gewesen war. Anschließend können Sie den aktuellen Baum begehen, und es wird schaffen verpflichten, eine brandneue im wesentlichen äquivalent zu der Commit Sie „zurückgekehrt“ zu.

(Der --no-commit Flag läßt git revert alle Commits auf einmal auf- sonst werden Sie für die jeweils für eine Meldung aufgefordert werden, begehen im Bereich, Ihre Geschichte mit unnötigen neuen Commits Littering.)

Dies ist eine sichere und einfache Möglichkeit zum Zurückkehren zu einem frühen Zustand . Keine Geschichte zerstört wird, so kann es für Commits verwendet werden, die bereits gemacht worden Öffentlichkeit haben.

Rogue Coder?

Arbeiten auf eigene Faust und nur wollen, um es zu arbeiten? Befolgen Sie diese Anweisungen unten, sie haben sicher für mich und viele andere seit Jahren gearbeitet.

Arbeiten mit anderen? Git ist kompliziert. Lesen Sie die Kommentare unterhalb dieser Antwort, bevor Sie etwas voreilig tun.

Zurückkehren Arbeitskopie Letzte Commit

Um wieder eine vorherige verpflichten, alle Änderungen zu ignorieren:

git reset --hard HEAD

wo HEAD ist die letzte in der aktuellen Zweig begeht

Zurückkehren der Arbeitskopie auf eine ältere Commit

Um wieder eine Festschreibung das ist älter als die letzte commit:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

go Credits auf eine ähnliche Frage Stack-Überlauf, Revert durch einen SHA-Hash in Git zu einem Commit? .

Die beste Option für mich und wahrscheinlich noch andere ist die Git-Reset-Option:

git reset --hard <commidId> && git clean -f

Das war für mich die beste Wahl! Es ist einfach, schnell und effektiv!


Hinweis: Wie in den Kommentaren erwähnt dies nicht tun, wenn Sie Ihren Zweig mit anderen Menschen sind zu teilen, die Kopien der alten Commits haben

Auch aus den Kommentaren, wenn Sie eine weniger ‚Ballzy‘ Methode wollten könnten Sie

git clean -i

Vor der Beantwortung Lassen Sie uns einige Hintergrundinformationen hinzufügen, zu erklären, was diese HEAD ist.

First of all what is HEAD?

HEAD ist einfach eine Referenz auf den aktuellen (spätestens) auf dem aktuellen Zweig commit. Es kann nur eine einzige HEAD zu einem bestimmten Zeitpunkt sein (ohne git worktree).

Der Gehalt an HEAD innerhalb .git/HEAD gespeichert, und es enthält die 40 Byte SHA-1 der aktuellen begehen.


detached HEAD

Wenn Sie nicht auf dem neuesten Stand sind commit -. Was bedeutet, dass HEAD einer vorherigen Hinweis ist in der Geschichte commit es heißt detached HEAD

 Gib Bild Beschreibung hier

Auf der Kommandozeile wird es so aussehen - SHA-1 anstelle der Zweigname, da die HEAD nicht an der Spitze des aktuellen Zweiges zeigt:

 Gib Bild Beschreibung hier


Ein paar Möglichkeiten, wie von einem frei stehenden HEAD zu erholen:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Dies wird neue Niederlassung Zeige Kasse dem Fest Wunsch. Dieser Befehl wird eine Festschreibung gegeben Kasse.

An dieser Stelle können Sie einen Zweig erstellen und an der Arbeit von diesem Punkt beginnen am:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Sie können jederzeit die reflog auch verwenden. git reflog wird jede Änderung angezeigt werden, die die HEAD aktualisiert und die gewünschte reflog Eintrag Check-out wird stellen Sie den HEAD wieder auf diese zu begehen.

Jedes Mal, wenn der HEAD geändert wird es ein neuer Eintrag in dem reflog

sein
git reflog
git checkout HEAD@{...}

Dies wird Sie zurück zu Ihrem gewünschten bekommen commit

 Gib Bild Beschreibung hier


git reset HEAD --hard <commit_id>

"Move" der Kopf zurück in dem gewünschten begehen.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Hinweis: ( Da Git 2.7 ) Sie können auch die git rebase --no-autostash auch verwendet werden.

Dieses Schema zeigt, welcher Befehl tut, was. Wie Sie es reset && checkout ändern Sie den HEAD sehen können.

 Gib Bild Beschreibung hier

Wenn Sie auf „uncommit“ wollen, löschen Sie die letzte Nachricht zu begehen, und setzen die geänderten Dateien in der Inszenierung zurück, würden Sie den Befehl:

git reset --soft HEAD~1
  • --soft zeigt an, dass die ungebundenen Dateien sollten als Arbeitsdateien im Gegensatz zu --hard beibehalten werden, die sie verwerfen würde.
  • HEAD~1 ist die letzte begehen. Wenn Sie 3 Commits rückgängig zu machen möchten können Sie HEAD~3 verwenden. Wenn Sie auf eine bestimmte Revisionsnummer rückgängig zu machen möchten, können Sie auch tun, dass seine SHA-Hash verwendet wird.

Dies ist ein äußerst nützlicher Befehl in Situationen, in denen Sie die falsche Sache begangen und Sie wollen rückgängig zu machen, dass im letzten begehen.

Quelle: http://nakkaya.com/2009/09/24/git- delete-last-commit /

Ich habe eine Menge von Möglichkeiten versucht, lokale Änderungen in Git zurückzukehren, und es scheint, dass dies das am besten funktioniert, wenn Sie nur wiederherstellen möchten auf dem neuesten Stand zu begehen.

git add . && git checkout master -f

Kurzbeschreibung:

  • Es wird keine Commits erstellen, wie git revert der Fall ist.
  • Es wird nicht lösen Sie Ihren Kopf wie git checkout <commithashcode> der Fall ist.
  • Es werden alle lokalen Änderungen außer Kraft setzen und löschen Sie alle hinzugefügten Dateien seit dem letzten in der Branche zu begehen.
  • Es funktioniert nur mit Niederlassungen Namen, so dass Sie nur zurückkehren können auf dem neuesten in der Branche auf diese Weise zu begehen.

fand ich einen viel bequemen und einfachen Weg, um die obigen Ergebnisse zu erreichen:

git add . && git reset --hard HEAD

wo HEAD zeigt auf den neuesten bei Ihnen aktuellen Zweig zu begehen.

Es ist der gleiche Code-Code als boulder_ruby vorgeschlagen, aber ich habe git add . hinzugefügt, bevor git reset --hard HEAD alle neuen Dateien erstellt zu löschen, da die letzten Commit, da das ist, was die meisten Leute erwarten Ich glaube, wenn sie auf den neuesten Zurücksetzen begehen.

Sie können dies tun, indem Sie die folgenden zwei Befehle ein:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

Es wird entfernen Sie Ihre vorherige Git verpflichten.

Wenn Sie Ihre Änderungen behalten möchten, können Sie auch:

git reset --soft [previous Commit SHA id here]

Dann wird es die Änderungen speichern.

OK zurück zur vorherigen in git commit ist ganz einfach ...

Revert zurück ohne Haltung die Änderungen:

git reset --hard <commit>

Revert zurück mit dem Halten , um die Änderungen:

git reset --soft <commit>

Erklären Sie: mit git reset, können Sie auf einen bestimmten Zustand zurückzusetzen, ist es üblich, sie mit einem mit Commit Hash wie Sie oben sehen.

Aber wie Sie den Unterschied sehen wird unter Verwendung der beiden Flags --soft und --hard, die standardmäßig git reset --soft Flag verwendet, aber es ist eine gute Praxis immer die Fahne verwenden, erkläre ich jede Flagge:


- soft

Die Standard-Flag wie erläutert, nicht müssen es schaffen, nicht die Arbeitsbaum ändern, aber alle Änderungen fügen Sie Dateien bereit zu begehen, so dass Sie den Commit-Status zurück, die Änderungen an Dateien unstaged erhalten.


- hart

Seien Sie vorsichtig mit dieser Flagge, setzt er den Arbeitsbaum und alle Änderungen verfolgt Dateien und alle verschwunden sein!


Ich habe auch das Bild unten, dass in einem realen Leben passieren kann mit git arbeiten:

 git reset zu einem Commit

Unter der Annahme, Sie sprechen über Master und an diesem jeweiligen Zweig (das heißt, das jede Arbeitszweig sein könnten Sie mit betroffen sind):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

fand ich die Antwort von in einer Blog-Post (jetzt nicht mehr existiert)

Beachten Sie, dass dies Zurücksetzen und Erzwingen der Änderung an der Fernbedienung, dass dann, wenn andere in Ihrem Team haben bereits git gezogen, haben Probleme für sie verursachen. Sie sind die Änderungshistorie zu zerstören, was ein wichtiger Grund ist, warum die Leute git in erster Linie verwendet werden.

besser zu nutzen revert (siehe andere Antworten) als zurückgesetzt. Wenn Sie ein ein-Mann-Team sind, dann tut es wahrscheinlich keine Rolle.

Hier ist nichts für mich gearbeitet abgesehen von genau dieser Kombination:

git reset --hard <commit_hash>
git push origin <branch_name> --force

Key hier zwingt die Push, kein Extra Commits / Commit-Nachrichten etc.

Angenommen, Sie haben die folgenden Commits in einer Textdatei mit dem Namen ~/commits-to-revert.txt (I verwendet git log --pretty=oneline sie zu bekommen)

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

Erstellen Sie eine Bash Shell-Skript jeder von ihnen zurückkehren:

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

Dieses kehrt alles zurück in den vorherigen Zustand, einschließlich Datei- und Verzeichnis Kreationen und Löschungen, verpflichten sie zu Ihrer Branche und Sie behalten die Geschichte, aber Sie haben es kehrte wieder auf die gleiche Dateistruktur. Warum Git keinen git revert --to <hash> ist mir schleierhaft.

Zusatz Alternativen zu Jefromi Lösungen

Jefromi Lösungen auf jeden Fall die besten sind, und Sie sollten sie auf jeden Fall nutzen. Jedoch aus Gründen der Vollständigkeit, wollte ich auch diese alternative Lösungen zeigen, die auch verwendet werden, kann ein Commit (im Sinne zurückkehren, dass Sie Erstellen Sie eine neue begehen, die rückgängig gemacht Änderungen in früheren commit , wie, was git revert der Fall ist).

Um es klar, diese Alternativen ist nicht der beste Weg, um revert Commits , Revert zu einem Commit durch einen SHA-Hash in Git :

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

Das funktioniert im Grunde unter Ausnutzung der Tatsache, dass Soft-Reset wird den Zustand der vorherigen Festschreibung inszenierte im Index / Staging-Bereich verlassen, die Sie dann begehen können.

Alternative 2: Der aktuelle Baum Löschen und Ersetzen mit der neuen

Diese Lösung kommt von svick Lösung zu Kasse alt begehen und es ein neues begehen machen:

git rm -r .
git checkout <commit> .
git commit

ähnlich Alternative # 1, reproduziert diese den Zustand des <commit> in der aktuellen Arbeitskopie. Es ist notwendig, git rm zuerst zu tun, weil git checkout keine Dateien entfernen, die seit <commit> hinzugefügt wurden.

Hier ist ein viel einfacher Weg zurück zu gehen eine vorherige begehen (und haben es in einem Uncommited Zustand, mit ihm zu tun, was Sie wollen):

git reset HEAD~1

So, keine Notwendigkeit für ids begehen und so weiter:)

Es gibt einen Befehl (nicht Teil des Kern Git, aber es ist in dem git-Extras Paket), die speziell für die Rück und Inszenierung alte Commits:

git back

Per Manpage , kann sie auch als solche verwendet werden:

# Remove the latest three commits
git back 3

Nachdem alle Änderungen, wenn Sie alle diese Befehle schieben, könnten Sie verwenden müssen:

git push -f ...

Und nicht nur git push.

Sie können alle diese ersten Schritte selbst durch und Push zurück zu git Repo.

  1. Ziehen Sie die neueste Version Ihres Repository von Bitbucket die Verwendung von git pull --all Befehl.

  2. Führen Sie den Befehl git log mit -n 4 von Ihrem Terminal. Die Zahl nach dem -n bestimmt die Anzahl der Commits im Protokoll aus den letzten in der lokalen Geschichte begehen zu starten.

    $ git log -n 4

  3. Setzen Sie den Kopf Ihres Repository Geschichte mit der git reset --hard HEAD~N wobei N die Anzahl der Commits ist, dass Sie den Kopf zurück zu nehmen. Im folgende Beispiel würde der Kopf Satz zurück sein verpflichten, bis die letzten in der Repository-Historie begehen:

  4. Drücken Sie die Änderung git Repo mit git push --force zu Kraft Push die Änderung.

Wenn Sie Git Repository zu einem vorherigen wollen begehen

git pull --all
git reset --hard HEAD~1
git push --force

Revert to letzte begehen und alle lokalen Änderungen zu ignorieren:

git reset --hard HEAD

Wählen Sie die gewünschte begehen, und überprüfen Sie es durch

git show HEAD
git show HEAD~1
git show HEAD~2 

, bis Sie das bekommen erforderlich begehen. Um den HEAD Punkt zu, dass zu machen, tut

git reset --hard HEAD~1

oder git reset --hard HEAD~2 oder was auch immer.

Um die Änderungen zu halten von der vorherigen verpflichten, HEAD und Umzug in den vorherigen begehen, tun:

git reset <SHA>

Wenn Änderungen nicht von den vorherigen erforderlich sind, verpflichten, HEAD und nur verwerfen alle Änderungen, tun:

git reset --hard <SHA>

So reinigen Sie vollständig ein Verzeichnis der Coder von einigen zufälligen Veränderungen auf, wir verwendet:

git add -A .
git reset --hard HEAD

Just git reset --hard HEAD wird von Änderungen loszuwerden, aber es wird nicht der „neuen“ Dateien loszuwerden. In ihrem Fall würden sie einen wichtigen Ordner irgendwo zufällig, und all diese Dateien als neues wurden von Git behandelt zufällig gezogen, so dass ein reset --hard nicht beheben ist. Durch die Ausführung der git add -A . vorher, es verfolgt sie ausdrücklich alle mit git, durch den Reset abgewischt werden.

Dies ist ein weiterer Weg, um direkt zu einem letzten Reset commit

git stash
git stash clear

Es klärt direkt alle Änderungen, die Sie gemacht haben seit dem letzten begehen.

PS: Es hat ein kleines Problem; es löscht auch alle Sie zuletzt gespeicherten Stash Änderungen. Was ich in den meisten Fällen raten sollte dabei keine Rolle.

ich glaube, einige Leute auf diese Frage kommen können, wollen wissen, wie engagiert Änderungen rückgängig zu machen sie in ihrem Meister gemacht haben - also wirft alles weg und gehen zurück zum Ursprung / Master, wobei in diesem Fall dies tun:

git reset --hard origin/master

https://superuser.com/questions/273172/how-to -reset-Master-zu-Ursprung-Master

Wenn die Situation ein dringlich ist , und Sie wollen einfach nur das zu tun, was die Fragesteller fragten in einer quick and dirty Art und Weise, Ihr Projektes unter der Annahme ist unter Verzeichnis „my Projekt ":

  1. Kopieren Sie das gesamte Verzeichnis und nennen es etwas anderes, wie "mein Projekt - Kopie"

  2. Sie:

    git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

Sie haben dann zwei Versionen auf Ihrem System ... können Sie prüfen oder zu kopieren oder Dateien von Interesse ändern, oder was auch immer, aus dem vorherigen begehen. Sie können die Dateien unter verwerfen „mein Projekt - Kopie“, wenn Sie das neue Werk wurde nirgendwohin entschieden haben ...

Die offensichtliche Sache, wenn Sie mit dem Zustand des Projekts weiterführen möchten, ohne die Arbeit tatsächlich zu verwerfen, da abgerufene diese begehen ist Ihr Verzeichnis umbenennen wieder: Löschen Sie das Projekt mit dem Commit abgerufene (oder einen temporären Namen geben) und umbenennen „mein Projekt - kopieren“ Verzeichnis zurück zu „mein Projekt“. Dann wahrscheinlich das andere tun ziemlich bald begehen.

Git ist eine brillante Schöpfung, aber man kann nicht einfach „on the fly pick up“: auch Menschen, die versuchen, es zu erklären viel zu oft übernehmen Vorwissen anderer VCS [Version Control Systems ] und viel zu tief viel zu früh, delve und andere Verbrechen zu begehen, wie für „Check-out“ austauschbare Begriffe verwendet - in einer Weise, die manchmal fast einen Anfänger zu verwechseln scheint berechnet.

Sie sich viel Stress sparen Sie haben ziemlich viel haben ein Buch über Git lesen - ich würde empfehlen, " Versionskontrolle mit Git ". Und wenn Sie (meine Narben oder eher) vertrauen Sie mir, wenn ich sage, „müssen“, so folgt daraus, dass Sie so gut es tun könnte jetzt . Ein großer Teil der Komplexität von Git kommt von Verzweigung und dann remerging. Aber aus Ihrer Frage ist es kein Grund, warum Menschen, die Sie mit der Wissenschaft sollten blendend .

Vor allem, wenn, zum Beispiel, das ist eine verzweifelte Situation und du bist ein Neuling mit Git!

PS: Ein anderer Gedanke: Es ist (jetzt) ??eigentlich ganz einfach die Git-Repository ( „Repo“) in einem anderen Verzeichnis als das mit den Arbeitsdateien zu halten. Dies würde bedeuten, Sie würden nicht das gesamte Git Repository kopieren den oben quick & dirty-Lösung. Siehe Antwort von Fryer mit --separate-git-dir hier . Seien Sie gewarnt, , aber: Wenn Sie ein „separates Verzeichnis“ Repository haben, die Sie nicht kopieren und Sie einen Hard-Reset tun, alle Versionen auf den Reset nachfolgenden commit wird für immer verloren sein, es sei denn, Sie haben, als Sie sollten unbedingt regelmäßig Ihre Repository gesichert, vorzugsweise in die Cloud (zB Google Drive ) unter anderem.

Zu diesem Thema von „Sicherung in den Cloud nach oben“, ist der nächste Schritt ein Konto zu eröffnen (natürlich kostenlos) mit GitHub oder (besser meiner Meinung nach) Gitlab. Sie können dann einen git push Befehl regelmäßig tun, um Ihre Cloud-Repo „richtig“ zu sichern. Aber auch hier spricht darüber kann zu früh zu viel sein.

Revert ist der Befehl, um die Commits rückgängig zu machen.

git revert <commit1> <commit2> 

Beispiel:

git revert 2h3h23233

Es ist in der Lage, wie unten reicht von der HEAD nehmen. Hier 1 sagt: "zufällt letzten begehen."

git revert HEAD~1..HEAD

und dann tun git push

Revert Letzter Commit:

git reset --hard HEAD

HEAD ist einfach eine Referenz auf den aktuellen (spätestens) auf dem aktuellen Zweig commit. Es kann nur eine einzige HEAD zu einem bestimmten Zeitpunkt sein.

Revert zu einem älteren Commit: Der schnellste Weg, um eine alte Version wiederherzustellen, ist den reset Befehl zu verwenden:

# Resets index to former commit
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

# Updates working copy to reflect the new commit
git reset --hard

Dies wird Ihre HEAD Zweig an die angegebene Version zurückzuspulen. Alle Commits, die nach dieser Version kamen, sind wirksam rückgängig gemacht; Ihr Projekt ist genau so, wie es zu diesem Zeitpunkt.

war

Der Reset-Befehl wird mit einer Reihe von Optionen, eine der interessanteren ist die --soft Flagge. Wenn Sie es statt --hard verwenden, wird Git alle Änderungen halten in diesen „undone“ Commits als lokale Änderungen.

Wiederherstellen einer Revision in eine Neue lokale Niederlassung

Wie gesagt, auf Ihrem HEAD Zweig den Reset-Befehl wird eine ziemlich drastischen Maßnahmen: es keine Commits entfernen wird (in diesem Zweig), die nach der angegebenen Revision kamen. Wenn Sie sicher sind, dass das ist, was Sie wollen, alles ist in Ordnung.

Es gibt jedoch auch eine Sicherheit Art und Weise, falls Sie Ihren aktuellen HEAD Zweig unangetastet bleiben lieber. Da „Zweig“ so billig ist und leicht in Git, können wir leicht eine Niederlassung schaffen, die zu dieser alten Revision beginnt:

git checkout -b old-project-state 0ad5a7a6

Normalerweise wird die Kasse Befehl nur Schalterzweige verwendet. Um jedoch die Parameter -b bereitstellt, können Sie auch lassen Sie es eine Niederlassung (mit dem Namen old-Projekt-Zustand in diesem Beispiel) erstellen. Wenn Sie nicht wollen, dass es in der aktuellen HEAD Revision zu starten, müssen Sie auch Hash eine Festschreibung schaffen - das alte Projekt Revision wir wiederherstellen möchten

.

Sie haben nun eine Niederlassung namens alt-Projekt-Zustand was die alte Version des Projekts -. Ohne sich zu berühren oder sogar alle anderen Commits oder Zweige zu entfernen

Versuchen Sie, das Zurücksetzen gewünscht begehen -

git reset <COMMIT_ID>

(COMMIT_ID Verwendung git log zu überprüfen)

Dadurch werden alle geänderten Dateien zu un-Added-Zustand.

Jetzt können Sie alle un-hinzugefügten Dateien von

checkout

git checkout .

Überprüfen Sie git log Ihre Änderungen zu überprüfen.

UPDATE

Wenn Sie haben eine und nur in Ihrem Repo begehen, versuchen

git update-ref -d HEAD

Als Ihr Commits fern gedrückt werden, müssen Sie sie entfernen. Lassen Sie uns gehen davon aus Ihrer Branche ist zu entwickeln und es wird umgeworfen Herkunft.

Sie müssen zuerst entfernen, von Herkunft entwickeln:

git push origin :develop (note the colon)

Dann müssen Sie auf den Status wollen Sie entwickeln bekommen, lassen Sie mich annehmen, der Commit Hash ist EFGHIJK:

git reset --hard EFGHIJK

Schließlich drücken entwickeln wieder:

git push origin develop
  

Achtung! Dieser Befehl verliert Geschichte begehen kann verursachen, wenn der Benutzer die falsche setzte fälschlicherweise begehen. Immer en zusätzliche Sicherung Ihrer git einig   wo sonst nur für den Fall, wenn Sie tun, Fehler, als Sie etwas sicherer sind.   :)

Ich habe ähnliches Problem hatte und wollte früher wieder zurück zu Commit. In meinem Fall war intetessered ich nicht neuer zu halten begehen daher ich gebrauchte Hard.

Dies ist, wie ich es getan hätte:

git reset --hard CommitId && git clean -f

Das auf lokale Repository zufällt, hier nach git push -f verwendet, wird Remote-Repository aktualisieren.

git push -f

Wenn Sie einige Fehler korrigieren möchten in der letzten eine gute Alternative zu begehen würde mit git commit --amend Befehl. Wenn die letzten commit wird von keinem Bezug darauf, wird dies den Trick, wie sie begehen eine Festschreibung mit dem gleichen Elternteil als letzten erstellen. Wenn es keinen Hinweis auf die letzten Commit ist, wird es einfach verworfen werden, und dies begehen wird die letzte zu begehen sein. Dies ist eine gute Art und Weise verpflichtet zu korrigieren, ohne Commits zurückkehrt. Aber es hat seine eigenen Grenzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top