Как я могу сгенерировать git diff того, что было изменено с момента последнего притяжения?

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

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

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

Ответ 1

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

git pull origin
git diff @{1}..

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

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

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

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..

Ответ 2

Способ Грега должен работать (не я, другой Грег: P). В отношении вашего комментария источник - это переменная конфигурации, которая устанавливается 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

Ответ 3

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

git fetch
git diff ...origin

После этого a git pull объединит изменения в ваш HEAD.

Ответ 4

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

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
}