Как я могу сгенерировать git diff того, что изменилось с момента моего последнего обращения? - PullRequest
68 голосов
/ 14 сентября 2008

Я бы хотел написать в одной команде, желательно в виде граблей, следующие действия:

  1. Получить версию моего локального репозитория git.
  2. Git тянуть последний код.
  3. Git diff из версии, которую я извлек на шаге 1, в версию, которая сейчас находится в моем локальном хранилище.

Другими словами, я хочу получить последний код из центрального репозитория и немедленно сгенерировать различия в том, что изменилось с момента последнего извлечения.

Ответы [ 4 ]

82 голосов
/ 15 сентября 2008

Вы можете сделать это довольно просто с помощью refspecs.

git pull origin
git diff @{1}..

Это даст вам разность текущей ветви, существовавшей до и после вытягивания. Обратите внимание, что если pull не обновляет текущую ветку, diff даст вам неверные результаты. Другой вариант - явно записать текущую версию:

current=`git rev-parse HEAD`
git pull origin
git diff $current..

Я лично использую псевдоним, который просто показывает мне журнал, в обратном порядке (то есть, от самого старого до самого нового), без слияний, всех коммитов со времени моего последнего извлечения. Я запускаю это каждый раз, когда мой пул обновляет ветку:

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..
12 голосов
/ 14 сентября 2008

Способ Грега должен работать (не я, другой Грег: P). Что касается вашего комментария, origin - это переменная конфигурации, которая устанавливается Git при клонировании центрального репозитория на локальный компьютер. По сути, Git-репозиторий помнит, откуда он взялся. Однако вы можете установить эти переменные вручную, если вам нужно использовать git-config.

git config remote.origin.url <url>

где url - это удаленный путь к вашему центральному хранилищу.

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

@ECHO off

:: Retrieve the changes, but don't merge them.
git fetch

:: Look at the new changes
git diff ...origin

:: Ask if you want to merge the new changes into HEAD
set /p PULL=Do you wish to pull the changes? (Y/N)
IF /I %PULL%==Y git pull
10 голосов
/ 14 сентября 2008

Это очень похоже на вопрос, который я задавал о как получить изменения в ветке в git . Обратите внимание, что поведение git diff против git log непоследовательно отличается при использовании двух точек против трех точек. Но для вашего приложения вы можете использовать:

git fetch
git diff ...origin

После этого git pull объединит изменения в вашу ГОЛОВУ.

4 голосов
/ 14 мая 2010

Если вы укажете это в своем профиле bash, вы сможете запускать grin (удаленный входящий git) и grout (удаленный исходящий git), чтобы увидеть различия в коммитах, которые являются входящими и исходящими для master-устройства origin.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
function gd2 { 
 echo branch \($1\) has these commits and \($2\) does not 
 git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
function grin {
 git fetch origin master
 gd2 FETCH_HEAD $(parse_git_branch)
}
function grout {
 git fetch origin master
 gd2 $(parse_git_branch) FETCH_HEAD
}
...