git pull revisione specifica dal repository remoto


57

Abbiamo un repository git remoto che normalmente distribuiamo utilizzando git pushsul nostro server di sviluppo e poi git pullsui nostri server live per ottenere l'ultima versione push del repository.

Ma se abbiamo eseguito il commit e il push di alcune revisioni (senza un git pullserver live) come possiamo fare un git pullriferimento al vecchio commit che vogliamo?

cioè qualcosa di simile git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4

Risposte:


64

Una volta estratto il repository dovresti essere in grado di andare:

git checkout 3ef0d...

1
Bello, ha funzionato perfettamente. Ho anche notato che se voglio tornare in sincronia per i pull futuri, devo specificare il server remoto quando git pull server:repogit pull
eseguo

1
Forse OP ha fatto la domanda sbagliata, ma per me è la domanda corretta e questa non è una risposta. Esiste un commit specifico sul server che manca localmente. Il commit non fa parte di un ramo né di un tag e non viene trasferito con un pull / fetch. Come recuperare un commit specifico?
BlackEye,

8

uploadpack.allowReachableSHA1InWant

Da Git 2.5.0 questa variabile di configurazione può essere abilitata sul server, qui la richiesta della funzione GitHub e il commit GitHub abilitano questa funzione .

Bitbucket Server lo ha abilitato dalla versione 5.5+ .

Uso:

# 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"

2

Se qualche processo sul tuo server live accede immediatamente al contenuto appena estratto (cioè non puoi lavorare con git checkout 3ef0dafter pull), dovresti considerare di taggare la versione che vuoi distribuire in produzione e di verificare specificamente quel tag in produzione, in modo che l'estrazione non immediatamente cambia la tua directory di lavoro. Altrimenti rischieresti di spingere qualcuno prima del tiro.


1

Nota che a git pull git checkout my-old-commit ora ti lascia in uno stato DETACHED HEAD - effettivamente stai inviando futuri commit in questo repository lungo un nuovo percorso di commit. Per un repository di distribuzione questo non è un grosso problema, poiché gli unici commit dovrebbero essere quelli già impegnati correttamente prima di essere estratti.

Tuttavia, a volte è utile verificare che i marker di commit (head, tag, telecomandi) siano identici al repository principale. Per risolvere questo problema dopo il checkout: git reset - ricollega la testa git fetch - sincronizza i marcatori per i telecomandi [questo potrebbe dipendere dalla versione git - ammettiamo che il nostro ambiente è ancora su 1.7 ... quindi potrebbe non essere più necessario YMMV]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.