Как получить изменения в ветке в Git
Вопрос
Каков наилучший способ получить журнал коммитов в ветке с момента ее разветвления от текущей ветки?Мое решение на данный момент таково:
git log $(git merge-base HEAD branch)..branch
Документация для git-разница указывает на то , что 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 log дает мне больше, чем я хочу.
На картинках предположим, что это:
x---y---z---branch / ---a---b---c---d---e---HEAD
Я хотел бы получить журнал, содержащий коммиты x, y, z .
git diff HEAD...branch
выдает эти коммиты- однако,
git log HEAD...branch
дает x, y, z, c, d, e.
Решение
В контексте списка изменений, 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.
Другие советы
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
Это похоже на ответ, который я опубликовал на: Предварительный просмотр Git push
Перенесите эти функции в свой профиль Bash:
- gbout - исходящая ветвь git
- входящая ветка gbin - git
Вы можете использовать это как:
- Если на главном:ветвь gbin1 <-- это покажет вам, что находится в branch1 и чего нет в master
- Если на главном:gbout ветвь1 <-- это покажет вам, что есть в 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
}
Похоже на несколько ответов, таких как Alex V и NDavis, но ни один из них не совсем одинаковый.
Когда вы уже находитесь в рассматриваемой отрасли
Используя:
git diff master...
Который сочетает в себе несколько особенностей:
- это очень коротко
- показывает фактические изменения
Обновить:
Вероятно, это должно быть git diff master
, но также это показывает разницу, а не коммиты, как указано в вопросе.
Добавьте туда a -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
(3dots) но иногда он показывает "+" вместо "="
Я нашел
git diff <branch_with_changes> <branch_to_compare_to>
более полезно, поскольку вы получаете не только сообщения о фиксации, но и весь diff в целом.Если вы уже находитесь в ветке, в которой хотите увидеть изменения, и (например) хотите посмотреть, что изменилось в главном, вы можете использовать:
git diff HEAD master