2011-02-09 5 views
38

Я хочу проверить реальный разницу между удаленной веткой и локальной ветвью. Как я могу это сделать?Как проверить реальный git diff перед слиянием с удаленной веткой?

Выполнение частичной команды частично работает, но также показывает различия в новых изменениях моего локального филиала.

git diff remote/branch 
+0

Я не понимаю вопроса. Разница показывает разницу между ветвями, почему вы думаете, что они не сольются? – Abizern

+0

@ Abizern мой плохой! Я исправил вопрос. Благодаря! :) – abhiomkar

+0

Возможный дубликат [сравнить местную ветку git с удаленной веткой?] (Http://stackoverflow.com/questions/1800783/compare-local-git-branch-with-remote-branch) –

ответ

12

Из documentation:

git diff [--options] <commit>...<commit> [--] [<path>…] 

Эта форма, чтобы просмотреть изменения на ветвь, содержащие и до второй <commit>, начиная с общей предка обоих <commit>. "git diff A ... B" эквивалентен "git diff $ (git-merge-base A B) B". Вы можете опустить любой из <commit>, который имеет эффект, аналогичный использованию HEAD.

Вы попробовали?

+0

Спасибо! Я не понимал, что для этого работают три точки. Это работает! :) – abhiomkar

7

Что вы хотите сделать это, как это было предложено Evgen Бодунов:

git diff ...remote/branch 

Это дифф изменения из удаленного/ветви и игнорировать изменения от текущего HEAD.

97

Поскольку этот вопрос часто возникает, и может быть запутанным без какого-либо вопроса о том, как работает 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 могут найти недостатки с подробности ... Я просто надеюсь, что этот ответ наведет пробел для некоторых людей, которые находят все разные посты немного краткими.

+4

Двухточечные и трехместные точки, а? Это отвратительно. Но спасибо за ваш ответ - это объясняет, почему git diff никогда не показывал много для меня. –

+4

Это должен быть принятый ответ; гораздо более дружелюбный к новичкам и объясняет важные понятия вокруг diff (man-страница - это боль, чтобы правильно понимать, если вы не привыкли ко всем условиям). – mark

+0

Я не понимаю последнюю часть. Msgstr "Показывает входящие удаленные изменения как дополнения"? Итак, являются ли входящие изменения дополнениями или удалениями, они отображаются как дополнения? Я не верю в это.Ответ [здесь] (http://stackoverflow.com/questions/7251477/git-diff-whats-the-difference-between-having-and-no-dots) также кажется совершенно другим. – Cerran

Смежные вопросы