Git: Aktualisieren Sie ein Repository auf bestimmte Revision

8

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 , die mich zu einer Lösung inspiriert:

%Vor%

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?

    
Community 30.07.2013, 08:51
quelle

3 Antworten

16

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 ):

%Vor%

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%     
Sébastien Dawans 30.07.2013, 09:00
quelle
5

Sie müssen dafür git checkout verwenden. Tun Sie einfach:

git Kasse B

und Sie werden diese Revision haben.

    
jbr 30.07.2013 08:57
quelle
1

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:

%Vor%

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

%Vor%

Dies gibt nur commit B einen anderen Namen als seinen Hash-Wert. Nach einigen weiteren Commits würde Ihr Zustand wie folgt aussehen:

%Vor%

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:

%Vor%

Mit git reset --hard B erhalten Sie diesen Status:

%Vor%

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.

    
cmaster 24.02.2017 09:16
quelle

Tags und Links