Як отримати зміни на філії в Git


264

Який найкращий спосіб отримати журнал комітетів на гілці з моменту її розгалуження від поточної гілки? Моє рішення поки що:

git log $(git merge-base HEAD branch)..branch

Документація на git-diff вказує, що git diff A...Bце еквівалентно git diff $(git-merge-base A B) B. З іншого боку, документація на git-rev-розбір вказує на те, що r1...r2визначено як r1 r2 --not $(git merge-base --all r1 r2).

Чому вони різні? Зауважте, що git diff HEAD...branchдає мені різницю, яку я хочу, але відповідна команда журналу git дає мені більше, ніж те, що я хочу.

Припустимо, що на фотографіях:

         x --- y --- z --- гілка
        /
--- a --- b --- c --- d --- e --- ГЛАВА

Я хотів би отримати журнал, що містить символи x, y, z.

  • git diff HEAD...branch дає ці зобов’язання
  • однак git log HEAD...branchдає x, y, z, c, d, e.

Ви неправильно використовуєте "git log" для своїх цілей, ніж я бачу. Свою відповідь я додав нижче.
PlagueHammer

Відповіді:


186

У контексті списку ревізій, A...Bяк git-rev-parseце визначається. git-log приймає список ревізій. git-diffне приймає список редакцій - воно займає одну або дві редакції, і визначив A...Bсинтаксис, щоб означати, як це визначено на сторінці сторінки git-diff. Якби git-diffне було чітко визначено A...B, то цей синтаксис був би недійсним. Зауважте, що сторінка git-rev-parseописується A...Bв розділі "Вказівки діапазонів", і все в цьому розділі є дійсним лише в тих випадках, коли діапазон редагувань дійсний (тобто коли потрібен список ревізій).

Щоб отримати журнал, що містить лише x, y і z, спробуйте git log HEAD..branch(дві крапки, а не три). Це ідентично git log branch --not HEAD, і означає, що всі комісії у галузі, які не є HEAD.


31
Ого, це заплутано. Виявляється, що за допомогою "git diff HEAD..branch" відображаються всі коміти (x, y, z, c, d, e), але "git log HEAD..branch" робить саме те, що я хочу, і показує лише x, y , z! Це якраз протилежність використанню "...".
Грег Хьюгілл

22
git diff HEAD..branchтотожна git diff HEAD branch. Головне, що слід пам’ятати тут, - це те, що журнал займає список / діапазон змін, в той час як diff не відповідає. Тому вони по-різному ставляться до своїх арг.
Лілі Баллард

4
Здається, що git diff HEAD...branch(три крапки) відповідає результатуgit log HEAD..branch
jchook

72
git cherry branch [newbranch]

робить саме те, що ви просите, коли ви знаходитесь у masterвідділенні.

Мені також дуже подобається:

git diff --name-status branch [newbranch]

Що не зовсім те, про що ви запитуєте, але все ще дуже корисне в тому ж контексті.


8
'git cherry' виводить список ідентифікаторів комітів. Чи можу я перетворити їх в єдиний розріз, що поєднує всі зміни в кожному комітеті?
Джонатан Хартлі

1
git cherryдійсно дуже корисно. Дякую :)
jkp

2
@JonathanHartley Візьміть перше і останнє подібне до ідентифікаторів фіксації та киньте їх на gif-diff: git diff x..zабо для мого власного прикладу це так git diff 13bc4d..8eda3a.
буксі

3
Важко зрозуміти, який код потрібно замінити у вашій команді, як у якій галузі чи newbranch є ключове слово, а який слід замінити на власну назву гілки
pal4life

37

Що ви хочете побачити - це список вихідних комітетів. Це можна зробити за допомогою

git log master..branchName 

або

git log master..branchName --oneline

Де я припускаю, що "branchName" був створений як гілка відстеження "master".

Аналогічно, для перегляду вхідних змін ви можете використовувати:

git log branchName..master

1
@ABB, якщо галузьNname опущена, вона за замовчуванням має значення "head", що фактично є гілковимName у наведеному вище прикладі.
PlagueHammer

25

Це схоже на відповідь, яку я опублікував: Попередній перегляд Git push

Залиште ці функції у свій профіль Bash:

  • gbout - гіт git вихідний
  • gbin - вхідна гілка git

Ви можете використовувати це так:

  • Якщо на master: gbin branch1 <- це покаже вам, що знаходиться в branch1, а не в master
  • Якщо на master: gbout branch1 <- це покаже вам, що є у master, що не в гілці 1

Це буде працювати з будь-якою галуззю.

function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}

function gbin {
    echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
    git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

function gbout {
    echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
    git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}

16

Подібний до кількох відповідей, як Алекс V та NDavis, але жодна з них не зовсім однакова.

Коли вже в галузі, про яку йдеться

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

git diff master...

Що поєднує в собі кілька особливостей:

  • це дуже коротко
  • показує фактичні зміни

Оновлення:

Мабуть git diff master, це має бути , але це також показує різницю, а не зобов'язання, як зазначено в питанні.


1
Якщо ви git co master; git pullстворили галузь, git diff masterви не отримаєте великої користі, щоб отримати відмінності ТОЛЬКО за допомогою комісій у зазначеній гілці.
похід

1
Або чітко вказати гілки: git diff <branch1>...<branch2>покаже зміни, внесені користувачем branch2.
Олексій

10

Закиньте туди -p, щоб побачити деякі ФАЙЛОВІ ЗМІНИ

git log -p master..branch

Створіть кілька псевдонімів:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

Дивіться унікальні філії філії:

gbl

6

Щоб побачити журнал поточної гілки з моменту відгалуження головного:

git log master...

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

git log ...other-branch


4
git log --cherry-mark --oneline from_branch...to_branch

(3 крапки), але іноді він показує "+" замість "="


3 крапки показує перший запуск на гілці двічі, а два - ні.
TJ Biddle

2

я знайшов

git diff <branch_with_changes> <branch_to_compare_to>

корисніше, оскільки ви отримуєте не лише повідомлення про фіксацію, але й цілі відмінності. Якщо ви вже знаходитесь у гілці, яку хочете побачити зміни та (наприклад) хочете побачити, що змінилося в майстрі, ви можете використовувати:

git diff HEAD master
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.