Comment puis-je écraser les commits dans git avec une date de validation qui n'est pas dans le passé?

Donc, j'ai un cas d'utilisation très simple; je veux écraser tous les commits qui doivent retourner dans master de ma branche' todays working'.

Jusqu'à présent, j'ai utilisé git rebase -i pour cela, mais cela ne fonctionne pas tout à fait correctement; l'horodatage sur le commit final n'est pas correct.

Voici un exemple de faire ceci:

[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

Bon, maintenant je veux écraser ces quatre derniers commits en un seul 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

Et le résultat:

[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

Merde non! C'est pas qu' Je voulais. L'horodatage du commit résultant est l'horodatage du commit dans lequel nous avons écrasé; ce que je voulais, c'était que la nouvelle date de commit soit l'heure actuelle.

Juste pour montrer exactement de quoi je parle:

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

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

Je veux que le commit résultant soit date à l'Heure de la fusion, c'est-à-dire. maintenant, pas le moment du commit.

Pour autant que je sache, vous pouvez seulement écraser dans un commit précédent, pas vers le haut dans un nouveau commit, mais y a-t-il un moyen de le faire?

Le Bon la solution semble être 1) Créer un nouveau commit avec le message de fusion et l'Heure de la date de validation correcte, 2) ???

Comment puis-je faire ça?

23
demandé sur Vini.g.fer 2012-11-07 06:46:27

3 réponses

Hack: Vous pouvez utiliser

git commit --amend --reset-author

La page de manuel git commit indique que cela "renouvelle également l'horodatage de l'auteur". Vous n'avez pas à apporter de modifications à la validation (Je l'ai essayé localement), et il mettra à jour l'horodatage à l'heure actuelle. Certainement une sorte d'abus, mais cela semble fonctionner.

37
répondu Tom Panning 2012-11-07 12:25:39

Au lieu de git rebase -i b4465be, Copiez le journal récent dans le presse-papiers et faites:

git reset --soft b4465be
git commit

Collez et modifiez les journaux de modification, Enregistrez et quittez l'éditeur de messages de validation.

3
répondu Alex R 2015-06-06 20:37:00

Que diriez-vous de ne pas compter sur squash et juste diff une branche de fonctionnalité entière: http://dymitruk.com/blog/2012/02/05/branch-per-feature/

0
répondu Adam Dymitruk 2012-11-07 03:41:08