git diff между клонированным и оригинальным удаленным репозиторием

170

Я клонировал репозиторий github и не вносил никаких изменений локально. Репозиторий Github переместился вперед с коммитами в той же ветке.

  1. Как мне найти разницу между моим локальным хранилищем и исходным хранилищем github?
  2. Как найти разницу между моей рабочей копией и исходным хранилищем github?
  3. Как мне найти разницу между моим локальным репозиторием и другим github-репозиторием того же проекта?
Олег Прудников
источник
1
возможный дубликат сравнения локальной ветки git с удаленной веткой?
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli I 改造 中 different 六四 事件 法轮功: Я думаю, что это достаточно отличается: другой вопрос касается любой общей удаленной ветви, в то время как это касается GitHub, плюс спрашивает о трех разных отправных точках. Они определенно похожи, поэтому ваша ссылка, безусловно, полезна.
jvriesem

Ответы:

161

1) Добавьте любые удаленные репозитории, которые вы хотите сравнить:

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

2) Обновите локальную копию пульта:

git fetch foobar

Fetch не изменит вашу рабочую копию.

3) Сравните любую ветку из вашего локального репозитория с любым удаленным, который вы добавили:

git diff master foobar/master
dbyrne
источник
Нужно ли мне делать git fetch перед diff? Я полагаю, что без этого невозможно разобраться.
Олег Прудников
На самом деле это ответ только на вопрос 3 (отличается от другого репозитория github).
Руслан Кабалин
5
Ничто не отличает «оригинальный репозиторий github» от любого другого удаленного репозитория. Или я что-то недопонимаю?
dbyrne
Когда я попробовал это с git 2.7.4, «git diff master foobar / master» не показывал различий. Я смотрю на меня так, будто он сравнивает мою локальную копию ("master") с репозиторием, указанным в качестве 1-го аргумента ("master"), и там только различает "path / file" "foobar / master". Но команда «diff foobar / master» сработала для меня, сравнив мой локальный мастер с foobar / master.
user2081279 14.12.16
Вместо fetch(номер 2) в качестве альтернативы: git remote update- он обновит все ваши ветви, установленные для отслеживания удаленных, но не объединит какие-либо изменения в; илиgit pull
Тимо
49

Еще один ответ на ваши вопросы (при условии, что вы работаете с мастером и уже сделали «git fetch origin», чтобы вы знали о удаленных изменениях в репозитории):

1) Фиксирует в удаленном филиале с момента создания локального филиала:

git diff HEAD...origin/master

2) Я предполагаю, что под «рабочей копией» вы подразумеваете вашу локальную ветку с некоторыми локальными коммитами, которые еще не находятся на удаленном компьютере. Чтобы увидеть различия между тем, что у вас есть в вашей локальной ветке, но не существует при запуске удаленной ветви:

git diff origin/master...HEAD

3) Смотрите ответ по dbyrne.

Руслан Кабалин
источник
Спасибо за HEAD..origin/masterсинтаксис! Мы получаем ошибки с несуществующим origin / HEAD, и это решило это.
Дэн Бешард
@ruslan: что это значит, когда git diff HEAD...origin/masterничего не возвращается, если я клонировал удаленный каталог, в который я уполномочен вносить изменения?
Мона Джалал
Произошла ошибка, когда я клонировал с помощью Windows GUI, поэтому мне интересно, прошел ли клон полностью. Я вижу, что папки находятся в моем каталоге, но я хочу убедиться, что они такие же, как удаленные. Однако в git shell git diff ничего не возвращает. Я запутался, был ли мой клон успешным или нет?
Мона Джалал
@MonaJalal это означает, что нет никаких изменений вверх по течению, так как вы клонировали его.
Руслан Кабалин
21

Этот пример может помочь кому-то:

Примечание « origin» мой псевдоним для удаленного «Что на Github»
Примечание « mybranch» мой псевдоним для моей отрасли « что является локальным» , что я синхронизируется с GitHub
--Новости имя филиала является «мастером» , если вы не создали один. Однако я использую другое имя, mybranchчтобы показать, где используется параметр имени ветви.


Каковы мои удаленные репозитории на github?

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

Добавьте «другое хранилище github с тем же кодом» - мы называем это форком:

$ 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)

убедитесь, что наше локальное репо обновлено:

$ git fetch

Изменить некоторые вещи локально. скажем файл ./foo/bar.py

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

Просмотрите мои незафиксированные изменения

$ 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.

Совершать локально.

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

Теперь я отличаюсь от своего пульта (на github)

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

Diff это с дистанционным - ваша вилка: (это часто делается с 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, чтобы применить их к удаленному)

Чем моя удаленная ветка отличается от удаленной главной ветки?

$ git diff origin/mybranch origin/master

Чем мой локальный материал отличается от удаленной главной ветки?

$ git diff origin/master

Чем мои вещи отличаются от чужих форков, мастер веток того же репо?

$git diff mybranch someOtherRepo/master
FlipMcF
источник
5
Перед тем, как мы сделаем «git diff», я думаю, что необходимо сделать «git fetch», чтобы убедиться, что наша локальная копия удаленного компьютера обновлена.
Дон
1
Я прочитал, может быть, 20 постов о том, как сравнивать удаленные и локальные системы. Я только что понял это сам: сначала необходим git fetch. Git действительно ассемблерный код RCS. Иисус. Спасибо за подтверждение, Дон!
Теренс Парр
только что добавил git fetchк этому ответу.
FlipMcF
1
Хммм ... Мне не нравится, как я использовал "myfork" в качестве названия моей ветви. Это может кого-то запутать (как и я, который только что вернулся за этим ответом)
FlipMcF
Отредактировано - ясность и ответ на вопрос № 3 о «разнице в вилке»
FlipMcF