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

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
78
0
48 108
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

git fetch
git diff ...origin

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

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

Teflon Ted 14.09.2008 17:53

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

Greg Hewgill 14.09.2008 23:29

Я думаю, что это более подходящий ответ: git fetch, за которым следует git diff origin/branchname, - лучший способ проверить разницу перед вытягиванием.

Giulio Caccin 19.04.2017 13:45

Способ Грега должен работать (не я, другой Грег: 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 remote set-url origin <url> вместо git config для изменения URL-адреса Git удаленный. Есть разница? Не знаю, но кажется, что git remote - более подходящий инструмент для этой работы.

Colin D Bennett 14.11.2013 20:25

@ColinDBennett Вы правы, git remote set-url был бы более подходящим способом сделать это. Я использовал git config, потому что set-url не подходил, когда я изначально писал это.

Greg 15.11.2013 00:48
Ответ принят как подходящий

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

git pull origin
git diff @{1}..

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

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

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

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

@leemes: Хм? git diff HEAD покажет вам, что изменилось между HEAD и вашей текущей рабочей копией. Тефлон не об этом просил.

Lily Ballard 19.06.2012 23:25

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

leemes 20.06.2012 01:05

Может ли кто-нибудь объяснить (или сказать, где прочитать), что именно означает @{1}..? Просто бросить это в Google не помогает.

user1129682 14.12.2012 11:30

@ user1129682: это синтаксис для доступа к рефлог. Без имени ветки это означает доступ к журналу ссылок для текущей ветки. Значение @{1} означает самую последнюю запись рефлога, например независимо от того, на что указывала текущая ветвь, прежде чем указывать на текущую фиксацию.

Lily Ballard 14.12.2012 12:25

+1, это правильный путь. Вам следует немного расширить нотацию @{1}.., возможно, явно указать здесь значения по умолчанию, а затем показать компактную версию, чтобы это было менее волшебно.

slezica 07.06.2014 04:34

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

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)//'
}
function gd2 { 
 echo branch \(\) has these commits and \(\) does not 
 git log .. --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
}

Что такое gd2? Какой-то псевдоним для git diff?

arved 09.02.2012 12:46

Это функция bash, определенная в приведенном выше скрипте сразу после parse_git_branch

Clintm 13.02.2012 22:47

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