Как получить изменения на ветке в 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.