Я хотел бы записать, желательно в rake, следующие действия в одну команду:
Другими словами, я хочу получить последний код из центрального репозитория и сразу же сгенерировать различие того, что изменилось с момента последнего вытаскивания.
Это очень похоже на вопрос, который я задал о как получить изменения в ветке в git. Обратите внимание, что поведение git diff и git log непоследовательно отличается при использовании двух точек против трех. Но для своего приложения вы можете использовать:
git fetch
git diff ...origin
После этого git pull
объединит изменения в вашу HEAD.
Другой способ сделать это - использовать специальный заголовок FETCH_HEAD, который отражает результат предыдущей выборки. Итак: «git fetch && git diff ... FETCH_HEAD».
Я думаю, что это более подходящий ответ: git fetch
, за которым следует git diff origin/branchname
, - лучший способ проверить разницу перед вытягиванием.
Способ Грега должен работать (не я, другой Грег: 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
- более подходящий инструмент для этой работы.
@ColinDBennett Вы правы, git remote set-url
был бы более подходящим способом сделать это. Я использовал git config
, потому что set-url
не подходил, когда я изначально писал это.
Вы можете сделать это довольно просто с помощью 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 и вашей текущей рабочей копией. Тефлон не об этом просил.
Извините, я неправильно понял вопрос. Я искал команду, чтобы показать мои изменения с тех пор, как я в последний раз приземлился здесь. git diff HEAD
работал для того, что мне было нужно (по крайней мере, я думаю, что это было то, что я искал: D)
Может ли кто-нибудь объяснить (или сказать, где прочитать), что именно означает @{1}..
? Просто бросить это в Google не помогает.
@ user1129682: это синтаксис для доступа к рефлог. Без имени ветки это означает доступ к журналу ссылок для текущей ветки. Значение @{1}
означает самую последнюю запись рефлога, например независимо от того, на что указывала текущая ветвь, прежде чем указывать на текущую фиксацию.
+1, это правильный путь. Вам следует немного расширить нотацию @{1}..
, возможно, явно указать здесь значения по умолчанию, а затем показать компактную версию, чтобы это было менее волшебно.
Если вы поместите это в свой профиль 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?
Это функция bash, определенная в приведенном выше скрипте сразу после parse_git_branch
Я не вижу, что origin определяется как специальное ключевое слово для git-diff или git-rev-parse. Вы имели в виду, что мне нужно вставить хэш из шага №1 в качестве значения origin? Если да, то как программно извлечь это значение? Я хотел бы для удобства объединить все эти шаги в одну команду / скрипт.