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

StackOverflow https://stackoverflow.com/questions/61002

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

git pull origin
git diff @{1}..

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

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

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

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

Другие советы

У Грега способ должен сработать (не я, другой Грег: 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

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

git fetch
git diff ...origin

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

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

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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top