2008-09-14 2 views
61

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

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

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

ответ

70

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

git pull origin 
git diff @{1}.. 

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

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

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

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

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

git fetch 
git diff ...origin 

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

+0

Я не вижу, что происхождение определяется как специальное ключевое слово для git-diff или git-rev-parse. Вы имели в виду, что мне нужно подключить хэш из шага # 1 как значение для источника? Если да, то каким образом я могу программно извлечь это значение? Я хотел бы объединить все эти шаги в одну команду/скрипт для удобства. – 2008-09-14 13:53:53

+2

Другой способ сделать это - использовать специальную головку FETCH_HEAD, которая отражает результат предыдущей выборки. Итак: «git fetch && git diff ... FETCH_HEAD». – 2008-09-14 19:29:02

+0

Я думаю, что это более подходящий ответ: `git fetch`, за которым следует` git diff origin/branchname`, - лучший способ проверить разницу перед нажатием. – 2017-04-19 10:45:55

12

Greg's Способ должен работать (не я, другой Greg: 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 
+1

Обычно вы должны использовать `git remote set-url origin ` вместо `git config` для изменения URL-адреса для Git * remote *. Есть ли разница? Я не знаю, но кажется, что `git remote` является более подходящим инструментом для работы. – 2013-11-14 16:25:51

4

Если вы уронили это в свой профиль Баш вы будете иметь возможность запускать усмешку (мерзавец удаленный входящий) и затирки (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 
} 
Смежные вопросы