Domanda

Ho sempre pensato di git reset e git checkout come lo stesso, nel senso che entrambi portano sul retro del progetto ad una specifica commettere. Tuttavia, ritengo che non possono essere esattamente lo stesso, dato che sarebbe ridondante. Qual è la differenza reale tra i due? Sono un po 'confuso, come svn ha solo svn co per ripristinare il commit.

AGGIUNTO

VonC e Charles spiegate le differenze tra git reset e git checkout davvero bene. La mia comprensione attuale è che ripristini git reset tutte le modifiche indietro a uno specifico impegno, mentre git checkout più o meno si prepara per un ramo. Ho trovato i seguenti due diagrammi molto utile nel venire a questa comprensione:

http://a.imageshack.us/img651/1559/86421927.png http://a.imageshack.us/img801/1986/resetr.png

aggiunto 3

Da http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase .html , checkout e di ripristino in grado di emulare il rebase.

 entrare descrizione dell'immagine qui

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

 entrare descrizione dell'immagine qui

È stato utile?

Soluzione

A titolo di confronto, dal momento che svn non ha un indice, solo un albero di lavoro, svn checkout copierà un dato di revisione su una directory separata.
Il più vicino equivalente per git checkout sarebbe:

  • svn update (se siete nello stesso ramo, il che significa la stessa SVN URL)
  • svn switch (se si checkout per esempio lo stesso ramo, ma da un altro SVN repo URL)

Tutti quei tre che lavorano modifiche albero (svn checkout, update, switch) hanno solo un comando in git:. git checkout
Ma dal momento che git ha anche il concetto di indice (che "area di messa in scena" tra il pronti contro termine e l'albero di lavoro), si hanno anche git reset.


Thinkeye menziona nei commenti l'articolo " reset Demystified ".

  

Per esempio, se abbiamo due rami, 'master' e 'develop' indicando diversi commit, e siamo attualmente in 'develop' (così punti testa per esso) e corriamo git reset master, 'develop' si farà ora puntano alla stessa commettere che 'master' fa.

     

D'altra parte, se noi invece corriamo git checkout master, 'develop' non si sposterà, HEAD si farà. HEAD ora puntare a 'master'.

     

Quindi, in entrambi i casi ci stiamo muovendo HEAD al punto di commettere A, ma come lo facciamo è molto diverso. reset sposterà i punti ramo HEAD a, Cassa mosse si HEAD a punto ad un altro ramo.

http://git-scm.com/images/reset/reset-checkout.png

Per questi punti, però:

Larsh aggiunge nei commenti :?

  

Il primo paragrafo di questa risposta, però, è fuorviante: "git checkout ... aggiornerà TESTA solo se si verifica un ramo (in caso contrario, si finisce con una testa monofamiliare)"
  Non è vero: git checkout aggiornerà la HEAD, anche se si verifica un commit che non è un ramo (e sì, si finisce con la testa staccata, ma ancora ottenuto aggiornato).

git checkout a839e8f updates HEAD to point to commit a839e8f.

De Novo concorre nei commenti :?

  

@LarsH è corretta.
  Il secondo proiettile ha un'idea sbagliata di ciò che testa è in aggiornerà la HEAD solo se si verifica un ramo.
  TESTA va ovunque ci si trovi, come un'ombra.
  Visitando alcuni ref non ramo (ad esempio, un tag), o un commit direttamente, si muoverà HEAD. testa indipendente non significa che avete staccato dalla testa, significa che la testa si stacca da un ramo ref, che si può vedere da, per esempio, git log --pretty=format:"%d" -1.

     
      
  • Stati testa attaccata inizieranno con (HEAD ->,
  •   
  • indipendente sarà ancora mostrare (HEAD, ma non avrà una freccia a un ramo rif.
  •   

Altri suggerimenti

Nella loro forma più semplice, reset reimposta l'indice senza toccare l'albero di lavoro, mentre checkout cambia l'albero di lavoro senza toccare l'indice.

Ripristina l'indice partita HEAD, albero di lavoro lasciato solo:

git reset

Concettualmente, questo controlli fuori l'indice contro l'albero di lavoro. Per arrivare a fare in realtà tutto ciò che si dovrebbe utilizzare -f per forzarlo a sovrascrivere eventuali modifiche locali. Questa è una caratteristica di sicurezza per assicurarsi che la forma "nessun argomento" non è distruttiva:

git checkout

Una volta che si avvia l'aggiunta di parametri è vero che c'è una certa sovrapposizione.

checkout di solito è usato con un ramo, tag o commettono. In questo caso sarà resettare HEAD e l'indice per la data impegnarsi oltre a svolgere cassa dell'indice contro l'albero di lavoro.

Inoltre, se si fornisce --hard a reset si può chiedere reset per sovrascrivere l'albero di lavoro, nonché il ripristino dell'indice.

Se si dispone di un ramo corrente estratto fuori v'è un diverso cruciale tra reset e checkout quando si fornisce una diramazione alternativa o commettere. reset cambierà il ramo corrente punto selezionato commit che checkout lascerà la diramazione corrente solo ma si verifica il ramo fornito o commit al posto.

Altre forme di reset e commit coinvolgono fornendo il percorso.

Se si fornisce percorsi per reset non è possibile fornire --hard e reset cambierà solo la versione dell'indice dei percorsi in dotazione alla versione in dotazione commit (o HEAD se non si specifica un commit).

Se si fornisce percorsi per checkout, come reset esso aggiornerà la versione dell'indice dei percorsi forniti per abbinare il commit in dotazione (o HEAD), ma sarà sempre checkout la versione dell'indice dei percorsi in dotazione nei albero di lavoro.

Un semplice caso d'uso, se riconfluiscono cambiamento:
1. Utilizzare ripristino se si desidera annullare messa in scena di un file modificato.
2. Utilizzare cassa se si vuole modifiche scartare a file di Unstaged / s.

Atlassian darci un'ottima spiegazione su Ripristino git , git checkout e così, git revert . In questo articolo, si spiega i diversi usi di questi comandi su un diverso livello - di file, messo in scena snapshot e impegnarsi

.

https://www.atlassian.com/git/ tutorial / reset-check-out-and-ritornando

La differenza fondamentale in sintesi è che reset muove il riferimento diramazione corrente , mentre checkout no (si muove HEAD).

Come il libro Pro Git spiega sotto reset Demystified ,

  

La prima cosa reset farà è mossa cosa HEAD punti per . Questo non è   lo stesso come HEAD cambiando stessa (che è quello che fa checkout); reset    si muove il ramo che la testa sia rivolta a. Ciò significa che se testina è impostata   al ramo master (vale a dire sei attualmente sul ramo master),   esecuzione git reset 9e5e6a4 inizierà facendo punto master a   9e5e6a4. [Enfasi aggiunta]

Si veda anche la risposta di VonC per un testo molto utile e schema estratto dallo stesso articolo, che io non duplicare qui.

Naturalmente ci sono molti più dettagli su ciò che effetti checkout e reset possono avere sull'indice e l'albero di lavoro, a seconda di cosa vengono utilizzati i parametri. Non ci può essere un sacco di analogie e differenze tra i due comandi. Ma come la vedo io, la differenza più importante è se si muovono la punta del ramo corrente.

I due comandi (reset e checkout) sono completamente diversi.

checkout X NON reset --hard X

Se X è un nome ramo, checkout X cambierà il ramo corrente mentre reset --hard X non lo faranno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top