Come schiacciare git si impegna

Come schiacciare git si impegna

Come schiacciare si impegna in git per mantenere pulita la tua storia

Quando lavori con GIT, è una buona idea impegnarsi spesso, quindi puoi sempre tornare allo stato del codice se incasini. Tuttavia, commettere tutti quei mini-cambiamenti nel ramo principale non è sempre una buona idea. Rende la storia disordinata e difficile da seguire.

Git fornisce un modo per schiacciare un sacco di commit usando il comando Rebase. Una volta che hai apportato le modifiche a un determinato file o per una caratteristica particolare, è sempre possibile utilizzare il metodo della zucca per combinare le modifiche prima di impegnarti nel ramo principale. Questo aiuterà ad altro capire meglio i tuoi cambiamenti.

ATTENZIONE: anche se puoi estrarre da repository esterni e lo squash si impegna insieme, è una cattiva idea. Può creare conflitti e confusione. Evita di cambiare la storia che è già pubblica. Attenersi solo agli impegni di schiacciamento che sono locali per il tuo lavoro.

Lavoriamo attraverso un caso di esempio.

Supponiamo che abbiamo due file a.py e b.Py. Prima passiamo il processo di creazione dei file e apportando le modifiche:

$ mkdir myproject
$ cd myproject/
$ git init
$ echo "print (" ciao a ")"> a.Py
$ git add -a && git commit -m "aggiunto a.Py "
$ echo "print (" ciao b ")"> b.Py
$ git add -a && git commit -m "aggiunto b.Py "
$ echo "print (" ciao bb ")"> b.Py
$ git add -a && git commit -m "b.Py Modifica 1 "
$ echo "print (" ciao bbb ")"> b.Py
$ git add -a && git commit -m "b.Py Modifica 2 "

Se controlliamo la storia degli commit, vedremo quanto segue:

$ git log --oneline --graph -decorato
* dfc0295 (testa -> master) b.Py Modifica 2
* CE9E582 b.Py Modifica 1
* 7a62538 aggiunto b.Py
* 952244a aggiunta a.Py

Dopo aver finito con il nostro lavoro, decidiamo di mettere tutte le modifiche alla B.Py in un unico commit per chiarezza. Contiamo che ci sono 3 commit su b.Py dalla testa. Emettiamo il seguente comando:

git rebase -i head ~ 3

L'opzione -I dice a Git di utilizzare la modalità interattiva.

Dovrebbe far apparire una finestra sul tuo editor di testo git:

Pick 7A62538 Aggiunto B.Py
Pick CE9E582 b.Py Modifica 1
Scegli DFC0295 b.Py Modifica 2
# Rebase 952244A… DFC0295 su 952244A (3 comandi)
#
# Comandi:
# p, pick = usa commit
# r, reword = usa commit, ma modifica il messaggio di commit
# e, modifica = usa commit, ma fermati per la modifica
# s, squash = usa commit, ma fusione nel commit precedente
# f, fixup = come "zucca", ma scartare il messaggio di registro di questo commit
# x, esec = esegui comando (il resto della riga) usando la shell
#
# Queste linee possono essere riordinate; sono eseguiti dall'alto verso il basso.
#
# Se rimuovi una linea qui che il commit andrà perso.
#
# Tuttavia, se rimuovi tutto, la rebase verrà interrotta.
#
# Nota che vengono commentati commenti vuoti
~

Gli commit sono elencati cronologicamente in cima dal più presto al più recente. Puoi scegliere quale impegnarsi per "scegliere" e quale si impegna a schiacciarsi. Per semplicità, sceglieremo il primo commit e schiacceremo il resto. Quindi modificheremo il testo in questo modo:

Pick 7A62538 Aggiunto B.Py
SQUASH CE9E582 b.Py Modifica 1
Squash DFC0295 b.Py Modifica 2
# Rebase 952244A… DFC0295 su 952244A (3 comandi)
#
# Comandi:
# p, pick = usa commit
# r, reword = usa commit, ma modifica il messaggio di commit
# e, modifica = usa commit, ma fermati per la modifica
# s, squash = usa commit, ma fusione nel commit precedente
# f, fixup = come "zucca", ma scartare il messaggio di registro di questo commit
# x, esec = esegui comando (il resto della riga) usando la shell
#
# Queste linee possono essere riordinate; sono eseguiti dall'alto verso il basso.
#
# Se rimuovi una linea qui che il commit andrà perso.
#
# Tuttavia, se rimuovi tutto, la rebase verrà interrotta.
#
# Nota che vengono commentati commenti vuoti

Non appena salvi e chiudi il file di testo, dovrebbe apparire un'altra finestra di testo che assomiglia a questo:

# Questa è una combinazione di 3 commit.
# Il messaggio del primo commit è:
Aggiunto b.Py
# Questo è il secondo messaggio di commit:
B.Py Modifica 1
# Questo è il terzo messaggio di commit:
B.Py Modifica 2
# Inserisci il messaggio di commit per le tue modifiche. Linee che iniziano
# con "#" verrà ignorato e un messaggio vuoto aborta il commit.
#
# Data: venerdì 30 marzo 21:09:43 2018 -0700
#
# Rebase in corso; su 952244a
# Attualmente stai modificando un commit mentre ribellisce la filiale "maestro" su "952244a".
#
# Modifiche da commettere:
# nuovo file: b.Py
#

Salva e chiudi anche questo file. Dovresti vedere qualcosa di simile:

$ git rebase -i head ~ 3
[Testa distaccata 0798991] Aggiunto B.Py
Data: venerdì 30 marzo 21:09:43 2018 -0700
1 file modificato, 1 inserzione (+)
Crea modalità 100644 B.Py
Rifli.

Se controlli ora la cronologia del commit:

$ git log --oneline --graph -decorato
* 0798991 (testa -> master) aggiunto b.Py
* 952244a aggiunta a.Py

Tutti gli commit per b.Py è stato schiacciato in un commit. Puoi verificare guardando la B.Py File:

$ gatto b.Py
Stampa ("Hello BBB")

Ha il contenuto di modifica 2.

Conclusione

La rebase è un comando potente. Può aiutarti a mantenere pulita la tua storia. Ma evita di usarlo per i commessi già pubblici in quanto può causare conflitti e confusione. Usalo solo per il tuo repository locale.

Ulteriori studi:

  • https: // git-scm.com/docs/git-rebase
  • https: // git-scm.com/book/en/v2/git-branching-rebasing
  • https: // git-scm.com/book/en/v2/git-tools-rewriting-history