web-dev-qa-db-fra.com

Comment puis-je obtenir le diff entre tous les commits qui se sont produits entre deux dates avec Git?

Ou simplement tous les commits qui se sont produits entre deux dates? En SVN, vous pourriez faire quelque chose comme

svn diff -r{date}:{date}

pour le faire! Je n'arrive pas à trouver un équivalent Git à ceci.

Plus précisément, je cherche à écrire un script pour envoyer des courriels quotidiens avec tout le code envoyé ce jour-là et par qui.

109
Chris

Vous pouvez utiliser git whatchanged --since="1 day ago" -p

Il faut aussi un --until argument.

Docs

155
seth

Les suggestions précédentes ont des inconvénients. En gros, je cherchais quelque chose d’équivalent à cvs diff -D"1 day ago" -D"2010-02-29 11:11". En collectant de plus en plus d'informations, j'ai trouvé une solution.

Choses que j'ai essayées:

  • git whatchanged --since="1 day ago" -p De ici

    Mais cela donne un diff pour chaque commit, même s'il y a plusieurs commits dans un fichier. Je sais que "date" est un peu un concept vague dans git , j'ai pensé qu'il devait y avoir un moyen de le faire.

  • git diff 'master@{1 day ago}..master Donne un avertissement warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100. Et ne montre pas tous les diffs.

  • git format-patch --since=yesterday --stdout Ne donne rien pour moi.

  • revs=$(git log --pretty="format:%H" --since="1 day ago");git diff $(echo "$revs"|tail -n1) $(echo "$revs"|head -n1) fonctionne d'une certaine manière, mais semble compliqué et ne se limite pas à la branche actuelle.

Enfin:

Bizarrement, git-cvsserver ne supporte pas "cvs diff -D" (sans que cela soit documenté quelque part).

58
Weidenrinde

"date" est un peu un concept vague en git. Un commit aura une date d’auteur qui peut être quelque temps dans le passé avant qu’une personne n’ait réellement/validé le commit dans son référentiel. De plus, le commit peut être rebasé et mis à jour pour s’appuyer sur un commit apparemment plus récent.

Une validation a également une date de validation qui est mise à jour si une validation est rebasée ou modifiée de quelque manière que ce soit. Ces commits sont plus susceptibles d’être dans une sorte d’ordre chronologique, mais vous êtes toujours à la merci du committer qui a l’heure correcte réglée sur son ordinateur et même ainsi, un commit non modifié peut rester indéfiniment sur une branche de fonctionnalité d’un référentiel distant. en cours de fusion dans la branche principale d'un référentiel central.

Ce qui est probablement le plus utile pour vos besoins est la date de changement de répertoire sur le référentiel en question. Si vous avez activé les réflexions par branche (voir git config core.logAllRefUpdates) alors vous pouvez utiliser le ref@{date} _ syntaxe pour indiquer où se trouvait une branche à un moment donné.

Par exemple.

git log -p master@{2009-07-01}..master@{now}

Vous pouvez également utiliser des descriptions "floues" comme:

git log -p "master@{1 month ago}..master@{yesterday}"

Ces commandes affichent tous les commits qui sont "apparus" dans la branche donnée du référentiel, quel que soit leur âge, en fonction de leur auteur et de leur date de validation.

Notez que le reflog par branche est spécifique à un référentiel. Par conséquent, si vous exécutez la commande log sur un clone et que vous ne tirez pas pendant (par exemple) un mois, vous extrayez tous les changements du mois dernier à la fois, alors tous les changements du mois dernier apparaîtront dans un @{1 hour ago}..@{now} intervalle. Si vous êtes en mesure d'exécuter la commande de journalisation sur le répertoire "central" vers lequel les utilisateurs Poussez, il peut alors faire ce que vous voulez.

21
CB Bailey
git diff --stat @{2013-11-01}..@{2013-11-30}

ou

git diff --stat @{2.weeks.ago}..@{last.week}
14
AA.

Peut-être

$ git format-patch --committer=<who> --since=yesterday --stdout

est ce que vous voulez (avec ou sans '--stdout')?

4
Jakub Narębski

Je crois que la solution générale consiste à utiliser:

git rev-list -n1 --first-parent --until=<a date string> <a ref>

Sans --first-parent, vous pourriez obtenir une validation d'une branche fusionnée par la suite avec a ref mais n'avait pas été fusionné en date du a date string.

Voici une alternative en utilisant --children et grep au lieu de -n1:

mlm_git_ref_as_of() {
    # # Examples #
    #
    # Show all commits between two dates:
    #
    #     git log $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    #
    # Show diffs of all commits between two dates:
    #
    #     git diff $(mlm_git_ref_as_of '2012-05-21 09:00:00-0400')..$(mlm_git_ref_as_of '2012-05-21 17:00:00-0400')
    local as_of="$1"
    local ref="${2:-HEAD}"
    # Get the most recent commit (--children, grep -v ' ') that was on
    # the given branch ($ref, --first-parent) as of a given date
    # ($as_of)
    git rev-list --children --first-parent --until="$as_of" "$ref" | grep -v ' '
}

Je n'étais pas familier avec git whatchanged _ avant de lire ce Q & A, mais il donne des résultats très différents pour moi, donc je ne suis pas sûr de ce que ça fait.

3
Matt McClure

Un autre moyen simple d’obtenir un diff de tous les changements depuis une certaine date est de simplement trouver le premier commit X qui s’est produit à cette date ou après, puis d’utiliser

git diff X

Cela a l’avantage de ne pas dépendre des entrées de reflog dans un nouveau clone, contrairement au

git diff <reference>@{n}..
git log <reference>@{n}..

solutions en

3
user456814

Vous pouvez également utiliser git-format-patch pour préparer les correctifs (diffs) et les envoyer par courrier électronique.

Utilisez les options [puisque] ou [plage de révision] pour spécifier la plage de validations.

2
Nick Dandoulakis

C'est plus une réponse amusante, car il y a probablement une meilleure façon. Cela montrera tous les hashes de commit pour aujourd'hui.

git log --pretty="format:%H %ai" | grep `date +"%Y-%m-%d"` | awk {'print $1'}`

; ·)

2
gahooa

Afin de regarder les changements de fichiers de date en date sur votre branche, tilisez la formule suivante:

  1. vérifiez votre succursale.
  2. extraire et mettre à jour les modifications depuis le référentiel distant
  3. regarder les fichiers diff d'une date à l'autre

exemple:

git checkout <branch>
git pull
git diff --stat @{fromDate}..@a{toDate}

Faites attention, les dates sont au format AAAA-MM-JJ:

git diff --stat @{2019-08-20}..@a{2019-08-21}

Si vous souhaitez observer changements sur un fichier spécifique dans une plage de temps spécifique (regardez les différences dans le code), parcourez simplement le fichier actuel:

exemple:

git diff @{2019-01-01}..@{2019-01-02} ~/dev/myApp/package.json
0
avivamg

Je vais lancer comme je le fais: git log pour une date vous donne des hachages de validation pour la branche actuelle. Ensuite, j'utilise quelque chose comme git diff 8fgdfg8..565k4l5 qui me donne la différence appropriée agrégée par fichiers. J'espère que cela aide, mais pas beaucoup testé

0
rostamn739