Как получить изменения в ветке в 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 дает мне больше, чем я хочу.
В картинках предположим следующее:
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.
Ответы
Ответ 1
В контексте списка изменений A...B
определяется как git-rev-parse
. git -log отображает список изменений. git-diff
не принимает список ревизий - он принимает одну или две ревизии и определяет синтаксис A...B
для обозначения того, как он определен в man-странице git-diff
. Если git-diff
явно не определил A...B
, тогда этот синтаксис будет недействительным. Обратите внимание, что справочная страница git-rev-parse
описывает A...B
в разделе "Определяющие диапазоны", и все в этом разделе действительны только в ситуациях, когда допустимый диапазон ревизий (т.е. Когда требуется список изменений).
Чтобы получить журнал, содержащий только x, y и z, попробуйте git log HEAD..branch
(две точки, а не три). Это идентично git log branch --not HEAD
и означает, что все фиксации на ветке не находятся на HEAD.
Ответ 2
git cherry branch [newbranch]
выполняет именно то, что вы просите, когда вы находитесь в ветке master
.
Я тоже очень люблю:
git diff --name-status branch [newbranch]
Это не совсем то, что вы просите, но по-прежнему очень полезно в том же контексте.
Ответ 3
Что вы хотите увидеть, это список исходящих коммитов. Вы можете сделать это, используя
git log master..branchName
или
git log master..branchName --oneline
Где я предполагаю, что "branchName" было создано как ветвь отслеживания "master".
Аналогично, чтобы увидеть входящие изменения, вы можете использовать:
git log branchName..master
Ответ 4
Это похоже на ответ, который я опубликовал: Предварительный просмотр Git push
Отбросьте эти функции в свой профиль Bash:
- gbout - Git ветвь исходящая
- gbin - Git входящий входящий
Вы можете использовать это как:
- Если на master: gbin branch1 < - это
покажет вам, что в branch1 и
не в главном
- Если на главном: gbout
branch1 < - это покажет вам, что
в главном, что не в ветке 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
}
Ответ 5
Подобно нескольким ответам, таким как Alex V и NDavis, но ни один из них не является таким же.
Когда уже в рассматриваемой ветке
Использование:
git diff master...
Что сочетает в себе несколько функций:
- он супер короткий
- показывает фактические изменения
Update:
Это, вероятно, должно быть git diff master
, но также это показывает diff, а не коммит как заданный вопрос.
Ответ 6
Бросьте 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
Ответ 7
Чтобы просмотреть журнал текущей ветки с разветвления мастера:
git log master...
Если вы в настоящий момент находитесь на хозяине, чтобы просмотреть журнал другой ветки, поскольку она разветвлена с мастера:
git log ...other-branch
Ответ 8
git log --cherry-mark --oneline from_branch...to_branch
(3dots), но иногда он показывает '+' вместо '='
Ответ 9
Я нашел
git diff <branch_with_changes> <branch_to_compare_to>
более полезно, так как вы получаете не только сообщения фиксации, но и весь diff. Если вы уже находитесь в филиале, вы хотите увидеть, что изменения и (например) хотят увидеть, что изменилось для мастера, вы можете использовать:
git diff HEAD master