Qual è la differenza tra “Reset git” e “git checkout”?
-
30-09-2019 - |
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:
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.
git checkout bar
git reset --hard newbar
git branch -d newbar
Soluzione
-
git reset
è specificamente su aggiornare l'indice , muovere la testa. -
git checkout
è di circa l'aggiornamento del albero di lavoro ( per l'indice o l'albero specificato). Si aggiornerà il HEAD solo se si verifica un ramo (in caso contrario, si finisce con una testa monofamiliare).
(In realtà, con Git 2.23 Q3 2019, questo saràgit restore
, non necessariamentegit checkout
)
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 corriamogit 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 commettereA
, ma come lo facciamo è molto diverso.reset
sposterà i punti ramoHEAD
a, Cassa mosse siHEAD
a punto ad un altro ramo.
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 facheckout
);reset
si muove il ramo che la testa sia rivolta a. Ciò significa che se testina è impostata al ramomaster
(vale a dire sei attualmente sul ramomaster
), esecuzionegit reset 9e5e6a4
inizierà facendo puntomaster
a9e5e6a4
. [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.