web-dev-qa-db-fra.com

Git: comparer toutes les validations locales à la version du référentiel distant

Je suis un peu nouveau pour Git et ce que j'essaie de faire semble que cela devrait être possible. Fondamentalement, j'ai travaillé sur le clone d'un dépôt et j'ai fait pas mal de commits locaux. Existe-t-il un moyen de voir le diff de la "somme" de tous mes changements et la version repo originale? Je suppose que cela serait possible car Git le fera essentiellement lorsque je ferai un Push.

Voici un exemple de ce que j'essaie de faire: dans gitk, je vais voir quelque chose comme ça:
* - [mybranch] Ajout de '42' à la fin de answers.txt (validation locale)
* - Ajout de 'Hello World' à la fin de my.txt (validation locale)
* - Ajout de 'C # /. NET' au début de my.txt (validation locale)
* - <[RemoteRepo]> (dépôt d'origine à partir duquel j'ai cloné)

Comment puis-je voir la différence de la somme de toutes mes modifications à my.txt et answers.txt par rapport à la version originale que j'ai extraite de RemoteRepo?

34
Ian Dallas

Il y a trois façons (deux autres à partir d'autres réponses données ici)

1) git diff Origin/master master
2) git diff Origin/master..master
3) git diff Origin/master...master

Le premier et le second sont identiques et montrent des changements entre les pointes du maître et du maître distant.

Le troisième montre les changements survenus sur le maître depuis la dernière poussée de la branche et je pense que c'est le plus approprié que vous recherchez

50
manojlds

La réponse la plus prête est

 git show-branch

Ce que vous pouvez faire pour plus de contrôle, c'est utiliser git log annexe git rev-list:

 git log --left-right --graph --cherry-pick \
      --oneline branchname...remote/branchname

Ceci est ma méthode préférée et se traduira par quelque chose comme

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 some tagged commit

Incluez --decorate et vous obtiendrez quelque chose de proche de gitk, git-gui et gitweb:

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c (tag_4) Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 (tag_3) some tagged commit

CONSEIL DE PRO 1: Utilisez 'git config alias.lr log --long-option1 --long-option2 'pour une utilisation pratique

CONSEIL DE PRO 2: Utilisez 'git config color.ui auto 'pour un soulagement immédiat des yeux

Si vous vouliez toutes les têtes locales ( sur toutes les branches locales ) versus tous les validations à distance ( sur les branches idem ):

git log --decorate --pretty=oneline --all --not --glob=refs/remotes --no-walk

Quittez la non-marche pour obtenir toutes les révisions individuelles. Dans ce cas, je préfère utiliser les commutateurs illustrés précédemment (--graph --left-right)

Fusionne

Si vous voulez voir clairement les fusions, incluez --boundary

Diverses requêtes avancées:

Filtrer les résultats

Git log et rev-list supporte toute une série de capacités de filtrage astucieux, voir la page de manuel

--after '2001-01-01'
--until 'last week'
--author 'martin'
-E -i  --grep='fixes #[0123456789]+'
-S 'new_debug_function'

et bien d'autres. Cela devrait vous donner beaucoup de levier pour obtenir exactement les informations que vous souhaitez avec un effort presque nul

Qu'est-ce qui se cache localement?

Ce qui réside dans les stashes, mais pas sur les télécommandes (notez qu'il n'y a aucun moyen de faire référence aux stashes sur les braches distants car les stashes résident dans les reflogs, et les reflogs (même pour les branches distantes) reflètent toujours l'histoire locale [1]):

git log $(git rev-list -g stash) --not --glob=refs/remotes 

Tous les (autres) commits inaccessibles ...

Remarques

  • sur mon flux de travail, ils constituent uniquement des commits rebasés/modifiés et des stashes supprimés uniquement
  • leur génération prendra également un certain temps en fonction de la taille de votre graphique historique
  • cela inclura les masques déposés, mais pas les masques actuels

    git log $ (git fsck --unreachable --full --lost-found | grep 'commit' | cut -d '' -f3)\--no-walk --not --glob = refs/remotes --oneline --décorer

Scripting

À des fins de script, remplacez l'utilisation de git log avec git rev-list et vous obtiendrez juste les hachages (et encore plus de robustesse script-prrof)

[1] Voir également ma ou mes réponses précédentes sur la façon de transférer les stashes entre les repos:

16
sehe

La commande la plus simple et certainement la plus facile à retenir qui fait (généralement) ce que vous voulez est la suivante:

git diff Origin

Cela montre la différence entre ce que vous avez tiré à l'origine (l'origine) et la branche actuelle sur laquelle vous travaillez, qui est par défaut master.

8
jpatokal

la différence peut être visualisée avec git diff A B, il comparera le code de A à B:

git diff Origin/master master

Origin/master est l'état de la branche maître distante lors de sa dernière extraction (ou clonage), master est l'état local du code - sauf si vous avez changé de branche lorsque vous travaillez localement.

5
knittl

pour tout git diff HEAD Origin/"nameofyourbranch"

pour un fichier spécifique git diff HEAD: "filename" Origin/"nameofbranch": "filename"

2
Wissam Youssef
git diff Origin/master..master
2
Brian Campbell