Git klonen bestimmte Version des Remote-Repository

180

Ich habe vor ungefähr einem Monat ein Remote-Git-Repository geklont. Das Remote-Repository hat viele Änderungen erfahren und ist jetzt instabil geworden. Jetzt brauche ich eine weitere Kopie des Repositorys, deren Version mit der identisch ist, die ich vor einem Monat geklont habe.

Wie mache ich das?

Nandu
quelle
Mögliches Duplikat von stackoverflow.com/questions/3489173/…
Nicolas Raoul
Mögliches Duplikat von Wie klone ich ein Git-Repository mit einer bestimmten Revision / einem bestimmten Änderungssatz?
Ciro Santilli 法轮功 冠状 病 六四 事件 13

Antworten:

241

Sie können Ihr Repository auf ein beliebiges Commit "zurücksetzen" (z. B. vor 1 Monat).

Verwenden Sie dazu git-reset :

git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]
Rui Carneiro
quelle
27
Sie haben es nicht erwähnt, aber dadurch wird nur der masterZweig zurückgesetzt, der standardmäßig auf einem Klon ausgecheckt ist. Wenn ein anderer Zweig als masterIhr Hauptentwicklungszweig ist, der zuerst ausgecheckt werden mussgit reset
Steve Folly
16
Warum sollten Sie das gewünschte Commit nicht einfach auschecken?
Nemoo
10
Weil Sie sich nach dem Auschecken für ein bestimmtes Commit im Status "Getrennter KOPF" befinden.
Rui Carneiro
6
@RuiCarneiro Es ist besser, git checkout -b new_branch hashwenn Sie einen neuen Zweig basierend auf dem Hash erstellen, ohne einen anderen Zweig zu berühren. Das Verschieben des Kopfes eines vorhandenen Zweigs kann zu Problemen führen, wenn es Zeit ist, etwas auf einen Remote-Server zu übertragen.
Loïc Faure-Lacroix
1
@YuriGhensev Wenn das Commit bereits an einen Remote-Zweig git pull origin [branch]gesendet wurde, können Sie es anders machen, afaik, es ist verloren.
Rui Carneiro
93

Sie können einfach verwenden

git checkout  commithash

in dieser Reihenfolge

git clone `URLTORepository`
cd `into your cloned folder`
git checkout commithash

Commit-Hash sieht folgendermaßen aus: "45ef55ac20ce2389c9180658fdba35f4a663d204"

M.Othman
quelle
8
Diese Antwort gefällt mir am besten. Ich denke, a git reset --hardsollte zugunsten von a vermieden werden git checkout commit-hash. A git reset --hardentfernt einen Teil der Git-Geschichte, was manchmal nicht wünschenswert ist.
Jordan Stewart
8
git initist nicht notwendig
Lautaro Paskevicius
37

Verwenden git logSie diese Option, um die Revision zu finden, auf die Sie ein Rollback durchführen möchten, und notieren Sie sich den Commit-Hash. Danach haben Sie 2 Möglichkeiten:

  1. Wenn Sie nach dieser Überarbeitung etwas festlegen möchten, empfehle ich Ihnen, in einer neuen Filiale auszuchecken:git checkout -b <new_branch_name> <hash>

  2. Wenn Sie nicht vorhaben , etwas zu begehen , nachdem diese Revision, können Sie einfach Kasse ohne Zweig: git checkout <hash>- Hinweis: das wird das Repository in einem ‚abgelöst HEAD‘ Zustand versetzt, was bedeutet , seine Zeit nicht an einen Zweig befestigt - dann Sie‘ Ich habe einige zusätzliche Arbeit, um neue Commits zu einem tatsächlichen Zweig zusammenzuführen .

Beispiel:

$ git log
commit 89915b4cc0810a9c9e67b3706a2850c58120cf75
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:15:01 2010 -0300

    Added a custom extension.

commit 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Author: Jardel Weyrich <suppressed>
Date:   Wed Aug 18 20:13:48 2010 -0300

    Missing constness.

$ git checkout 4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7
Note: moving to '4553c1466c437bdd0b4e7bb35ed238cb5b39d7e7'
which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 4553c14... Missing constness.

Auf diese Weise verlieren Sie keine Informationen und können zu einer neueren Version wechseln, wenn diese stabil ist.

jweyrich
quelle
2
Aber auch nicht, dass Sie sich auf einem abgetrennten Kopf befinden, was für schreibgeschützte Operationen in Ordnung ist. Wenn Sie jedoch ab dieser Revision Änderungen vornehmen möchten, müssen Sie einen neuen Zweig erstellen. Weitere Informationen finden Sie unter sitaramc.github.com/concepts/detached-head.html .
Rudi
@ Rudi: Danke. Es war nur ein Beispiel, um die Verwendung zu zeigen. Aktualisiert, um es zu erwähnen.
Jweyrich
Um zum "Arbeitsstatus" zurückzukehren, können Sie genau angeben, git checkout developwo "Entwickeln" der Name Ihrer Niederlassung ist.
Steve Tauber
1
@SteveTauber gut, vorausgesetzt du hast einen anderen Zweig als diesen der arbeitet ändern, um diesen Zweig genug in der Tat ist.
Jweyrich
18

Wenn diese Version, die Sie erhalten müssen, entweder ein Zweig oder ein Tag ist, dann:

git clone -b branch_or_tag_name repo_address_or_path
Onkelchu
quelle
2

Im Gegensatz zu zentralisierten Versionskontrollsystemen klont Git das gesamte Repository, sodass Sie nicht nur die aktuellen Remote-Dateien, sondern den gesamten Verlauf erhalten. Ihr lokales Repository wird all dies enthalten.

Zu diesem Zeitpunkt gab es möglicherweise Tags zum Markieren einer bestimmten Version. Wenn nicht, können Sie sie selbst lokal erstellen. Ein guter Weg, dies zu tun, ist die Verwendung git logoder vielleicht visueller mit Tools wie gitk(vielleicht gitk --allum alle Zweige und Tags zu sehen). Wenn Sie die Commits-Hashes erkennen können, die zu diesem Zeitpunkt verwendet wurden, können Sie sie mit markieren git tag <hash>und diese dann in neuen Arbeitskopien auschecken (z. B. git checkout -b new_branch_name tag_nameoder direkt mit dem Hash anstelle des Tag-Namens).

Bruno
quelle
1

Sie können es so lösen:

git reset --hard sha

wo sha zB:85a108ec5d8443626c690a84bc7901195d19c446

Sie können den gewünschten sha mit dem Befehl erhalten:

git log
Ghislain Zabatio
quelle
1

uploadpack.allowReachableSHA1InWant

Seit Git 2.5.0 kann diese Konfigurationsvariable auf dem Server aktiviert werden. Hier aktivieren die GitHub-Funktionsanforderung und das GitHub-Commit diese Funktion .

Bitbucket Server hat es seit Version 5.5+ aktiviert .

Verwendung:

# Make remote with 4 commits, and local with just one.
mkdir server
cd server
git init
touch 1
git add 1
git commit -m 1
git clone ./ ../local
for i in {2..4}; do
    touch "$i"
    git add "$i"
    git commit -m "$i"
done

# Before last commit.
SHA3="$(git log --format='%H' --skip=1 -n1)"
# Last commit.
SHA4="$(git log --format='%H' -n1)"

# Failing control without feature.
cd ../local
# Does not give an error, but does not fetch either.
git fetch origin "$SHA3"
# Error.
git checkout "$SHA3"

# Enable the feature.
cd ../server
git config uploadpack.allowReachableSHA1InWant true

# Now it works.
cd ../local
git fetch origin "$SHA3"
git checkout "$SHA3"
# Error.
git checkout "$SHA4"
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
0

Der von Ihnen benötigte Quellbaum ist weiterhin im Git-Repository verfügbar. Sie benötigen jedoch die SHA1 des Commits, an dem Sie interessiert sind. Ich würde davon ausgehen, dass Sie die SHA1 von dem aktuellen Klon erhalten können, den Sie haben.

Wenn Sie diesen SHA1 erhalten können, können Sie dort einen Zweig / Reset erstellen, um das identische Repository zu erhalten.

Befehle gemäß Ruis Antwort

gpampara
quelle
0

git resetLöst wahrscheinlich Ihr Problem.

git reset --hard -#commit hash-

quelle