Il comando rebase ha alcune fantastiche opzioni disponibili nella sua modalità --interactive
(o -i
) e una delle più utilizzate è la possibilità di schiacciare i commit. Ciò che fa è prendere impegni più piccoli e combinarli in quelli più grandi, il che potrebbe essere utile se stai concludendo il lavoro della giornata o se vuoi semplicemente impacchettare le tue modifiche in modo diverso. Vedremo come puoi farlo facilmente.
Una parola di cautela: fallo solo su commit che non sono stati inviati a un repository esterno. Se altri hanno basato il lavoro al di fuori dei commit che stai per eliminare, possono verificarsi molti conflitti. Basta non riscrivere la tua cronologia se è stata condivisa con altri.
Quindi diciamo che hai appena fatto alcuni piccoli commit e vuoi farne uno più grande. La cronologia del nostro repository attualmente è simile a questa:
Gli ultimi 4 commit sarebbero molto più felici se fossero racchiusi insieme, quindi facciamolo attraverso il rebase interattivo:
$ git rebase -i HEAD~4
pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.
# Rebase 60709da..30e0ccb onto 60709da
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Quindi, qui sono successe alcune cose. Prima di tutto, ho detto a Git che volevo rebase usando gli ultimi quattro commit da dove si trova HEAD con HEAD ~ 4. Git ora mi ha inserito in un editor con il testo sopra e una piccola spiegazione di cosa si può fare. Hai molte opzioni a tua disposizione da questa schermata, ma al momento stiamo solo per ridurre tutto in un commit. Quindi, cambiare le prime quattro righe del file in questo farà il trucco:
pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.
Fondamentalmente questo dice a Git di combinare tutti e quattro i commit nel primo commit nell'elenco. Una volta fatto e salvato, si apre un altro editor con quanto segue:
# This is a combination of 4 commits.
# The first commit's message is:
Adding license
# This is the 2nd commit message:
Moving license into its own file
# This is the 3rd commit message:
Jekyll has become self-aware.
# This is the 4th commit message:
Changed the tagline in the binary, too.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Explicit paths specified without -i nor -o; assuming --only paths...
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: README.textile
# modified: Rakefile
# modified: bin/jekyll
#
Dato che stiamo combinando così tanti commit, Git ti consente di modificare il messaggio del nuovo commit in base al resto dei commit coinvolti nel processo. Modifica il messaggio come meglio credi, quindi salva ed esci. Una volta fatto, i tuoi commit sono stati annullati con successo!
Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
4 files changed, 27 insertions(+), 30 deletions(-)
create mode 100644 LICENSE
Successfully rebased and updated refs/heads/master.
E se guardiamo di nuovo alla storia ...
Quindi, finora è stato relativamente indolore. Se ti imbatti in conflitti durante il rebase, di solito sono abbastanza facili da risolvere e Git ti guida il più possibile. Le basi di questo è risolvere il conflitto in questione, git add
il file e quindi git rebase --continue
riprendere il processo. Ovviamente, se git rebase --abort
lo desideri, tornerai al tuo stato precedente. Se per qualche motivo hai perso un commit nel rebase, puoi usare il reflog per recuperarlo.
I dettagli possono essere trovati questo link .