Comment puis-je voir ce que je suis sur le point de pousser avec git?

588

Existe-t-il un moyen de voir ce qui serait poussé si je faisais une git pushcommande?

Ce que j'imagine est quelque chose comme l'onglet "Fichiers modifiés" de la fonction "pull request" de Github. Lorsque j'émets une demande de tirage, je peux regarder et voir ce qui sera tiré s'ils acceptent ma demande de tirage:exemple github de modifications agrégées

La ligne de commande est OK, mais je préférerais une sorte de GUI (comme la capture d'écran ci-dessus).

cmcculloh
la source
Beaucoup de questions / réponses connexes; en voici une autre: stackoverflow.com/questions/2176278/preview-a-git-push/…
michael

Réponses:

665

Pour une liste des fichiers à pousser, exécutez:

git diff --stat --cached [remote/branch]

exemple:

git diff --stat --cached origin/master

Pour le code diff des fichiers à pousser, exécutez:

git diff [remote repo/branch]

Pour voir les chemins de fichiers complets des fichiers qui vont changer, exécutez:

git diff --numstat [remote repo/branch]

Si vous voulez voir ces différences dans une interface graphique, vous devrez configurer git pour cela. Voir Comment puis-je afficher la sortie 'git diff' avec un programme de diff visuel? .

Ionuț G. Stan
la source
8
Les deux variantes de git diff --cached sans commit donné n'afficheront que les différences par rapport à HEAD. Je pense que vous vouliez dire git diff [--stat] --cached origin / master, en supposant que la branche principale de l'origine est master
mfontani
52
Ce n'est pas exactement ce que tu veux. Vous devez différencier HEAD, pas l'index, contre origin ( git diff origin/master HEAD). La différence d'index donnera les mêmes résultats si et seulement si vous n'avez aucune modification mise en scène pour la validation. Si vous avez des modifications par étapes, elles seront incluses dans le diff, mais ne seront clairement pas poussées car elles n'ont pas encore été validées.
Cascabel
5
Cette réponse doit être modifiée pour inclure les informations dans le commentaire de @Jefromi git diff --stat origin/master HEADest la bonne réponse.
Tony Topper du
2
@mfontani a la bonne réponse pour moi. Je veux vérifier ce qui sera poussé de ce que j'ai déjà commis, pas ce qui sera engagé si je commets tout ce que j'ai changé. git diff --cached [remote/branch]fait l'affaire :)
poshaughnessy
2
au lieu de taper origin / master, vous pouvez utiliser @ {u} par exemple git diff @ {u} ou git diff HEAD @ {u} Notez que cela ne fonctionne que si vous avez déjà créé et lié une branche de suivi en amont. Je trouve cela utile quand j'ai beaucoup de branches et beaucoup de télécommandes pour que je n'ai pas à penser à ce qui est lié où.
Damien Sawyer
192

Il y a toujours un essai à sec:

git push --dry-run

Il fera tout sauf l'envoi effectif des données.

Si vous voulez une vue plus graphique, vous avez un tas d'options.

Tig et le script gitk fournis avec git affichent tous les deux la branche actuelle de votre copie locale et la branche de la télécommande ou de l'origine.

texte alternatif

Ainsi, tous les commits que vous effectuez après l'origine sont les commits qui seront poussés.

Ouvrez gitk à partir du shell dans la branche que vous souhaitez pousser en tapant gitk&, puis pour voir la différence entre ce qui est sur la télécommande et ce que vous êtes sur le point de pousser vers la télécommande, sélectionnez votre commit local non poussé et faites un clic droit sur la télécommande et choisissez "Diff this -> selected": texte alternatif

Brian Gianforcaro
la source
18
git push --dry-run ne me montre rien de ce que j'espère voir. gitk est plus proche, mais il ne me montre pas le total cumulé de tous les changements qui seront poussés. Donc, si je pousse 6 commits à distance, je veux voir la somme totale de ce qui sera poussé. Je me fiche de ce que chaque commit a individuellement, car un commit pourrait être complètement annulé par le suivant.
cmcculloh
1
Si vous avez besoin d'un diff de ce qui sera poussé, faites git diff --stat HEAD origin/masterou git diff HEAD origin/master. Important est le HEAD , sinon vous incluez des changements non validés dans votre diff
Daniel Alder
Y a-t-il une raison pour laquelle git ne fait pas automatiquement un essai à blanc avant d'essayer de pousser des données vers une télécommande? Si vous poussez une grande quantité de données, il télécharge toutes les données et affiche ensuite les éventuelles erreurs. Vous venez de perdre du temps et de la bande passante à télécharger des données que vous devez maintenant télécharger à nouveau. Cela semble être un comportement étrange.
zeusstl
1
Le problème git push --dry-runest qu'il nécessite toujours une autorisation d'écriture sur la télécommande. Donc, si vous avez un clone sans autorisation pour pousser en amont, mais que vous souhaitez voir quelles sont vos modifications locales non poussées, --dry-runne le fera pas.
Ed Avis
C'est une bonne solution, mais il convient de noter qu'elle nécessite une connexion à la télécommande (y compris la saisie de la clé SSH le cas échéant). Si vous voulez simplement voir la différence entre branchet origin/branch, j'irais avec la réponse d'Ionuț G. Stan, car cela ne nécessite pas réellement de connexion au référentiel distant. Cela peut être bon ou mauvais, selon vos besoins.
Sean the Bean
169

Pour lister simplement les commits en attente d'être poussés: ( c'est celui dont vous vous souviendrez )

git cherry -v

Affichez les sujets de validation à côté des SHA1.

Alex Nolasco
la source
5
Une chose intéressante est que vous pouvez spécifier une télécommande à comparer comme: git cherry -v heroku/remoteau cas où vous conservez votre code dans plus d'une télécommande.
fagiani
Quelle est la meilleure commande complémentaire qui nous permette de corréler les différences contenues dans ces commits?
Hassan Baig
Cette commande est sympa, mais j'aimerais plus de détails, comme les noms des fichiers à changer pendant le push.
LS
21

Vous voulez probablement courir git difftool origin/master.... qui devrait montrer le diff unifié de ce qui se trouve sur votre branche actuelle qui ne l'est pas encore sur la branche origine / master et l'afficher dans l'outil de différenciation graphique de votre choix. Pour être le plus à jour, lancez d' git fetchabord.

Scott Chacon
la source
2
git difftool -d origin/master, J'ai mon outil difft réglé pour fusionner donc ça marche très bien, merci!
Aquarius Power
git difftool -dc'est bien mieux, merci Aquarius Power. Le seul problème est qu'il ne détecte pas les fichiers déplacés et les affiche comme supprimés et ajoutés à la place.
EM0
8

Une façon de comparer votre version locale avant de la pousser sur le repo distant (sorte de push en dry-run):

Utiliser TortoiseGit:
Faites un clic droit sur le projet de dossier racine> TortoiseGit> Diff avec la version précédente>
pour la version 2 choisissezrefs/remotes/origin/master

user1921207
la source
8

Essayez git diff origin/master..master(en supposant que origin/masterc'est votre amont). Contrairement à git push --dry-runcela, cela fonctionne toujours même si vous n'avez pas de permission d'écriture en amont.

Ed Avis
la source
5

Utilisez git gui, là vous pouvez voir une liste de ce qui a changé dans votre commit réel. Vous pouvez également utiliser gitkune interface simple pour les reflogs. Il suffit de comparer remotes/...et masterde voir ce qui sera poussé. Il fournit une interface similaire à votre capture d'écran.

Les deux programmes sont inclus dans git.

fuz
la source
1
Je ne vois aucun endroit dans git gui qui montre tout ce qui a été commis mais pas poussé.
cmcculloh
Dans git gui, vous pouvez voir ce qui est modifié mais non engagé. Dans gik (Via, gitk --allvous obtenez une liste complète de tous les commentaires. Vous pouvez maintenant comparer l'état réel de votre branche de développement avec votre télécommande à pousser.
fuz
4

Pour voir quels fichiers sont modifiés et afficher les changements de code réels par rapport à la masterbranche que vous pouvez utiliser:

git diff --stat --patch origin master

REMARQUE : Si vous utilisez l'un des IDE Intellij, vous pouvez cliquer avec le bouton droit sur votre projet de niveau supérieur, sélectionner Git > Comparer avec la branche > et choisir l'origine souhaitée, par exemple origin/master. Dans l'arborescence de fichiers qui apparaît, vous pouvez double-cliquer sur les fichiers pour voir un diff visuel. Contrairement à l'option de ligne de commande ci-dessus, vous pouvez modifier vos versions locales à partir de la fenêtre diff.

ccpizza
la source
3

Vous pouvez lister les commits par:

git cherry -v

Et puis comparez avec la commande suivante où le nombre de ^ est égal au nombre de validations (dans l'exemple ses 2 validations):

git diff HEAD^^
DavidS
la source
Il est tout simplement bon de voir la liste des derniers commits. Cela ne donnera pas le nom du ou des fichiers. Par conséquent, comme quelqu'un a répondu en utilisant les options de test à sec et les options de correctif, c'est mieux. git diff --stat --patch origin master git push --dry-run
Sree Rama
2

Si vous utilisez Mac OS X, je vous recommanderais de vous procurer Tower, c'est un merveilleux programme qui a fait de Git un plaisir pour moi. Je dois maintenant plus me souvenir des commandes du terminal et il offre une excellente interface graphique pour afficher, suivre et résoudre les différences dans les fichiers.

Et non, je ne suis pas affilié avec eux, j'utilise simplement leur logiciel et j'aime vraiment ça.

http://www.git-tower.com/

kakubei
la source
2
J'utilise Tower, mais comment voir les fichiers qui ont été validés mais pas poussés?
Michael Irey
Cela ne répond pas à la question.
reinierpost
1

Juste pour ajouter mes deux cents ... Je voulais implémenter cela lors de l'exécution de travaux dans un pipeline gitlab sur un runner gitlab. La meilleure façon de le faire était d'utiliser ce script:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA

Dans mon cas également, je voulais filtrer les fichiers par extension, pour y parvenir j'ai utilisé:

git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA '*.py'

Après cela, vous pouvez par exemple transmettre cette liste ailleurs, un linter peut-être;)

J'espère que cela aidera quelqu'un.

Michal Mikolajczyk
la source
1
  1. Si vous avez des autorisations d'écriture sur la télécommande
git push --dry-run
  1. Si vous ne disposez pas des autorisations d'écriture sur la télécommande
git diff --stat HEAD remote/branch
vkg
la source
0

Après git commit -m "{your commit message}", vous obtiendrez un hachage de validation avant le push. Ainsi, vous pouvez voir avec quoi vous allez pousser giten exécutant la commande suivante:

git diff origin/{your_branch_name} commit hash

par exemple: git diff origin/master c0e06d2

Chandra
la source
Merci d'avoir répondu, mais je pense que cet effort n'était pas nécessaire car la question est assez ancienne et très votée. Vous feriez mieux de consacrer des efforts à différentes questions.
Pbd