git diff entre le référentiel distant cloné et original

170

J'ai cloné un référentiel github et n'ai apporté aucune modification localement. Le dépôt Github a avancé avec des commits sur la même branche.

  1. Comment trouver une différence entre mon référentiel local et le référentiel github d'origine?
  2. Comment trouver une différence entre ma copie de travail et le référentiel Github d'origine?
  3. Comment trouver une différence entre mon référentiel local et un autre référentiel github du même projet?
Oleg Proudnikov
la source
1
duplication possible de comparer la branche git locale avec la branche distante?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 六四 事件 法轮功: Je pense que c'est suffisamment différent: l'autre question porte sur n'importe quelle branche distante générique, alors que c'est en référence à GitHub, plus trois points de départ différents. Ils sont certainement similaires, donc votre lien est certainement utile.
jvriesem

Réponses:

161

1) Ajoutez les référentiels distants que vous souhaitez comparer:

git remote add foobar git://github.com/user/foobar.git

2) Mettez à jour votre copie locale d'une télécommande:

git fetch foobar

Fetch ne modifiera pas votre copie de travail.

3) Comparez n'importe quelle branche de votre référentiel local à n'importe quelle télécommande que vous avez ajoutée:

git diff master foobar/master
dbyrne
la source
Aurai-je besoin de git fetch avant diff? Je suppose qu'il n'y a aucun moyen de différer sans cela.
Oleg Proudnikov
Il s'agit en fait d'une réponse à la question 3 uniquement (diff avec un autre dépôt github).
Ruslan Kabalin
5
Rien ne distingue le "référentiel github d'origine" de tout autre référentiel distant. Ou ai-je mal compris quelque chose?
dbyrne
Quand je l'ai essayé avec git 2.7.4, le "git diff master foobar / master" n'a montré aucune différence. J'ai l'air de comparer ma copie locale ("master") avec le repo donné comme 1er argument ("master") et là seulement diffs le "path / file" "foobar / master". Mais la commande "diff foobar / master" a fonctionné pour moi, en comparant mon maître local avec foobar / master.
user2081279
Au lieu de fetch(nr. 2) comme alternative: git remote update- il mettra à jour toutes vos branches définies pour suivre celles distantes, mais ne fusionnera aucune modification dans; ougit pull
Timo
49

Une autre réponse à vos questions (en supposant que vous êtes sur master et que vous avez déjà fait "git fetch origin" pour vous informer des changements à distance):

1) Valide sur la branche distante depuis la création de la branche locale:

git diff HEAD...origin/master

2) Je suppose que par "copie de travail" vous entendez votre succursale locale avec des commits locaux qui ne sont pas encore à distance. Pour voir les différences de ce que vous avez sur votre branche locale mais qui n'existe pas sur la branche distante, exécutez:

git diff origin/master...HEAD

3) Voir la réponse de dbyrne.

Ruslan Kabalin
la source
Merci pour la HEAD..origin/mastersyntaxe! Nous avons eu des erreurs avec l'origine / HEAD qui n'existaient pas, et cela l'a résolu.
Dan Bechard
@ruslan: que signifie le fait de ne git diff HEAD...origin/masterrien renvoyer si j'ai cloné un répertoire distant dans lequel je suis autorisé à apporter des modifications?
Mona Jalal
Une erreur s'est produite lors du clonage à l'aide de l'interface graphique Windows, je me demande donc si le clone a complètement fonctionné. Je vois que les dossiers sont ici dans mon répertoire mais je veux m'assurer que c'est la même chose que remote. Cependant dans git shell, git diff ne renvoie rien. Je ne sais pas si mon clone a réussi ou non?
Mona Jalal
@MonaJalal cela signifie qu'il n'y a pas de changements en amont depuis que vous l'avez cloné.
Ruslan Kabalin le
21

Cet exemple peut aider quelqu'un:

Remarque " origin" est mon alias pour la télécommande "Ce qui est sur Github"
Remarque " mybranch" est mon alias pour ma branche "ce qui est local" que je synchronise avec github -
votre nom de branche est "master" si vous n'avez pas créé une. Cependant, j'utilise le nom différent mybranchpour montrer où le paramètre de nom de branche est utilisé.


Quels sont exactement mes dépôts distants sur github?

$ git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)

Ajoutez "l'autre dépôt github du même code" - nous appelons cela un fork:

$ git remote add someOtherRepo https://github.com/otherUser/Playground.git

$git remote -v
origin  https://github.com/flipmcf/Playground.git (fetch)
origin  https://github.com/flipmcf/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (push)
someOtherRepo https://github.com/otherUser/Playground.git (fetch)

assurez-vous que notre repo local est à jour:

$ git fetch

Changez certaines choses localement. disons fichier ./foo/bar.py

$ git status
# On branch mybranch
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   foo/bar.py

Examiner mes modifications non validées

$ git diff mybranch
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index b4fb1be..516323b 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

Engagez-vous localement.

$ git commit foo/bar.py -m"I changed stuff"
[myfork 9f31ff7] I changed stuff
1 files changed, 2 insertions(+), 1 deletions(-)

Maintenant, je suis différent de ma télécommande (sur github)

$ git status
# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 1 commit.
#
nothing to commit (working directory clean)

Différez ceci avec la télécommande - votre fourche: (ceci est souvent fait avec git diff master origin)

$ git diff mybranch origin
diff --git a/playground/foo/bar.py b/playground/foo/bar.py
index 516323b..b4fb1be 100655
--- a/playground/foo/bar.py
+++ b/playground/foo/bar.py
@@ -1,27 +1,29 @@
- This line is wrong
+ This line is fixed now - yea!
+ And I added this line too.

(git push pour les appliquer à la télécommande)

En quoi ma succursale distante diffère-t-elle de la branche principale distante?

$ git diff origin/mybranch origin/master

En quoi mes éléments locaux diffèrent-ils de la branche principale distante?

$ git diff origin/master

En quoi mon contenu diffère-t-il du fork de quelqu'un d'autre, branche principale du même dépôt?

$git diff mybranch someOtherRepo/master
FlipMcF
la source
5
Avant de faire un 'git diff', je pense qu'il est nécessaire de faire un 'git fetch' pour s'assurer que notre copie locale de la télécommande est à jour.
Don
1
J'ai lu peut-être 20 articles sur la façon de comparer à distance et local.Je viens de comprendre cela moi-même: git fetch est OBLIGATOIRE en premier. git est vraiment le code d'assemblage de RCS. Jésus. Merci d'avoir confirmé, Don!
Terence Parr
vient d'être ajouté git fetchà cette réponse.
FlipMcF
1
Hummm ... Je n'aime pas la façon dont j'ai utilisé «myfork» comme nom de ma branche. Cela pourrait dérouter quelqu'un (comme moi, qui vient de revenir pour cette réponse)
FlipMcF
Modifié - clarté et réponse à la question n ° 3 sur la `` différence de fourche ''
FlipMcF