72 votes

Comment puis-je générer un diff git de ce qui a changé depuis la dernière fois que j'ai tiré?

Je voudrais script, de préférence dans rake, les actions suivantes en une seule commande:

  1. Récupère la version de mon référentiel git local.
  2. Git tire le dernier code.
  3. Git diff de la version que j'ai extraite à l'étape 1 à ce qui se trouve maintenant dans mon référentiel local.

En d'autres termes, je souhaite obtenir le dernier code du référentiel central et générer immédiatement un diff de ce qui a changé depuis la dernière fois que j'ai extrait.

83voto

Kevin Ballard Points 88866

Vous pouvez le faire très simplement avec refspecs.

git pull origin
git diff @{1}..

Qui vous donnera un diff de la branche courante, telle qu'elle existait avant et après le tirage. Notez que si le pull ne fait pas de mise à jour de la branche courante, le diff va vous donner des résultats erronés. Une autre option est explicitement enregistrement de la version actuelle:

current=`git rev-parse HEAD`
git pull origin
git diff $current..

Personnellement, j'utilise un alias qui tout simplement me montre un journal, dans l'ordre inverse (c'est à dire la plus ancienne à la plus récente), sans fusionne, de tous les changements depuis mon dernier pull. Je l'exécute à chaque fois que mon pull mises à jour de la branche:

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..

12voto

Greg Points 1756

Greg de la façon dont devrait fonctionner (pas moi, les autres Greg :P). Concernant votre commentaire, l'origine est une variable de configuration est défini par Git lorsque vous clonez le dépôt central de votre machine locale. Essentiellement, un dépôt Git se souvient d'où il vient. Toutefois, vous pouvez définir ces variables manuellement si vous avez besoin de l'aide de git-config.

git config remote.origin.url <url>

où url est le chemin d'accès à distance à votre référentiel central.

Voici un exemple de fichier de commandes qui devrait fonctionner (je n'ai pas testé).

@ECHO off

:: Retrieve the changes, but don't merge them.
git fetch

:: Look at the new changes
git diff ...origin

:: Ask if you want to merge the new changes into HEAD
set /p PULL=Do you wish to pull the changes? (Y/N)
IF /I %PULL%==Y git pull

10voto

Greg Hewgill Points 356191

Ceci est très similaire à une question que j'avais posée sur comment à obtenir des changements sur une branche git. Notez que le comportement de la commande git diff vs git log est incompatible différents lors de l'utilisation de deux points ou trois points. Mais, pour votre application, vous pouvez utiliser:

git fetch
git diff ...origin

Après, git pull de la fusion des changements dans votre TÊTE.

4voto

Clintm Points 832

Si vous déposez dans votre bash profil, vous serez en mesure d'exécuter grin (git remote entrants) et le ciment (git remote sortant) pour voir les différences de commits qui sont les entrants et les sortants de l'origine de maître.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
function gd2 { 
 echo branch \($1\) has these commits and \($2\) does not 
 git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
function grin {
 git fetch origin master
 gd2 FETCH_HEAD $(parse_git_branch)
}
function grout {
 git fetch origin master
 gd2 $(parse_git_branch) FETCH_HEAD
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X