Подтвердить что ты не робот

Как squash фиксируется в git с датой фиксации, которая не была в прошлом?

Итак, у меня очень простой случай использования; Я хочу раздавить все коммиты, которые должны вернуться в мастер из моей ветки "todays working".

До сих пор я использовал git rebase -i для этого, но это не работает совершенно правильно; временная метка конечной фиксации неверна.

Вот пример этого:

[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

Справа, теперь я хочу сквоить эти последние четыре коммита в одну фиксацию.

[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

И результат:

[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

Черт возьми! Это не то, что я хотел. Временная метка результирующей фиксации - это метка времени, в которое мы вложили; я хотел, чтобы новая дата фиксации была текущим временем.

Просто, чтобы точно показать, о чем я говорю:

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

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

Я хочу, чтобы результирующая фиксация была датирована временем слияния, т.е. теперь, а не время фиксации.

Насколько я знаю, вы можете только сквоивать предыдущую фиксацию, а не вверх в новую фиксацию, но есть ли способ сделать это?

Правильное решение похоже на 1) создать новый коммит с сообщением о слиянии и правильное время передачи даты, 2)??? < --- как-то squash предыдущий коммиты в этот.

Как это сделать?

4b9b3361

Ответ 1

Взлом: вы можете использовать

git commit --amend --reset-author

Страница git commit man говорит, что это "также обновляет временную метку автора". Вам не нужно вносить какие-либо изменения в commit (я попробовал его локально), и он обновит метку времени до текущего времени. Определенно, это злоупотребление, но, похоже, оно работает.

Ответ 3

Вместо git rebase -i b4465be скопируйте недавний журнал в буфер обмена и выполните:

git reset --soft b4465be
git commit

вставьте и отредактируйте журналы изменений, сохраните и выйдите из редактора сообщений фиксации.