Как изменить коммит с его родителем? - PullRequest
437 голосов
/ 12 января 2009

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

git diff 15dc8^..15dc8

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

Ответы [ 8 ]

609 голосов
/ 12 января 2009

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

419 голосов
/ 16 января 2009

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

git diff 15dc8^!

как описано в следующем фрагменте git-rev-parse (1) manpage (или в современном git gitrevisions (7) manpage):

Два других сокращения для именования набора, сформированного коммитом и его родительские коммиты существуют. Обозначение r1 ^ @ означает всех родителей r1. r1 ^! включает коммит r1, но исключает всех его родителей.

Это означает, что вы можете использовать 15dc8^! в качестве сокращения для 15dc8^..15dc8 в любом месте git, где требуются ревизии. Для команды diff git diff 15dc8^..15dc8 понимается как git diff 15dc8^ 15dc8, что означает разницу между родителем commit (15dc8^) и commit (15dc8).

Примечание : описание на git-rev-parse(1) справочной странице говорит о ревизии диапазонов , где она должна работать также для коммитов слияния, с более чем один родитель. Тогда r1^! равно "r1 --not r1^@", т.е. "r1 ^r1^1 ^r1^2 ..."


Также вы можете использовать git show COMMIT, чтобы получить описание фиксации и diff для фиксации. Если вы хотите только diff, вы можете использовать git diff-tree -p COMMIT

53 голосов
/ 12 января 2009

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

# 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

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

10 голосов
/ 14 марта 2012

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

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

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

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

5 голосов
/ 20 августа 2014

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

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

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

  3. избегайте каретки и ударяйте каждый раз обратной косой чертой, например git diff 15dc8\^\!

3 голосов
/ 26 ноября 2012
git diff 15dc8 15dce~1

~ 1 означает «родитель», ~ 2 «прародитель и т. Д.»

2 голосов
/ 06 декабря 2013

Решение Павла, приведенное выше, сделало то, на что я надеялся.

$ git diff HEAD^1

Кроме того, полезно добавить псевдонимы, такие как упомянутые hobs, если вы поместите следующее в раздел [alias] вашего файла ~ / .gitconfig, тогда вы можете использовать сокращение для просмотра различий между головой и предыдущим.

[alias]
    diff-last = diff HEAD^1

Тогда запуск $ git diff-last даст вам ваш результат. Обратите внимание, что это также включает любые изменения, которые вы еще не зафиксировали, а также разницу между фиксациями. Если вы хотите игнорировать изменения, которые вы еще не зафиксировали, то вы можете использовать diff для непосредственного сравнения HEAD с его родителем:

$ git diff HEAD^1 HEAD
0 голосов
/ 02 мая 2012

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

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"
...