2010-02-23 5 views
21

Dopo aver posto la mia ultima domanda which turned out to be about rebasing with GIT, ho deciso che non desidero affatto rebase. Invece voglio:Ripetizione della cronologia di commit in GIT senza punto di riferimento

  1. Branch
  2. lavoro lavoro lavoro, il check-in e spingendo in ogni momento
  3. buttare via tutti quei commit e far finta che non è mai successo (così uno pulito commettere alla fine del lavoro)

faccio questo momento copiando i file in una nuova directory e quindi copiare di nuovo per una nuova filiale (ramificata nello stesso punto come mio ramo di lavoro), e poi la fusione che in master o dovunque.

Questo è semplicemente sbagliato e perché? Più importante: c'è un modo migliore/GIT per farlo?git rebase -i mi obbliga a unire (e selezionare e schiacciare).

risposta

10

È inoltre possibile utilizzare git merge con l'opzione --squash.

+1

Lo squash si verifica automaticamente ad ogni commit, non vedo come questo aiuti con la mia domanda. Non è così, ma avrei bisogno di più informazioni. –

+2

Ho usato 'git merge --quash' quando volevo unire un ramo argomento con il master, ma anche ridurre la cronologia del commit in un solo commit. 'git merge --quash' esegue l'unione, ma forniamo un messaggio di commit prima di effettuare l'unione. Quindi il risultato finale appare come se ti fossi impegnato solo una volta sul ramo principale. –

+1

scusate mi ci sono voluti tre anni per capire che questa risposta è corretta. Ottimo lavoro! –

24

La cosa più semplice da fare è una reimpostazione a caldo.

Così checkout tuo argomento filiale:

git checkout -b topic master 

lavoro, lavoro, lavoro.

git commit 
git commit 
git commit 
git commit 

Felice con questo, si può fare un nuovo singolo commit sulla parte superiore del maestro

git reset --soft master 
git commit 

Ora unire a padroneggiare (sarà un fast-forward) il ramo argomento e riordinare. (Si noti che non è necessario eseguire questa operazione se si è pronti a ricordare o taggare dove si trovava il master e lavorare sul master senza diramazioni, si sarebbe potuto fare semplicemente git reset --soft old-master e git commit e non avresti avuto bisogno di questi ultimi passaggi di pulizia .)

git checkout master 
git merge topic 
git branch -d topic 
+4

Eccellente (+1), ma questo lascia la domanda: è questo il modo giusto (con Git o effettivamente con qualsiasi (D) VCS)? tutti i passaggi logici incrementali sono compressi e, se c'è qualche bug insidioso con il commit di topic, non sarà facile da individuare e correggere. – VonC

+2

@Charles Bailey, grazie per quello. @VonC, dipende. Controllo ogni minuto o meno ... troppe informazioni sono altrettanto brutte di altre. –

+0

Quindi, per essere chiari, git reset --soft some_branch mi passa a some_branch/some_commit senza toccare i miei file? –