2015-07-16 11 views
20

Voglio fare un git pull ma solo fino a un commit specifico.Git pull fino a un commit particolare

A->B->C->D->E->F (Remote master HEAD) 

in modo che la mia local master punti testa ai B, e voglio tirare fino E. Cosa dovrei fare ?

Questo non sta eseguendo un commit specifico, questo sta tirando fino a un commit specifico.

+0

possibile duplicato di [Estrarre uno specifico commit da un repository git remoto] (http://stackoverflow.com/questions/14872486/pull-a-specific-commit-from-a-remote-git-repository) –

+2

'git fetch' e' git merge E'. – poke

risposta

25

git pull non è altro che git fetch seguito da git merge. Che cosa si può fare è

git fetch remote example_branch

git merge <commit_hash>

+0

Che cosa si intende per "Riferirsi a questo"? – developerbmw

+0

@Brett Hai dimenticato di pubblicare il link .. lo ho rimosso interamente – unrealsoul007

+0

@ unrealsoul007 questo unirà solo uno specifico commit giusto? Quindi per passare da B a E, il comando sarebbe git unire giusto? –

1

Se unisci un commit nel tuo ramo, dovresti ottenere tutta la cronologia.

Rispettare:

 
$ git init ./ 
Initialized empty Git repository in /Users/dfarrell/git/demo/.git/ 
$ echo 'a' > letter 
$ git add letter 
$ git commit -m 'Initial Letter' 
[master (root-commit) 6e59e76] Initial Letter 
1 file changed, 1 insertion(+) 
create mode 100644 letter 
$ echo 'b' >> letter 
$ git add letter && git commit -m 'Adding letter' 
[master 7126e6d] Adding letter 
1 file changed, 1 insertion(+) 
$ echo 'c' >> letter; git add letter && git commit -m 'Adding letter' 
[master f2458be] Adding letter 
1 file changed, 1 insertion(+) 
$ echo 'd' >> letter; git add letter && git commit -m 'Adding letter' 
[master 7f77979] Adding letter 
1 file changed, 1 insertion(+) 
$ echo 'e' >> letter; git add letter && git commit -m 'Adding letter' 
[master 790eade] Adding letter 
1 file changed, 1 insertion(+) 
$ git log 
commit 790eade367b0d8ab8146596cd717c25fd895302a 
Author: Dan Farrell 
Date: Thu Jul 16 14:21:26 2015 -0500 

    Adding letter 

commit 7f77979efd17f277b4be695c559c1383d2fc2f27 
Author: Dan Farrell 
Date: Thu Jul 16 14:21:24 2015 -0500 

    Adding letter 

commit f2458bea7780bf09fe643095dbae95cf97357ccc 
Author: Dan Farrell 
Date: Thu Jul 16 14:21:19 2015 -0500 

    Adding letter 

commit 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 
Author: Dan Farrell 
Date: Thu Jul 16 14:20:52 2015 -0500 

    Adding letter 

commit 6e59e7650314112fb80097d7d3803c964b3656f0 
Author: Dan Farrell 
Date: Thu Jul 16 14:20:33 2015 -0500 

    Initial Letter 
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f 
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 
Note: checking out '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'. 

You are in 'detached HEAD' state. You can look around, make experimental 
changes and commit them, and you can discard any commits you make in this 
state without impacting any branches by performing another checkout. 

If you want to create a new branch to retain commits you create, 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 7126e6d... Adding letter 
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad 
Switched to a new branch 'B' 
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a 
fatal: '790eade367b0d8ab8146596cd717c25fd895302a' does not appear to be a git repository 
fatal: Could not read from remote repository. 

Please make sure you have the correct access rights 
and the repository exists. 
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27 
Updating 7126e6d..7f77979 
Fast-forward 
letter | 2 ++ 
1 file changed, 2 insertions(+) 
$ cat letter 
a 
b 
c 
d 
5

In primo luogo, andare a prendere gli ultimi commit dalla repo remoto. Questo non influenzerà la tua filiale locale.

git fetch origin 

Poi checkout il ramo di monitoraggio remoto e fare un git log per vedere i commit

git checkout origin/master 
git log 

Afferra l'hash del commit commit si desidera unire fino a (o solo i primi ~ 5 caratteri di esso) e di unione che commettono in maestro

git checkout master 
git merge <commit hash> 
+0

Ho votato perché non funziona come pubblicizzato. Prima di tutto, con il tuo metodo "git fetch origin" recupera tutti i rami remoti (questo dovrebbe essere indicato esplicitamente, specialmente per le persone che lavorano in progetti con molti e grandi rami). In secondo luogo, con questo metodo "git merge " non unisce la cronologia locale al commit voluto, se sei di nuovo nella cronologia. Esempio: ci si trova localmente su commit 100, si desidera ottenere fino a 150, recuperando tutto (con HEAD remoto a 100). Nel complesso, per favore non pubblicare roba se non sei chiaro al 110% su ciò che fai. – Placeholder

+0

@Placeholder dovresti leggere il manuale per 'git fetch' prima di scrivere tali assurdità. Oltre a ciò, dovresti leggere la domanda originale e la mia risposta. Se segui la mia risposta, non sarai "indietro nella storia" mentre istruisco esplicitamente l'utente a "git checkout master". Nel complesso, si prega di non pubblicare cose se non si è chiaro almeno al 50% su ciò che si fa. – developerbmw

-1

è possibile anche tirare l'ultimo commit e proprio annullare fino a che la impegnano desiderato:

git pull origin master 
git reset --hard HEAD~1 

Sostituire master con il ramo desiderato.

Usa git log per vedere a che impegnano si desidera ripristinare:

git log 

Personalmente, questo ha funzionato per me meglio.

Fondamentalmente, ciò che fa è tirare l'ultimo commit, e si ripristina manualmente commit uno per uno. Usa git log per vedere la cronologia dei commit.

Punti positivi: Funziona come pubblicizzato. Non è necessario utilizzare l'hash di commit o tirare rami non necessari.

Punti negativi: È necessario ripristinare i commit di uno.

ATTENZIONE: Commit/riporre tutte le modifiche locali, perché con --hard che si sta per perderli. Utilizzare a proprio rischio!

+0

Linus Torvalds probabilmente piangerebbe se sapesse che le persone stavano usando git come questo – developerbmw

+0

@developerbmw: LOL, sembra che qualcuno sia davvero ferito. Grazie per due cose: fiammeggiare su di me due volte su una domanda e stalking il mio profilo e verso il basso votando le mie risposte non correlate. Ottieni i tuoi problemi personali risolti altrove. P.S: Ho notato che segui il mio profilo in giro, perché ovviamente non uso più questo profilo. Ad ogni modo, divertiti con il tuo BWM. P.S: Penso che entrambi questi commenti dovrebbero essere cancellati. Vai a fiamma da qualche altra parte. – Placeholder