git bestimmte Revision aus dem Remote-Repository ziehen

56

Wir haben ein Remote-Git-Repo, das wir normalerweise git pushauf unserem Dev-Server und dann git pullauf unseren Live-Servern bereitstellen, um die neueste Push-Version des Repos zu erhalten.

Aber wenn wir ein paar Revisionen (ohne eine git pullauf den Live-Servern) festgeschrieben und gepusht haben, wie können wir dann eine machen git pull, die sich auf die ältere Festschreibung bezieht, die wir wollen?

also sowas wie git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

Vertrauen
quelle

Antworten:

64

Sobald Sie das Repository gezogen haben, sollten Sie in der Lage sein, zu gehen:

git checkout 3ef0d...
Scott Muc
quelle
1
Schön, das hat perfekt funktioniert. Außerdem ist mir aufgefallen, dass ich, wenn ich für zukünftige Pulls wieder synchronisiert werden möchte, den Remote-Server angeben muss, wenn ich den nächsten Pull (dh git pull server:repogegen den regulären git pull) durchführe
dlrust
1
Vielleicht hat OP die falsche Frage gestellt, aber für mich ist es die richtige Frage und dies ist keine Antwort. Auf dem Server ist ein bestimmtes Commit vorhanden, das lokal fehlt. Das Commit ist weder Teil eines Zweigs noch eines Tags und wird nicht mit einem Pull / Fetch übertragen. Wie wird ein bestimmtes Commit abgerufen?
BlackEye
8

uploadpack.allowReachableSHA1InWant

Seit Git 2.5.0 kann diese Konfigurationsvariable auf dem Server aktiviert werden, hier die GitHub-Featureanforderung und das GitHub-Commit, das diese Funktion aktiviert .

Bitbucket Server hat es seit Version 5.5+ aktiviert .

Verwendungszweck:

# 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 ist ein Schauspieler
quelle
2

Wenn ein Prozess auf Ihrem Live-Server sofort auf den soeben abgerufenen Inhalt zugreift (dh Sie können git checkout 3ef0dnach dem Abrufen nicht mehr damit arbeiten ), sollten Sie die Version markieren, die Sie in der Produktion bereitstellen möchten, und dieses Tag speziell in der Produktion auschecken, damit das Abrufen nicht sofort erfolgt ändere dein Arbeitsverzeichnis. Andernfalls riskierst du jemanden, der kurz vor dem Ziehen drückt.

Olaf
quelle
1

Beachten Sie, dass Sie git pull git checkout my-old-commit jetzt in einem DETACHED HEAD-Status verbleiben. Sie senden also zukünftige Commits in diesem Repository über einen neuen Commit-Pfad. Für ein Deployment-Repo ist dies kein großes Problem, da es sich bei den Commits nur um Commits handeln sollte, die vor dem Abrufen bereits korrekt festgeschrieben wurden.

Manchmal ist es jedoch hilfreich zu überprüfen, ob die Commit-Marken (head, tags, remotes) mit dem Master-Repo identisch sind. Um dies zu beheben, gehen Sie wie folgt vor: git reset - Bringen Sie den Kopf wieder an git fetch - Synchronisieren Sie die Markierungen für Fernbedienungen.

Simon Coleman
quelle