Serait-il judicieux d'exécuter git rebase
tout en préservant les horodatages de validation?
Je crois qu'une conséquence serait que la nouvelle succursale n'aura pas nécessairement de dates d'engagement chronologiquement. Est-ce théoriquement possible du tout? (par exemple en utilisant des commandes de plomberie; juste curieux ici)
Si c'est théoriquement possible, alors est-il possible en pratique avec rebase, de ne pas changer les horodatages?
Par exemple, supposons que j'ai l'arbre suivant:
master <jun 2010>
|
:
:
: oldbranch <feb 1984>
: /
oldcommit <jan 1984>
Maintenant, si je rebase oldbranch
sur master
, la date du commit change de février 1984 à juin 2010. Est-il possible de changer ce comportement afin que l'horodatage de commit ne soit pas changé? Au final j'obtiendrais ainsi:
oldbranch <feb 1984>
/
master <jun 2010>
|
:
Cela aurait-il du sens? Est-il même permis dans git d'avoir un historique où un ancien commit a un commit plus récent en tant que parent?
la source
git rebase --committer-date-is-author-date SHA
. Voir ma réponse modifiée ciRéponses:
Mise à jour juin 2014: David Fraser mentionne dans les commentaires une solution également détaillée dans " Changer les horodatages lors du rebasage de la branche git ", en utilisant l'option
--committer-date-is-author-date
(introduite initialement en janvier 2009 dans le commit 3f01ad6Voir
git am
:(Réponse originale, juin 2012)
Vous pouvez essayer, pour un rebase non interactif
(à partir de cette réponse SO )
Ceci est transmis à
git am
, qui mentionne:Pour
git rebase
, cette option est «Incompatible avec l'option --interactive».Puisque vous pouvez modifier à volonté l'horodatage de l'ancienne date de validation (avec
git filter-branch
), je suppose que vous pouvez organiser votre historique Git avec l'ordre de date de validation que vous voulez / dont vous avez besoin, même le définir dans le futur! .Comme le mentionne Olivier dans sa question, la date de l' auteur n'est jamais modifiée par un rebase;
À partir du livre Pro Git :
Pour être plus clair, dans ce cas, comme le commente Olivier:
la source
git rebase --ignore-date
ne fonctionne pas. Il change les dates des commits rebasés.--ignore-date
fait le contraire de ce que j'essayais de réaliser! À savoir, il efface l'horodatage de l'auteur et les remplace par les horodatages de commits! Donc, la bonne réponse à ma question est: ne rien faire, cargit rebase
cela ne change pas les horodatages des auteurs par défaut.--committer-date-is-author-date
option semble laisser l'horodatage de l'auteur et définir l'horodatage du committer pour qu'il soit le même que l'horodatage de l'auteur d'origine, ce que voulait Olivier ...Si vous avez déjà foiré les dates de validation (peut-être avec un rebase) et que vous souhaitez les réinitialiser à leurs dates d'auteur correspondantes, vous pouvez exécuter:
git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'
la source
WARNING: Ref 'refs/heads/master' is unchanged
. J'utilise la version 1.7.9.5 de git sur Linux (64 bits)git rebase --committer-date-is-author-date <base_branch>
cette façon, git réinitialisera la date de validation uniquement pour les commits appliqués sur <base_branch> (qui est probablement le même nom de branche que vous avez utilisé lorsque vous vous êtes trompé).Une question cruciale de Von C m'a aidé à comprendre ce qui se passe: lorsque votre rebase, l' horodatage du committer change, mais pas l' horodatage de l' auteur , qui soudainement prend tout son sens. Ma question n'était donc pas assez précise.
La réponse est que le rebase ne change en fait pas les horodatages de l'auteur (vous n'avez rien à faire pour cela), ce qui me convient parfaitement.
la source
Par défaut, git rebase définira l'horodatage du committer sur l'heure à laquelle le nouveau commit est créé, mais gardera l'horodatage de l'auteur intact. La plupart du temps, c'est le comportement souhaité, mais dans certains scénarios, nous ne souhaitons pas non plus modifier l'horodatage du validateur. Comment pouvons-nous y parvenir? Eh bien, voici le truc que je fais habituellement.
Tout d'abord, assurez-vous que chacun des commits que vous êtes sur le point de rebaser a un message de commit unique et un horodatage de l'auteur (c'est là que l'astuce doit être améliorée, actuellement elle répond à mes besoins).
Avant le rebase, enregistrez l'horodatage du committer, l'horodatage de l'auteur et le message de commit de tous les commits qui seront rebasés dans un fichier.
Ensuite, laissez le rebase réel avoir lieu.
Enfin, nous remplaçons l'horodatage du committer actuel par celui enregistré dans le fichier si le message de commit est le même en utilisant
git filter-branch
.Si quelque chose ne va pas, vérifiez simplement
git reflog
ou toutes lesrefs/original/
références.De plus, vous pouvez faire la même chose pour l'horodatage de l'auteur.
Par exemple, si l'horodatage de l'auteur de certains commits est dans le désordre, et sans réorganiser ces commits, nous voulons juste que l'horodatage de l'auteur s'affiche dans l'ordre, alors les commandes suivantes vous aideront.
la source