Git in modo succinto Annullare le modifiche

L'intero aspetto del mantenimento di copie "sicure" di un progetto software è la tranquillità: se il tuo progetto dovesse improvvisamente interrompersi, saprai di avere un facile accesso a una versione funzionale e sarai in grado di individuare esattamente dove si trova il problema è stato presentato. A tal fine, la registrazione dei commit è inutile senza la possibilità di annullare le modifiche. Tuttavia, poiché Git ha così tanti componenti, "annullare" può assumere molti significati diversi. Ad esempio, puoi:

  • Annulla le modifiche nella directory di lavoro
  • Annulla le modifiche nell'area di staging
  • Annulla un intero commit

Per complicare ulteriormente le cose, ci sono molti modi per annullare un commit. Puoi:

  1. Basta eliminare il commit dalla cronologia del progetto.
  2. Lascia il commit così com'è, usando un nuovo commit per annullare le modifiche introdotte dal primo commit.

Git ha uno strumento dedicato per ciascuna di queste situazioni. Iniziamo con la directory di lavoro.


Annullamento nella directory di lavoro

Il periodo di tempo immediatamente successivo al salvataggio di una copia sicura di un progetto è di grande innovazione. Potenziato dalla consapevolezza che sei libero di fare nulla vuoi senza danneggiare la base del codice, puoi sperimentare a tuo piacimento. Tuttavia, questa sperimentazione spensierata prende spesso una svolta sbagliata e porta a una directory di lavoro con un mucchio di codice off-topic. Quando raggiungi questo punto, probabilmente vorrai eseguire i seguenti comandi:

 git reset --hard HEAD git clean -f

Questa configurazione di git reset rende la directory di lavoro e lo stage corrispondenti ai file nel commit più recente (anche chiamato CAPO), cancellando efficacemente tutte le modifiche non eseguite in cingolato File. Per smaltire untracked file, devi usare il pulito comando. Git è molto attento a rimuovere il codice, quindi devi anche fornire il file -f opzione per forzare la cancellazione di questi file.


Ripristino di tutte le modifiche non salvate

File individuali

È anche possibile scegliere come target singoli file. Il seguente comando farà sì che un singolo file nella directory di lavoro corrisponda alla versione nel commit più recente.

 GIT checkout HEAD 

Questo comando non modifica la cronologia del progetto, quindi puoi tranquillamente sostituirlo CAPO con un ID commit, un ramo o un tag per fare in modo che il file corrisponda alla versione in quel commit. Ma, fallo non prova questo con git reset, come volontà cambia la tua storia (spiegato in Annullare commit).


Ripristino di un file con git checkout

Annullamento nell'area di staging

Durante la configurazione del prossimo commit, di tanto in tanto aggiungi un file extra allo stage. La seguente invocazione di git reset lo sottrarrà:

 git reset HEAD 

Omettendo il --difficile flag dice a Git di lasciare la directory di lavoro da sola (opposta a git reset --hard HEAD, che resetta ogni file sia nella directory di lavoro che nello stage). La versione a fasi del file corrisponde CAPO, e la directory di lavoro conserva la versione modificata. Come ci si potrebbe aspettare, questo si traduce in una modifica non modificata nel tuo stato git produzione.


Disattivare un file con git reset

Annullare commit

Ci sono due modi per annullare un commit usando Git: puoi farlo entrambi reset semplicemente rimuovendolo dalla cronologia del progetto, o è possibile ritornare generando un nuovo impegno che si sbarazza delle modifiche introdotte nell'originale. Annullare l'introduzione di un altro commit può sembrare eccessivo, ma riscrivere la cronologia rimuovendo completamente i commit può avere conseguenze nefaste nei flussi di lavoro multiutente.

Ripristino

Il sempre versatile git reset può anche essere usato per mossa il CAPO riferimento.

 git reset HEAD ~ 1

Il HEAD ~ 1 parametro di sintassi specifica il commit che si verifica immediatamente prima CAPO (allo stesso modo, HEAD ~ 2 si riferisce al secondo commit prima CAPO). Spostando il CAPO riferimento all'indietro, stai effettivamente rimuovendo il commit più recente dalla cronologia del progetto.


In movimento CAPO a HEAD ~ 1 con git reset

Questo è un modo semplice per rimuovere un paio di commit che hanno virato fuori tema, ma presenta un serio problema di collaborazione. Se altri sviluppatori avessero iniziato a costruire sulla parte superiore del commit che abbiamo rimosso, in che modo si sincronizzerebbero con il nostro repository? Dovrebbero chiederci l'ID del commit sostitutivo, rintracciarlo manualmente nel repository, spostare tutte le modifiche su quel commit, risolvere i conflitti di merge e quindi condividere le loro "nuove" modifiche con tutti ancora. Immagina cosa succederebbe in un progetto open-source con centinaia di contributori ...

Il punto è, non reimpostare i commit pubblici, ma sentiti libero di eliminare quelli privati ​​che non hai condiviso con nessuno. Rivedremo questo concetto più avanti in questa sessione.

Ripristino

Per rimediare ai problemi introdotti ripristinando i commit pubblici, gli sviluppatori Git hanno escogitato un altro modo per annullare i commit: il ripristino. Invece di modificare i commit esistenti, il ripristino aggiunge a nuovo commit che annulla il problema commit:

 git revert 

Questo prende le modifiche nel commit specificato, capisce come annullarle e crea un nuovo commit con il changeset risultante. Per Git e per altri utenti, il comando di ripristino esegue il look e si comporta come qualsiasi altro commit, semplicemente accade per annullare le modifiche introdotte da un commit precedente.


Annullamento di un commit con un annullamento del commit

Questo è il modo ideale per annullare le modifiche che sono già state commesse in un repository pubblico.

che modifica

Oltre a annullare completamente i commit, puoi anche emendare il commit più recente eseguendo le modifiche come al solito, quindi eseguendo:

 git commit --amend

Questo sostituisce il commit precedente invece di crearne uno nuovo, che è molto utile se hai dimenticato di aggiungere un file o due. Per comodità, l'editor di commit è seminato con il messaggio del vecchio commit. Di nuovo, devi stai attento quando si utilizza il --emendare bandiera, dal momento che riscrive la storia molto simile git reset.


Modifica del commit più recente

Questa lezione rappresenta un capitolo da Git in modo succinto, un eBook gratuito dal team di Syncfusion.