Vraag Hoe squits ik commits in git met een commit-datum die niet in het verleden is?


Ik heb dus een heel eenvoudig gebruik; Ik wil alle commits die nodig zijn om terug te gaan naar de meester van mijn 'hedendaagse werk'-branche plunderen.

Tot nu toe heb ik gebruikt git rebase -i hiervoor, maar het werkt niet helemaal goed; de tijdstempel op de laatste commit klopt niet.

Hier is een voorbeeld van om dit te doen:

[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

Goed, nu wil ik deze laatste vier commits in één commit samenpersen.

[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

En het resultaat:

[work2] git log
commit 3f7f1d2eb4ef23c73dce95f718152c7d5683a926
Author: Doug <doug@null.com>
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 <doug@null.com>
Date:   Tue Nov 6 21:38:53 2012 -0800

    Updated TODO

Verdomme nee! dat is niet wat ik wilde. De tijdstempel van de resulterende commit is de tijdstempel van de commit waar we in plunderden; wat ik wilde was dat de nieuwe commit-datum de huidige tijd was.

Om precies te laten zien waar ik het over heb:

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

Author: Doug <doug@null.com>
Date:   Wed Nov 7 10:11:22 2012 +0800

Ik wil dat de resulterende commit datum is door de samenvoegtijd, dat wil zeggen. nu, niet de tijd van de commit.

Voor zover ik weet, kun je alleen in een eerdere commit knallen, niet naar boven in een nieuwe commit, maar is er een manier om dit te doen?

De juiste oplossing lijkt te zijn 1) maak een nieuwe commit met het samenvoeg bericht en de juiste commit datum tijd, 2) ??? <--- een of andere manier squash vorige commits in deze.

Hoe doe ik dat?


22
2017-11-07 02:46


oorsprong


antwoorden:


Hack: Je kunt gebruiken

git commit --amend --reset-author

De git commit man-pagina zegt dat dit "ook het tijdstempel van de auteur vernieuwt". U hoeft geen wijzigingen in de commit aan te brengen (ik heb het lokaal geprobeerd) en het timestamp wordt bijgewerkt naar de huidige tijd. Absoluut een vorm van misbruik, maar het lijkt te werken.


35
2017-11-07 12:25



In plaats van git rebase -i b4465be, kopieer het recente logboek naar het klembord en voer het volgende uit:

git reset --soft b4465be
git commit

plak en wijzig de wijzigingslogboeken, bewaar en verlaat de commit-berichteditor.


3
2018-06-06 20:16



Wat dacht je ervan om niet afhankelijk te zijn van squash en gewoon een hele feature branch te differentiëren: http://dymitruk.com/blog/2012/02/05/branch-per-feature/


0
2017-11-07 03:41