Angenommen, ich habe ein Repository mit einer Revisionsnummer A. Und ich möchte es auf Revision B aktualisieren, während die letzte Revision C ist. (Revision A ist früher als B und B ist früher als C). Ich bin neu in git, also habe ich etwas recherchiert und this
Das funktioniert. Aber da ich nicht git reset --hard B
von A direkt eingeben kann, ist das Präzedenzfall-Update zu spät immer noch zu schwer, und ich frage mich, ob es vielleicht einen einzeiligen Befehl gibt, der meinem Bedarf entspricht. Irgendwelche Hinweise bitte?
Es gibt kein "Aktualisieren eines Repositorys auf eine bestimmte Version". Ihr Repository hat alle Versionen, das ist git fetch
/ git pull
.
Wenn Sie eine bestimmte Revision des Repos in Ihrem aktuellen Arbeitsbaum lokal einfügen möchten, gibt es mehrere Möglichkeiten, dies zu tun. Ihre Frage ist am nächsten:
Aktualisieren Sie Ihr lokales Repository:
%Vor%Erstelle einen neuen Zweig (von welchem Zweig auch immer du gerade kommst, wir werden ihn später wieder zurücksetzen, also ist das egal):
%Vor%Die obigen 2 Operationen können zu einer abgekürzt werden (der aktuelle HEAD wird als Quelle der Verzweigung angenommen):
%Vor% Setzen Sie den Zeiger dieser Verzweigung auf das Commit, das Sie benötigen ( B
):
git reset --hard wird immer funktionieren, es hängt nicht vom Verlauf Ihrer Verzweigung ab, die einzige Bedingung dafür ist, dass Commit B in Ihrer lokalen Objektbasis ist (dh B muss existieren und muss abgeholt worden sein) ein Remote-Repo ist es nicht deine Arbeit).
Wie @Hasturkun hervorhebt, können Sie auch direkt von einem beliebigen Hash mit einem zusätzlichen Argument abzweigen:
%Vor% Ihre Vorgehensweise ist völlig falsch. Sie ändern etwas, das Sie nicht ändern möchten: Ihre aktuelle Verzweigung (vermutlich master
).
Ein einfaches, lineares Git-Repository ist eine Kette von Commits wie diesem
%Vor% Das ist der Zustand Ihres Repositorys, nachdem Sie git fetch
aufgerufen haben. Beachten Sie, dass sich der gesamte Verlauf mit allen Zwischenschritten direkt auf Ihrer lokalen Festplatte befindet. Es ist nur so, dass Sie nur den Status bei commit A
ausgecheckt haben ( HEAD
zeigt auf master
, was auf A
zeigt), also gehören die Dateien, die Sie sehen, zu diesem Status.
Wenn Sie jetzt nur den Status sehen möchten, der als B
festgeschrieben wurde, können Sie sich das Commit mit git checkout B
ansehen. Dadurch werden die angezeigten Dateien in den Status B
und die Punkte HEAD
bei diesem Commit aktualisiert:
HEAD
verweist immer auf die Festschreibung / Verzweigung, von der git
denkt, dass Sie eingeschaltet sind und mit der Ihr Arbeitsverzeichnis verglichen wird, wenn Sie git status
aufrufen.
Das einfache git checkout B
ist ausreichend, wenn Sie sich nur dieses Commit ansehen wollen. Wenn Sie tatsächlich Änderungen vornehmen möchten, die Sie übernehmen und beibehalten möchten, sollten Sie einen neuen Zweig einführen, um diese Änderungen aufzuzeichnen. Dies wird durch ein einfaches git checkout -b newBranch
nach dem git checkout B
erreicht. Dadurch erhalten Sie den Status
Dies gibt nur commit B
einen anderen Namen als seinen Hash-Wert. Nach einigen weiteren Commits würde Ihr Zustand wie folgt aussehen:
Der Punkt ist, dass Sie nach dem Auschecken eines anderen branch / commit mit git checkout ...
immer wieder zum commit D
zurückkehren können, indem Sie git checkout newBranch
aufrufen, und der permanente Verweis stoppt git
vom Garbage-Collecting-Commit D
.
Nun, warum benutzt git reset --hard
schlecht? Zunächst einmal klemmt es alle Ihre lokalen Änderungen, die Sie noch nicht ohne weitere Ankündigung begangen haben. Zweitens kann es Ihnen Geschichte verlieren, wenn Sie nicht vorsichtig damit sind.
Betrachten Sie zum Beispiel den Fall, dass Sie einige Änderungen vorgenommen haben, nachdem Sie das letzte Mal in Ihr Upstream-Repository verschoben wurden, und sich einen historischen Commit B
ansehen möchten. (Etwas das Gegenteil von dem Fall in Ihrer Frage.) Die Geschichte sieht so aus:
Mit git reset --hard B
erhalten Sie diesen Status:
Die Commits in Klammern werden nicht mehr direkt oder indirekt durch irgendeinen Zweig referenziert, und es kann jederzeit Müll gesammelt werden. git
ist möglicherweise nicht sehr aggressiv mit Garbage Collecting, aber wenn es Müll sammelt, während Sie in diesem Zustand sind, gibt es keine Möglichkeit, commit C
zurück zu bekommen, es wird für immer verloren gehen . Du willst nicht, dass das passiert, also ist es keine gute Idee, sich daran zu gewöhnen, git reset --hard
leicht zu benutzen.
Hätten Sie stattdessen git checkout
verwendet, würde der Zweig master
immer noch auf C
zeigen, und Sie könnten immer noch mit einem einfachen git checkout master
darauf zurückkommen.
Tags und Links git