Як відрізняти комісію зі своїм батьком?


460

Крім написання псевдоніму або сценарію, чи існує коротша команда для отримання розрізнення для певного комітету?

git diff 15dc8^..15dc8

Якщо ви надаєте лише одиночний ідентифікатор фіксації git diff 15dc8, він відрізняється тим, що він виконує проти HEAD.


Найзручніше з цього приводу було б те, що це буде працювати з "git difftool", використовуючи інструменти для показу різниці.
orip

Для довідки, відповідь на це інше питання ілюструє, як ви могли налаштувати псевдонім на базі, щоб спростити вищезазначене: stackoverflow.com/questions/3321492/…
Nick,

Відповіді:


641

Використовуйте git show $COMMIT. Він покаже вам повідомлення журналу для фіксації та відмінність конкретної комісії.


45
Шкода, що він не може використовувати difftool :(
orip

1
@orip Ви завжди можете встановити GIT_EXTERNAL_DIFF на сценарій, який виконує те саме, що і ваш difftool.
коляска

7
Я віддаю перевагу відповідь JakubNarebski, оскільки Комміт вираження , наведене там буде працювати в багатьох контекстах: stackoverflow.com/a/449128/992887
RichVel

1
Якщо не показано відмінності, ймовірно, немає фактичних змін, як, наприклад, для комісії злиття
Devin G Rhode

6
@PTWithy: Питання було: "Чи існує коротша команда для отримання розрізнення для певного комітету?", На яке відповідає це запитання.
mipadi

439

Використання:

git diff 15dc8^!

як описано у наступному фрагменті manit-сторінки git-rev-parse (1) (або в сучасних git- gitrevision (7) manpage):

Існують ще два скорочення для іменування набору, який формується комітом, та його батьківських комітетів. Позначення r1 ^ @ означає всіх батьків r1. r1 ^! Включає фіксувати r1, але виключає всіх його батьків.

Це означає, що ви можете використовувати 15dc8^!як скорочення для 15dc8^..15dc8будь-якого місця в git, де потрібні зміни. Для отримання відмінностей команди git diff 15dc8^..15dc8розуміється git diff 15dc8^ 15dc8, що означає різницю між батьком фіксації ( 15dc8^) і фіксації ( 15dc8).

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


Крім того, ви можете використовувати, git show COMMITщоб отримати опис комісії та відрізнятись від комітів. Якщо ви хочете лише відрізнятись, можете використовуватиgit diff-tree -p COMMIT


7
Це має бути прийнятою відповіддю, це набагато охайніше. Однак останнє речення витягу git-rev-синтаксису досить заплутане - здається, воно означає "діапазон від батька цього комітету до цього".
RichVel

1
@RichVel: це дещо заплутано, тому що він намагається описати також ситуацію, коли у комітеті є більше одного з батьків (це злиття). r1 ^! працює, як і очікувалося, тоді.
Якуб Нарбський

@ JakubNarębski: Добре, що, можливо, ви можете відредагувати свою відповідь, щоб узагальнити своє розуміння випадків неповнолітніх та багатодітних - окремі твердження щодо кожного можуть бути легшими для розуміння.
RichVel

1
@ JakubNarębski: так, набагато краще! Зараз я весь цей час використовую цей ярлик - дякую.
RichVel

1
^!Батьківські скорочене позначення працює належним чином з difftool для нормальних фіксацій , але різниця сторнується для злиття фіксацій. Чому так?
hIpPy

56

Якщо ви знаєте, як далеко назад, ви можете спробувати щось на кшталт:

# 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

Детальну інформацію див. На цій сторінці .


2
ГОЛОВА ^ 2 - це не бабуся і дідусь, якщо ГЛАВА ^ 1 - тато, то ГЛАВА ^ 2 - мама. Використовуйте HEAD ~ 2 для тата тата.
Бінаріан

11

Як зазначає @mipadi, ви можете використовувати git show $COMMIT, але це також показує деякі заголовки та повідомлення про фіксацію. Якщо ви хочете пряму різницю, використовуйте git show --pretty=format:%b $COMMIT.

Це, очевидно, не дуже коротка рука, тому я зберігаю цей псевдонім у своїй .gitconfig

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

Це дозволяє мені використовувати, git sd $COMMITщоб показати різницю .


1
Цей псевдонім може містити --color, який полегшує читання: sd = show --color --pretty = формат:% b
RichVel

@RichVel Дійсно! Дуже хороший момент. Якщо у вас є кольори, включені за замовчуванням у git, вам не потрібен цей комутатор. Це я зазвичай роблю.
Øystein Steimler

5

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

  1. unsetopt extendedglob (та / або видаліть її з .zshrc)

  2. setopt NO_NOMATCH (та / або встановити його у .zshrc)

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



2

Розділ Павла вище робив те, що я сподівався.

$ git diff HEAD^1

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

[alias]
    diff-last = diff HEAD^1

Тоді запуск $ git diff-last отримає ваш результат. Зауважте, що це також включає будь-які зміни, які ви ще не зробили, а також різницю між комісіями. Якщо ви хочете ігнорувати зміни, які ви ще не здійснили, то ви можете використовувати diff для порівняння HEAD з його батьком безпосередньо:

$ git diff HEAD^1 HEAD

0

Використовує псевдоніми, тому не відповідає точно на ваше запитання, але я вважаю ці корисними для того, щоб робити те, що ви маєте намір ...

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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.