Gibt es einen Unterschied zwischen „git reset --hard Hash“ und „git Kasse hash“?

StackOverflow https://stackoverflow.com/questions/2541545

  •  23-09-2019
  •  | 
  •  

Frage

Während reset und checkout haben unterschiedliche Nutzungen die meiste Zeit, ich kann nicht sehen, was Unterschied zwischen diesen beiden ist.

Es ist wahrscheinlich ein oder niemand die Mühe gemacht hätte eine --hard Option Hinzufügen von etwas, das die grundlegenden checkout tun tun können.

Vielleicht gibt es einen Unterschied in der Art und Weise ist, werden Sie die Geschichte sehen?

War es hilfreich?

Lösung

Diese Antwort ist meist aus meiner Antwort auf eine frühere Anfrage zitiert: git reset in einfachem Englisch .

Die beiden sind sehr unterschiedlich. Sie ergeben sich im gleichen Zustand für Zeige- und Arbeit Baum, aber die daraus resultierende Geschichte und Stromzweig nicht gleich sind.

Angenommen, Ihre Geschichte wie folgt aussieht, mit dem Master-Zweig zur Zeit ausgecheckt:

- A - B - C (HEAD, master)

und Sie laufen git reset --hard B. Sie werden diese:

- A - B (HEAD, master)      # - C is still here, but there's no
                            # branch pointing to it anymore

Sie würden tatsächlich bekommen diese Wirkung, wenn Sie --mixed oder --soft zu verwenden - der einzige Unterschied ist, was Ihre Arbeit Baum und Index geschieht. Im --hard Fall der Arbeit Baum und Indexanpassung B.

Nun nehmen wir Sie git checkout B stattdessen laufen würde. Sie würden diese:

- A - B (HEAD) - C (master)

Sie haben in einem frei stehenden HEAD Zustand enden. HEAD, Arbeit Baum, Index all Spiele B, gleich wie mit dem Hard-Reset, aber der Master-Zweig wurde hinter am C links. Wenn Sie ein neues begehen D an dieser Stelle machen, werden Sie dies nicht erhalten, das ist wahrscheinlich nicht das, was Sie wollen:

- A - B - C (master)
       \
        D (HEAD)

So verwenden Sie Kasse, na ja, überprüfen, die zu begehen. Sie können mit ihm Geige, das tun, was Sie wollen, aber Sie haben Ihre Branche hinter sich gelassen. Wenn Sie die Verzweigung bewegt zu wollen, verwenden Sie zurückgesetzt.

Andere Tipps

Wenn Dokumentation mit Git zur Verfügung gestellt hilft Ihnen nicht, einen Blick auf Ein Visual Git Referenz von Mark Lodato.

Insbesondere wenn Sie vergleichen git checkout <non-branch> mit git reset --hard <non-branch> (hotlinked):


(Quelle: github.com )

Beachten Sie, dass im Fall von git reset --hard master~3 Sie hinter einem Teil der DAG von Revisionen verlassen - einige Commits werden nicht von jeder Filiale verwiesen. Diese sind geschützt für (Standard) 30 Tage nach reflog ; sie würden schließlich beschnitten (entfernt) werden.

git-reset hash setzt den Zweig Bezug auf die gegebenen Hash und gegebenenfalls überprüft es aus, with--hard.

git-checkout hash setzt den Arbeits Baum auf den angegebenen Hash; und es sei denn, Hash ein Zweig Name ist, werden Sie mit einem frei stehenden Kopf enden.

schließlich, git beschäftigt sich mit 3 Dinge:

                   working tree (your code)
-------------------------------------------------------------------------
                     index/staging-area
-------------------------------------------------------------------------
      repository (bunch of commits, trees, branch names, etc)

git-checkout standardmäßig aktualisiert nur den Index und den Arbeitsbaum und kann optional Update etwas im Repository (mit -b Option)

git-reset standardmäßig aktualisiert nur das Repository und den Index, und gegebenenfalls den Arbeits Baum (mit --hard Option)

Sie können denken Sie an das Repository wie folgt aus:

 HEAD -> master

 refs:
    master -> sha_of_commit_X
    dev -> sha_of_commit_Y

 objects: (addressed by sha1)

    sha_of_commit_X, sha_of_commit_Y, sha_of_commit_Z, sha_of_commit_A ....

git-reset manipuliert, was die Zweig Referenzen verweisen auf.

Angenommen, Ihre Geschichte sieht wie folgt aus:

           T--S--R--Q [master][dev]
          / 
   A--B--C--D--E--F--G [topic1]
                   \
                    Z--Y--X--W [topic2][topic3]

Beachten Sie, dass Zweige sind nur Namen, die vorher automatisch, wenn Sie zu begehen.

So können Sie die folgenden Zweige haben:

 master -> Q
 dev -> Q
 topic1 -> G
 topic2 -> W
 topic3 -> W

Und Ihr aktueller Zweig ist topic2, das heißt, die HEAD zeigt auf Thema2.

HEAD -> topic2

Dann wird git reset X setzen Sie den Namen topic2 zu Punkt X; wenn das heißt, Sie machen ein P auf Zweig Thema2 begehen, wird es wie folgt aussehen:

           T--S--R--Q [master][dev]
          / 
   A--B--C--D--E--F--G [topic1]
                   \
                    Z--Y--X--W [topic3]
                           \
                            P [topic2]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top