2012-11-07 29 views
21

Quindi, ho un caso d'uso molto semplice; Voglio distruggere tutti i commit che devono tornare al master dal mio ramo di "lavoro di oggi".Come faccio a schiacciare commit in git con una data di commit che non è nel passato?

Fino ad ora ho utilizzato git rebase -i per questo, ma non funziona correttamente; il timestamp sul commit finale non è corretto.

Ecco un esempio di fare questo:

[work1] git checkout master 
Switched to branch 'master' 

[work1] git rebase today 
First, rewinding head to replay your work on top of it... 
Fast-forwarded master to today. 

[work1] git log --pretty=format:"%h%x09%an%x09%ad%x09%s" 
5ad95ff Doug Wed Nov 7 10:12:42 2012 +0800 Updated TODO again 
abb891c Doug Wed Nov 7 10:12:24 2012 +0800 Added more work 
c5fd35c Doug Wed Nov 7 10:11:50 2012 +0800 Added more work 
a98facd Doug Wed Nov 7 10:11:22 2012 +0800 Add work 
b4465be Doug Tue Nov 6 21:38:53 2012 -0800 Updated TODO 
403cea9 Doug Fri Jan 2 21:38:53 2009 -0800 Added todo 

Destra, ora voglio schiacciare questi ultimi quattro impegna in uno commettere.

[work2] date 
Wed 7 Nov 2012 10:39:39 WST 

[work2] git rebase -i b4465be 

pick a98facd Add work 
squash c5fd35c Added more work 
squash abb891c Added more work 
squash 5ad95ff Updated TODO to reflect todays work 

E il risultato:

[work2] git log 
commit 3f7f1d2eb4ef23c73dce95f718152c7d5683a926 
Author: Doug <[email protected]> 
Date: Wed Nov 7 10:11:22 2012 +0800 

    Add work 
    Added more work 
    Added more work 
    Updated TODO to reflect todays work 

commit b4465bee5b278214704edcfef3f6e222b5b52964 
Author: Doug <[email protected]> 
Date: Tue Nov 6 21:38:53 2012 -0800 

    Updated TODO 

non Dannazione! Quello è non quello che volevo. Il timestamp del commit risultante è il timestamp del commit che abbiamo schiacciato; quello che volevo era che la nuova data di commit fosse l'ora corrente.

solo per mostrare esattamente quello che sto parlando:

[work2] date 
Wed 7 Nov 2012 10:39:39 WST 

Author: Doug <[email protected]> 
Date: Wed Nov 7 10:11:22 2012 +0800 

voglio la risultante impegnano a essere data per il momento in unione, vale a dire. ora, non il tempo del commit.

Per quanto ne so, è possibile schiacciare verso il basso in un commit precedente, non verso l'alto in un nuovo commit, ma c'è un modo per farlo?

La soluzione corretta sembra essere 1) creare un nuovo commit con il messaggio di unione e la data di commit corretta, 2) ??? < --- in qualche modo schiaccia i precedenti commit in questo.

Come posso fare?

+0

Questo è uno dei tanti motivi per cui non sono un fan dello schiacciamento. a –

+0

Inoltre. C'è una differenza tra la data del commit e la data dell'autore. Dipende da cosa stai facendo. –

+0

Possibile duplicato di [git squash e preservare la data/ora dell'ultimo commit] (https://stackoverflow.com/questions/10020641/git-squash-and-preserve-last-commits-timestamp) –

risposta

31

Hack: È possibile utilizzare

git commit --amend --reset-author 

Il git commit pagina man dice che questo "rinnova anche il timestamp autore" . Non è necessario apportare modifiche al commit (l'ho provato localmente) e aggiornerà il timestamp all'ora corrente. Sicuramente una specie di abuso, ma sembra funzionare.

0

Invece di git rebase -i b4465be, copiare il log recente negli appunti e fare:

git reset --soft b4465be 
git commit 

incollare e modificare i registri delle modifiche, salvare & uscire dall'editor messaggio di commit.

Problemi correlati