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?
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.
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.
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/