Как лучше всего получить журнал коммитов ветки с того момента, когда она была разветвлена из текущей ветки? Мое решение:
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---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 diff HEAD..branch" показывает все коммиты (x, y, z, c, d, e), но "git log HEAD..branch" делает именно то, что я хочу, и показывает только x, y , z! Это полная противоположность использованию «...».
git diff HEAD..branch
идентичен git diff HEAD branch
. Здесь важно помнить, что log принимает список / диапазон ревизий, а diff - нет. Вот почему они по-разному относятся к своим аргументам.
Кажется, что git diff HEAD...branch
(три точки) соответствует выходу git log HEAD..branch
git cherry branch [newbranch]
делает именно то, что вы просите, когда вы находитесь в ветке master
.
Еще я очень люблю:
git diff --name-status branch [newbranch]
Это не совсем то, о чем вы спрашиваете, но все же очень полезно в том же контексте.
'git cherry' выводит список идентификаторов фиксации. Могу ли я преобразовать их в одно различие, объединяющее все изменения в каждом коммите?
@JonathanHartley Возьмите первый и последний, подобные идентификаторам фиксации, и переместите их в gif-diff
: git diff x..z
, или для моего собственного примера это git diff 13bc4d..8eda3a
.
Трудно понять, какой код необходимо заменить в вашей команде, например, какой из ветвей или новых веток является ключевым словом, а какой следует заменить на собственное имя ветки.
Это похоже на ответ, который я опубликовал: Предварительный просмотр Git push
Перетащите эти функции в свой профиль Bash:
Вы можете использовать это как:
Это будет работать с любой веткой.
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)//'
}
function gbin {
echo branch \(\) has these commits and \($(parse_git_branch)\) does not
git log .. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
function gbout {
echo branch \($(parse_git_branch)\) has these commits and \(\) does not
git log .. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
git log --cherry-mark --oneline from_branch...to_branch
(3dots), но иногда он показывает '+' вместо '='
3 точки дважды показывают первую фиксацию в ветке, а две - нет.
Вы хотите увидеть список исходящих коммитов. Вы можете сделать это, используя
git log master..branchName
или же
git log master..branchName --oneline
Я предполагаю, что «branchName» был создан как отслеживающая ветвь «master».
Точно так же, чтобы увидеть входящие изменения, вы можете использовать:
git log branchName..master
@ A-B-B, если имя ветки опущено, по умолчанию используется значение «head», которое фактически является именем ветки в приведенном выше примере.
Добавьте туда -p, чтобы увидеть ИЗМЕНЕНИЯ ФАЙЛОВ
git log -p master..branch
Сделайте несколько псевдонимов:
alias gbc = "git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \(.*\)//'"
alias gbl='git log -p master..\`gbc\`'
Посмотрите уникальные коммиты ветки:
gbl
я нашел
git diff <branch_with_changes> <branch_to_compare_to>
более полезно, так как вы получаете не только сообщения о фиксации, но и весь файл diff. Если вы уже находитесь в ветке, в которой хотите увидеть изменения и (например) хотите увидеть, что изменилось в мастере, вы можете использовать:
git diff HEAD master
Чтобы увидеть журнал текущей ветки с момента разветвления мастера:
git log master...
Если вы в настоящее время находитесь на главном сервере, чтобы увидеть журнал другой ветки, поскольку она ответвлена от мастера:
git log ...other-branch
Подобно нескольким ответам, таким как Alex V и NDavis, но ни один из них не совсем одинаковый.
Когда уже в рассматриваемой ветке
С помощью:
git diff master...
Которая сочетает в себе несколько функций:
Обновлять:
Вероятно, это должен быть git diff master
, но он также показывает разницу, а не коммиты, как указано в вопросе.
Если у вас есть git co master; git pull
с тех пор, как вы создали ветку, git diff master
будет не очень полезен для получения различий, вносимых ТОЛЬКО посредством коммитов в указанной ветке.
Или явно указать ветви: git diff <branch1>...<branch2>
покажет изменения, внесенные branch2
.
В 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.
Насколько я могу судить, вы неправильно используете "git log" для своих целей. Я добавил свой ответ ниже.