Как отличить фиксацию с родителем?

Помимо написания псевдонима или script, существует ли более короткая команда для получения diff для определенного коммита?

git diff 15dc8^..15dc8

Если вы передаете только один идентификатор фиксации git diff 15dc8, он отличает это сообщение от HEAD.

Ответ 1

Используйте git show $COMMIT. Он покажет вам сообщение журнала для фиксации и разницу в этом конкретном коммите.

Ответ 2

Использование:

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

Ответ 3

Если вы знаете, как далеко назад вы можете попробовать что-то вроде:

# 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

Подробнее см. эту страницу.

Ответ 4

Как указывает @mipadi, вы можете использовать git show $COMMIT, но это также показывает некоторые заголовки и сообщение фиксации. Если вам нужен прямой diff, используйте git show --pretty=format:%b $COMMIT.

Это, очевидно, не очень короткая рука, поэтому я сохраняю этот псевдоним в своем .gitconfig

    [alias]
      sd = show --pretty=format:%b

Это позволяет мне использовать git sd $COMMIT для отображения diff.

Ответ 5

Многие из упомянутых примеров (например, git diff 15dc8^! или git diff 15dc8^..15dc8) не работают, если вы используете zsh и имеете параметр extendedglob. Вы можете исправить его одним из следующих трех способов:

  • unsetopt extendedglob (и/или удалить его из .zshrc)

  • setopt NO_NOMATCH (и/или установите его в .zshrc)

  • каждый раз сбрасывать каретку и удары с помощью обратного слэша, например. git diff 15dc8\^\!

Ответ 6

Решение 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

Ответ 7

git diff 15dc8 15dce~1

~ 1 означает 'parent', ~ 2 'grandparent и т.д.

Ответ 8

Использует псевдонимы, поэтому точно не отвечает на ваш вопрос, но я нахожу их полезными для выполнения того, что вы намерены...

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"