Как получить изменения на ветке в Git

Каков наилучший способ получить журнал коммитов на ветке с момента его ветвления от текущей ветки? Мое решение до сих пор:

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

Документация для git-diff указывает, что git diff A...B эквивалентно git diff $(git-merge-base A B) B, С другой стороны, документация для git-rev-parse указывает, что r1...r2 определяется как r1 r2 --not $(git merge-base --all r1 r2),

Почему они разные? Обратите внимание, что git diff HEAD...branch дает мне нужные мне различия, но соответствующая команда git log дает мне больше, чем я хочу.

В картинках предположим, что это:

         х --- у --- --- г ветви
        /
--- --- б --- с --- --- д е --- ГОЛОВКА

Я хотел бы получить журнал, содержащий коммиты x, y, z.

  • git diff HEAD...branch дает эти коммиты
  • тем не мение, git log HEAD...branch дает x, y, z, c, d, e.

9 ответов

Решение

В контексте списка редакций, A...B я показываю git-rev-parse определяет это. git-log принимает список ревизий. git-diff не принимает список ревизий - он принимает одну или две ревизии и определил A...B синтаксис, чтобы означать, как это определено в git-diff страница руководства. Если git-diff не определил явно A...Bтогда этот синтаксис будет недействительным. Обратите внимание, что git-rev-parse Manpage описывает A...B в разделе "Указание диапазонов", и все в этом разделе допустимо только в тех случаях, когда допустим диапазон редакций (т. е. когда требуется список редакций).

Чтобы получить журнал, содержащий только x, y и z, попробуйте git log HEAD..branch (две точки, а не три). Это идентично git log branch --not HEADи означает все коммиты на ветке, которые не находятся на HEAD.

git cherry branch [newbranch]

делает именно то, что вы просите, когда вы находитесь в master ветка.

Я также очень люблю:

git diff --name-status branch [newbranch]

Что не совсем то, что вы просите, но все же очень полезно в том же контексте.

То, что вы хотите увидеть, это список исходящих коммитов. Вы можете сделать это используя

git log master..branchName 

или же

git log master..branchName --oneline

Где я предполагаю, что "branchName" был создан как отслеживание ветви "master".

Аналогично, для просмотра входящих изменений вы можете использовать:

git log branchName..master

Подобно нескольким ответам, как Alex V's и NDavis, но ни один из них не совсем одинаков.

Когда уже в ветке идет речь

С помощью:

git diff master...

Который сочетает в себе несколько функций:

  • это супер коротко
  • показывает фактические изменения

Обновить:

Это должно быть git diff master, но также это показывает diff, а не коммиты как заданный вопрос.

Это похоже на ответ, который я опубликовал на: Предварительный просмотр Git push

Добавьте эти функции в свой профиль Bash:

  • gbout - git ветка исходящая
  • gbin - входящая ветка git

Вы можете использовать это как:

  • Если на master: gbin branch1<- это покажет вам, что находится в branch1, а не в master
  • Если на master: gbout branch1<- это покажет вам, что в master, а не в branch 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
}

Добавьте туда -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

Чтобы просмотреть журнал текущей ветки с момента ветвления от master:

git log master...

Если вы в данный момент работаете на master, чтобы увидеть журнал другой ветки, так как она разветвляется на master:

git log ...other-branch

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

(3 точки), но иногда он показывает "+" вместо "="

Я нашел

git diff <branch_with_changes> <branch_to_compare_to>

более полезным, поскольку вы получаете не только сообщения коммита, но и весь diff. Если вы уже находитесь в ветке, в которой хотите увидеть изменения и (например) хотите увидеть, что изменилось в мастере, вы можете использовать:

git diff HEAD master

В Git 2.30 (первый квартал 2021 г.)"git diff A... B (man)" изучил "git diff --merge-base A B(man), что является более длинным сокращением, чтобы сказать то же самое.

Таким образом, вы можете сделать это, используя git diff --merge-base <branch> HEAD. Это должно быть эквивалентно git diff <branch>...HEAD но без путаницы, связанной с использованием обозначения диапазона в diff.

Другие вопросы по тегам