Comment comparer une branche git locale avec sa branche distante?

1053

Comment puis-je voir diffentre une branche locale et une branche distante?

mrblah
la source
5
Cette question a été posée à nouveau plus tard. Il a une belle réponse: stackoverflow.com/questions/11935633/…
rustybeanstalk
3
exemple: git diff master origin / master (où master est la branche master locale et origin / master est la branche master distante).
Dung
@klyngbaek, cette réponse en particulier ;-)
J'essayais à l'origine git diff HEAD origin/HEADce qui semble pointer vers une branche distante différente de celle que je voulais. L'utilisation du nom de branche complet fonctionne comme prévu.
Deanna

Réponses:

595

Pour mettre à jour les branches de suivi à distance, vous devez d' git fetchabord taper puis:

git diff <masterbranch_path> <remotebranch_path>

Vous pouvez git branch -alister toutes les branches (locales et distantes) puis choisir le nom de la branche dans la liste (il suffit de supprimer remotes/du nom de la branche distante.

Exemple: git diff master origin/master(où "maître" est une branche maître locale et "origine / maître" est une télécommande, à savoir l'origine et la branche maître.)

meder omuraliev
la source
23
Il peut avoir besoin d'aller chercher avant ( git fetch)
Houssem Badri
Cela montre juste un aperçu des changements dans bash, est-il possible d'ouvrir toutes les modifications dans un code IDE comme VS?
Harsh Phoujdar
@Harsh Phoujdar Ajoutez le code ci-dessous dans votre fichier .git / .gitconfig [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseAssurez-vous que votre chemin d'accès au fichier code.exe est correct.
Aman
1307
git diff <local branch> <remote>/<remote branch>

Par exemple git diff master origin/master, ougit diff featureA origin/next

Bien sûr, pour avoir ladite branche de suivi à distance, vous devez d' git fetchabord; et vous en avez besoin pour avoir des informations à jour sur les branches dans le référentiel distant.

Jakub Narębski
la source
98
pour être plus précis: git diff <branche locale> <télécommande> / <branche distante>
nalply
38
Je fais habituellement git diff <remote>/<remote branch> <local branch>pour voir ce que ma poussée fera au repo à distance.
Michał Tatarynowicz
76
Le plus court git diff originest suffisant si vous comparez avec votre branche en amont.
Ludder
12
veuillez ajouter git fetchau début, cela cause des ennuis à un débutant comme moi
Saif
1
Hé, n'est-ce pas git diff <remote>/<remote branch> <local branch>? Sinon, je reçois les ajouts et les suppressions activés sur mon ordinateur (git version 2.7.0.windows.2)
Martín Coll
183

Premier type

git branch -a

pour obtenir la liste des succursales disponibles. Sur la sortie, vous pouvez voir quelque chose comme

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Ensuite, montrez le diff

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master
YSN
la source
1
devrait - il pas ...plutôt que ..?
Eliran Malka
9
J'aurais certainement choisi cela comme réponse. En suivant vos instructions, j'ai pu voir les différences entre une branche locale et une branche distante. Merci!
Tass
1
Je fais habituellement ce git log origin/my_branch..qui prendra HEADcomme référence locale, ce qui est surtout ce que vous voulez dire.
Rudie
4
+1 pour la meilleure réponse à mon humble avis. Serait digne de +2 si vous avez mentionné "chercher" pour synchroniser l'image "distante" de la source clonée. L'étape de présentation des statistiques / couleurs est particulièrement utile.
bvj
3
Merci pour la seule réponse qui a finalement fonctionné sur les sept ou huit «réponses» qui ont abouti à un peu plus de fatal: bad revisionou fatal: ambiguous argument. Tout ce que je voulais, c'était voir le diff sur le même fichier d'une autre branche, était-ce trop demander? Oui, oui. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>fonctionne très bien sur git 1.8.3.1
Steve Bonds
144

Si vous êtes sur une branche donnée et que vous souhaitez la comparer avec une branche en amont que vous suivez, utilisez

git diff @{upstream}

si votre amont n'est pas défini (généralement le cas, merci Arijoon dans les commentaires)

git diff @{push}

Gracieuseté de cette réponse , la documentation git pour spécifier les révisions a:

<branchname>@{upstream}, par exemple master@{upstream}, @{u}
le suffixe @{upstream}d'un nom de branche (forme courte <branchname>@{u}) fait référence à la branche que la branche spécifiée par branchnameest définie pour construire au-dessus (configurée avec branch.<name>.remoteet branch.<name>.merge). Une valeur par branchnamedéfaut manquante est celle actuelle.

Andrew Grimm
la source
10
Très bonne réponse manquant juste une petite partie. Changez la ligne en git diff @ @{upstream}. L'extra @est HEAD, qui est où vous êtes maintenant, donc vous comparez HEADavec l'amont que votre branche suit. Vous pouvez utiliser à la @{push}place de l'amont pour obtenir un différentiel entre la branche vers laquelle vous êtes configuré
Arijoon
3
meilleure réponse, ne nécessite pas d'aller chercher la télécommande. a besoin de plus de votes positifs!
jcomeau_ictx
3
En coquille de poisson , je suis arrivé résultat: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. J'ai dû utiliser à la git diff @\{upstream\}place. 😥
Landon Kuhn
Vous devez d' git fetchabord, sinon cela ne fait rien, n'affiche aucune sortie; testé en supprimant un fichier dans l'origine du référentiel et exécuté cette commande localement. ..fonctionne uniquement après la récupération.
En outre, comme la réponse donnée comprend tous les changements locaux. parfois cela est souhaité, d'autres fois non.
Deanna
44

Je comprends beaucoup mieux la sortie de:

git diff <remote-tracking branch> <local branch>

cela me montre ce qui va être supprimé et ce qui va être ajouté si je pousse la branche locale. Bien sûr, c'est la même chose, juste l'inverse, mais pour moi, c'est plus lisible et je suis plus à l'aise de regarder ce qui va se passer.

manfer
la source
J'obtiens exactement le même résultat avec: git diff <branche locale> <branche de suivi à distance> ou git diff <branche de suivi à distance> <branche locale>
user2928048
32

La manière la plus simple:

git fetch
git log -p HEAD..FETCH_HEAD

Cela va d'abord récupérer les modifications de votre télécommande par défaut (origine). Cela sera créé automatiquement lorsque vous clonerez un dépôt. Vous pouvez également être explicite: git fetch origin master.

Ensuite, git log est utilisé pour comparer votre branche actuelle avec celle qui vient d'être récupérée. (L' -poption (générer un patch) est ce qui montre les différences .)

Brent Faust
la source
14

Voilà comment je le fais.

#To update your local.
git fetch --all

cela récupérera tout de la télécommande, donc lorsque vous vérifiez la différence, il comparera la différence avec la branche distante.

#to list all branches
git branch -a

la commande ci-dessus affichera toutes les branches.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Maintenant, vous pouvez vérifier la différence comme suit.

git diff origin/<branch_name>

cela permettra de comparer votre succursale locale avec la succursale distante

Sahith Vibudhi
la source
2
git fetch --all va tout récupérer de TOUTES les télécommandes. git fetch devrait être suffisant si vous utilisez la télécommande d'origine par défaut.
Christophe Keller
Étonnant qu'après 8 ans, nous obtenions une réponse complète qui explique correctement les étapes. Nous pouvons faire un --help pour obtenir les commandes. Il s'agit donc de les comprendre.
gdbj
11

Laissez votre branche de travail est le développement et souhaitez faire la différence entre la branche de développement local et la branche de développement à distance, dans ce cas, la syntaxe devrait être comme git diff remotes/origin/development..development
ou

git fetch origin git diff origin/development

Ratna Halder
la source
11

tl; dr :git diff <local branch> <remote branch>

Lorsque j'utilise git sur la coque, j'aime d'abord m'orienter en regardant autour. Voici une commande pour afficher toutes les branches

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Ici , j'ai deux branches locales ( my-branchet master) et 4 à distance ( some-branch, some-other-branch,master etmy-branch ).

De plus, l'astérisque à côté my-branchsignale le fait que je suis actuellement dans cette branche (vous le savez également en utilisant la commande git statusqui afficherait:) On branch my-branch..

Remarque: les branches distantes dans le shell git bash sont affichées en rouge tandis que les branches locales sont affichées en vert.

Si vous souhaitez simplement afficher les branches distantes :

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Pour afficher uniquement les branches locales, vous pourriez être tenté d'utiliser, git branch -lmais c'est une commande complètement différente. Pour afficher les succursales locales à utiliser git branchsans options

$ git branch
* my-branch 
  master

Pour terminer un examen des options de branche de base, il y a le --listcontraire à ce que vous pourriez attendre est de permettre le filtrage . Utilisez-le avec un motif comme celui-ci:

$ git branch --list 'my*'
* my-branch

Vous pouvez également combiner --listavec les options -aet -rassurez-vous d'adapter votre modèle en conséquence ( rappelez-vous: les branches distantes commencent par des "télécommandes" ). Exemple:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Documents: https://git-scm.com/docs/git-branch

Maintenant vous pouvez comparer deux branches parmi toutes les branches disponibles (vous pouvez également comparer deux sections locales ou deux télécommandes).

Ici, je compare le local avec le distant my-branch, ils sont synchronisés, donc je ne reçois aucune sortie:

$ git diff my-branch remotes/origin/my-branch

Remarque: vous devez donner le nom complet des branches sans guillemets.

Je peux également comparer le local my-branchà la télécommande master. Ici, j'obtiens une sortie car la télécommande my-branchn'a pas été fusionnée dans la branche principale.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]
user2314737
la source
11

Si vous voulez voir la différence que seulement les noms des fichiers modifiés puis utilisez:

git diff --name-status <remote-branch> <local-branch>, d'

autre cela montrerait les différences entre les deux branches:

git diff <remote-branch> <local-branch>

Sarvesh Kesharwani
la source
9

Voici une réponse abrégée si vous comparez votre branche actuelle à quelque chose que vous souhaitez git pull.

git fetch
git diff FETCH_HEAD

La première commande déterminera quelle branche distante correspond à votre branche actuelle. Un artefact de ce calcul dans la FETCH_HEADréférence. Ensuite, la deuxième commande utilise cette référence par rapport à celle de votre branche actuelle.

William Entriken
la source
6

Je sais qu'il y a déjà plusieurs réponses à cette question, mais j'obtenais une erreur étrange en essayant la plupart d'entre elles.

Dans mon cas, j'ai une deuxième télécommande appelée herokuqui n'est pas le originet parce qu'elle n'était pas synchronisée, j'ai eu cette erreur en essayant d'exécuter le git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

ou ceci en essayant l'autre approche git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

La solution mentionnait explicitement le nom distant git fetchavant de s'exécuter git diff, dans mon cas:

$ git fetch heroku
$ git diff master heroku/master

J'espère que cela aide les autres avec ce même problème.

fagiani
la source
4
git difftool <commit> .

Cela comparera le commit que vous souhaitez avec vos fichiers locaux. N'oubliez pas le point à la fin (pour le local).

Par exemple, pour comparer vos fichiers locaux avec certains commit:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(et vous n'avez pas besoin de git fetch, sauf si une comparaison avec de nouveaux commits est nécessaire)

Izik
la source
Je pense que c'est intéressant parce que c'est une comparaison que je peux faire avant de valider et de pousser. Malheureusement, dans Windows, vimdiff pour montrer est moche; existe-t-il un moyen d'utiliser quelque chose de mieux, comme notepad ++?
Stefano Scarpanti
3

Exemple

git diff 'master' 'testlocalBranch'

Si vous utilisez un éditeur comme webstorm, vous pouvez cliquer avec le bouton droit sur le fichier sélectionner comparer avec la branche et taper / sélectionner votre branche.

entrez la description de l'image ici

entrez la description de l'image ici

Kurkula
la source
2
Qu'est-ce que cela ajoute à la réponse acceptée de 7,5 ans avec plus de 170 votes positifs?
Mark Rotteveel
C'est pour mrblah l'utilisateur ou pour des utilisateurs similaires qui ont ajouté un commentaire pour la réponse acceptée. La syntaxe est différente d'un exemple et l'exemple aide davantage du point de vue du débutant.
Kurkula
2
Dans ce cas, cela devrait être en commentaire de cette réponse.
rachit
1

Dans VS 2019, faites simplement FETCH Ne tirez pas de code.

C'est ce que j'ai fait. Ajouté ci-dessous dans le fichier .gitconfig pour que je puisse utiliser Beyond Compare

File location: C:\Users\[username]\.gitconfig

Ajouté ci-dessous

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Ouvrez l'invite de commande et accédez au répertoire de travail. J'ai donné ci-dessous pour comparer la branche DEV locale à la branche DEV distante

git difftool dev origin/dev --dir-diff

Cela ouvrira Beyond Compare et ouvrira des répertoires contenant des fichiers différents. Si aucun changement, Beyond Compare ne démarre pas.

Ziggler
la source
0

Je me demande est - il au sujet de changement de mon maître branche ...

  1. Tout d'abord, vous devez changer de branche (si vous êtes déjà sous cette branche, vous n'avez pas besoin de le faire!)

git checkout master

  1. Vous pouvez voir quel fichier a été modifié sous votre branche principale par cette commande

statut git

  1. Liste des succursales

git branch -a


  • télécommandes maître / origine / maître
  1. Trouvez les Différences

git diff origine / master

Ali Atakan
la source
0

Installer

git config alias.udiff 'diff @{u}'

Différence HEAD avec HEAD @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Différence avec une branche distante arbitraire

Cela répond à la question dans votre rubrique ("sa télécommande"); si vous voulez faire une différence avec "une télécommande" (qui n'est pas configurée en amont de la branche), vous devez la cibler directement. Vous pouvez voir toutes les branches distantes avec les éléments suivants:

git branch -r

Vous pouvez voir toutes les télécommandes configurées avec les éléments suivants:

git remote show

Vous pouvez voir la configuration de branchement / suivi pour une seule télécommande (par exemple l'origine) comme suit:

git remote show origin

Une fois que vous avez déterminé la branche d'origine appropriée, faites simplement un diff normal :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH

DylanYoung
la source
0

C'est assez simple. Vous pouvez utiliser:git diff remote/my_topic_branch my_topic_branch

my_topic_branchest votre branche thématique.

Elisha Senoo
la source
0

Supposons que vous ayez déjà configuré votre origincomme référentiel distant. Alors,

git diff <local branch> <origin>/<remote branch name>

Tirtha
la source
0

essayer:

git diff origin HEAD

En supposant que vous souhaitez différencier vos succursales locales actuelles par HEADrapport à l'origine. Et en supposant que vous êtes sur la branche locale. :)

Sourabh Pandit
la source
-3

Si vous utilisez TortoiseGit (il fournit une interface graphique pour Git), vous pouvez cliquer avec le bouton droit sur votre dossier de dépôt Git puis cliquer Git Sync.

Vous pouvez sélectionner vos succursales à comparer si elles ne sont pas sélectionnées. Que vous pouvez afficher les différences de validation. Vous pouvez également cliquer avec le bouton droit sur un commit, puis Compare with previous revisionafficher les différences côte à côte.tortue git sync pour comparer la branche distante et la branche locale

Halil İbrahim Oymacı
la source