2012-11-07 14 views
21

Mam bardzo prosty przypadek użycia; Chcę zmiażdżyć wszystkie zobowiązania, które muszą wrócić do mistrza z mojej "działającej dzisiaj" gałęzi.Jak zmiażdżyć zatwierdzenia w git z datą zatwierdzenia, która nie jest w przeszłości?

Do tej pory używałem do tego git rebase -i, ale to nie działa całkiem dobrze; znacznik czasu na ostatnim zatwierdzeniu jest nieprawidłowy.

Oto przykład w ten sposób:

[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 

Prawo, teraz chcę zgnieść te cztery ostatnie rewizje w jeden commit.

[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 

A wynik:

[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 

Cholera no! To jest nie co chciałem. Sygnatura czasowa wynikowego zatwierdzenia jest znacznikiem czasu zatwierdzenia, na które zgnieciliśmy; Chciałem, żeby data nowego zatwierdzenia była obecna.

Wystarczy pokazać dokładnie to, co mówię:

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

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

chcę popełnić wynikowy będzie data w momencie łączenia, tj. teraz nie czas zatwierdzenia.

O ile mi wiadomo, można tylko spasować do poprzedniego zatwierdzenia, a nie do góry do nowego zatwierdzenia, ale czy jest jakiś sposób na zrobienie tego?

Prawidłowym rozwiązaniem jest 1) utworzenie nowego zatwierdzenia z wiadomością scalającą i prawidłowym czasem daty zatwierdzenia, 2) ??? < --- jakoś przyciąć poprzednie zatwierdzenia do tego.

Jak to zrobić?

+0

Jest to jeden z wielu powodów, dla których nie jestem fanem zgniatania. a także –

+0

. Istnieje różnica między datą zleceniodawcy a datą autora. Zależy od tego, co robisz. –

+0

Możliwy duplikat [git squash i zachowanie znacznika czasu ostatniego commit'a] (https://stackoverflow.com/questions/10020641/git-squash-and-preserve-last-commits-timestamp) –

Odpowiedz

31

Hack: Można użyć

git commit --amend --reset-author 

GIT popełnić strona mężczyzna mówi, że to „odnawia również Czas Autor” . Nie musisz wprowadzać żadnych zmian do zatwierdzenia (próbowałem go lokalnie), i to zaktualizuje znacznik czasu do bieżącego czasu. Zdecydowanie rodzaj nadużycia, ale wydaje się, że działa.

0

Zamiast git rebase -i b4465be skopiuj niedawno dziennik w schowku i zrobić:

git reset --soft b4465be 
git commit 

pasty i edytować dzienniki zmian, zapisz & wyjście z popełnienia edytorze wiadomości.