Ответ 1
Используйте git show $COMMIT
. Он покажет вам сообщение журнала для фиксации и разницу в этом конкретном коммите.
Помимо написания псевдонима или script, существует ли более короткая команда для получения diff для определенного коммита?
git diff 15dc8^..15dc8
Если вы передаете только один идентификатор фиксации git diff 15dc8
, он отличает это сообщение от HEAD.
Используйте git show $COMMIT
. Он покажет вам сообщение журнала для фиксации и разницу в этом конкретном коммите.
Использование:
git diff 15dc8^!
как описано в следующем фрагменте git -rev-parse (1) manpage (или в современном git gitrevisions (7) manpage):
Два других сокращения для обозначения набора, который формируется фиксацией и ее существуют материнские коммиты. Обозначение r1 ^ @означает все родители r1. r1 ^! включает commit r1, но исключает всех его родителей.
Это означает, что вы можете использовать 15dc8^!
как сокращение для 15dc8^..15dc8
где угодно в git, где необходимы ревизии. Для команды diff git diff 15dc8^..15dc8
понимается как git diff 15dc8^ 15dc8
, что означает разницу между родителем commit (15dc8^
) и commit (15dc8
).
Примечание: описание в git-rev-parse(1)
manpage говорит о версии диапазонов, где она также должна работать и для коммандов слияния с несколькими родителями. Тогда r1^!
равно "r1 --not r1^@
", то есть "r1 ^r1^1 ^r1^2 ...
"
Кроме того, вы можете использовать git show COMMIT
, чтобы получить описание commit и diff для фиксации. Если вы хотите только diff, вы можете использовать git diff-tree -p COMMIT
Если вы знаете, как далеко назад вы можете попробовать что-то вроде:
# Current branch vs. parent
git diff HEAD^ HEAD
# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2
Предыдущие коммиты работают примерно так:
# Parent of HEAD
git show HEAD^1
# Grandparent
git show HEAD^2
Есть много способов, которыми вы можете указать фиксации:
# Great grandparent
git show HEAD~3
Подробнее см. эту страницу.
Как указывает @mipadi, вы можете использовать git show $COMMIT
, но это также показывает некоторые заголовки и сообщение фиксации. Если вам нужен прямой diff, используйте git show --pretty=format:%b $COMMIT
.
Это, очевидно, не очень короткая рука, поэтому я сохраняю этот псевдоним в своем .gitconfig
[alias]
sd = show --pretty=format:%b
Это позволяет мне использовать git sd $COMMIT
для отображения diff.
Многие из упомянутых примеров (например, git diff 15dc8^!
или git diff 15dc8^..15dc8
) не работают, если вы используете zsh и имеете параметр extendedglob
. Вы можете исправить его одним из следующих трех способов:
unsetopt extendedglob
(и/или удалить его из .zshrc)
setopt NO_NOMATCH
(и/или установите его в .zshrc)
каждый раз сбрасывать каретку и удары с помощью обратного слэша, например. git diff 15dc8\^\!
Решение Paul выше делало то, на что я надеялся.
$ git diff HEAD^1
Кроме того, полезно добавить псевдонимы, такие как упомянутые hobs, если вы поместите следующее в раздел [alias] вашего файла ~/.gitconfig, то вы можете использовать короткие руки для просмотра diff между головкой и предыдущим.
[alias]
diff-last = diff HEAD^1
Затем запуск $git diff-last приведет к вашему результату. Обратите внимание, что это также будет включать любые изменения, которые вы еще не совершили, а также разницу между фиксациями. Если вы хотите игнорировать изменения, которые вы еще не сделали, вы можете использовать diff для непосредственного сравнения HEAD с родителем:
$ git diff HEAD^1 HEAD
git diff 15dc8 15dce~1
~ 1 означает 'parent', ~ 2 'grandparent и т.д.
Использует псевдонимы, поэтому точно не отвечает на ваш вопрос, но я нахожу их полезными для выполнения того, что вы намерены...
alias gitdiff-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitlog-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"