Поскольку этот вопрос часто возникает, и может быть запутанным без какого-либо вопроса о том, как работает git, я подумал, что попытаюсь объяснить самый простой случай, но с достаточной глубиной, что новичкам хватит ручки на этом делать дополнительные исследования.
Если вы настроили свой репозиторий git через обычный «clone» и имеете refspecs по умолчанию, что означает, что ваш пульт называется «origin», и вы тянете/извлекаете из «master» ветки, вам иногда может потребоваться увидеть что находится в удаленном репозитории, прежде чем вытащить его.
Поскольку «git pull» выполняет автоматическое слияние (если только не существует конфликтов), может быть приятно видеть, что дальше «поступает». Если вы не знакомы с тем, как работает git и каким образом управляются refspecs, это может быть немного неинтуитивным.
Пусть кто-то вносит изменения в удаленном хранилище (для наглядности, добавив его в удаленном хранилище, совершая изменения и толкая его), и вы наберете:
$ git diff origin/master
Вы, вероятно, не увидит никаких изменений; Однако, если вы сделаете следующее:
$ git fetch; git diff ..origin/master
вы увидите разницу между тем, что было совершено на локальный репозиторий, а что в удаленном хранилище. Вы не увидите изменений, которые находятся в вашей локальной файловой системе или поставлены в вашем индексе.
Итак, почему мы это делаем? origin/master - refspec (см. страницы руководства). Короче говоря, это то, к чему мы обращаемся, чтобы сравнивать, тянуть или извлекать и нажимать.Все следующие функционально эквивалентны:
origin/master
remotes/origin/master
refs/remotes/origin/master
Чтобы начать распутывать это, просто загляните в .git структуру каталогов вашего хранилища. Типичный макет выглядит следующим образом:
.git/refs
.git/refs/heads
.git/refs/heads/master
.git/refs/remotes
.git/refs/remotes/origin
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master
.git/refs/tags
Посмотрите .git/refs/remotes/origin/HEAD; в случае по умолчанию он укажет на ветку, которую вы используете, чтобы вытащить и нажать. В моем случае, так как я нахожусь на хозяина, содержимое этого текстового файла выглядит следующим образом:
ref: refs/remotes/origin/master
Это говорит мне, что голова моего пульта дистанционного управления идентифицируется refspec «ссылки/пультов ДУ/происхождение/мастер '(в котором упоминаются упомянутые выше псевдонимы).
Это не говорит нам о многом; каково состояние удаленного репозитория? Посмотрите на состояние пульта дистанционного управления:
$ cat .git/refs/heads/master
6d0fb0adfdfa5af861931bb06d34100b349f1d63
Хорошо, это SHA1 хэш; вероятно, фиксация. Как он помещается в этот файл? Ну, всякий раз, когда вы делаете pull или fetch, этот файл обновляется с последним фиксацией с удаленного устройства, которое было вытащено или извлечено. Это объясняет, почему мы должны до git fetch
перед выполнением diff. Помните, что git fetch
просто обновляет локальную копию удаленной ветви, но не объединяет ее с вашей рабочей копией. Это абсолютно безопасно. A git fetch; git merge
эквивалентно git pull
.
Как только вы сделаете выборку, git сможет увидеть самую последнюю фиксацию в удаленном резервном хранилище с момента выборки.
Вы можете использовать различные комбинации спецификаторов мерзавца, чтобы увидеть ваши изменения, как вы хотите (следующие примеры использование локальной рабочей копии в качестве неявного первой фиксации):
$ git diff remote/origin
This shows the incoming remote additions as deletions; any additions in your local
repository are shown as additions.
$ git diff ...remote/origin
Shows incoming remote additions as additions; the triple-dot excludes changes
committed to your local repository.
$ git diff ..remote/origin
Shows incoming remote additions as additions; the double-dot includes changes
committed to your local repository as deletions (since they are not yet pushed).
Для получения информации о «..» vs "..." см. git help diff
, а также отличную документацию на git-scm revision selection: commit ranges. Вкратце, в приведенных выше примерах синтаксис с двумя точками показывает, что все фиксации достижимы с начала/мастера, но не с вашей рабочей копии. Аналогично, синтаксис с тремя точками показывает все коммиты, достижимые от фиксации (неявная рабочая копия, удаленная/начальная), но не от обоих.
Я делаю это шаг за шагом, потому что я довольно новичок в git, и это именно то, что было me confused ... Я уверен, что эксперты git могут найти недостатки с подробности ... Я просто надеюсь, что этот ответ наведет пробел для некоторых людей, которые находят все разные посты немного краткими.
Я не понимаю вопроса. Разница показывает разницу между ветвями, почему вы думаете, что они не сольются? – Abizern
@ Abizern мой плохой! Я исправил вопрос. Благодаря! :) – abhiomkar
Возможный дубликат [сравнить местную ветку git с удаленной веткой?] (Http://stackoverflow.com/questions/1800783/compare-local-git-branch-with-remote-branch) –