Как получить изменения в ветке в 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---branch
        /
---a---b---c---d---e---HEAD

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

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

Насколько я могу судить, вы неправильно используете "git log" для своих целей. Я добавил свой ответ ниже.

Debajit 20.11.2012 06:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
270
1
215 344
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

В контексте списка ревизий 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! Это полная противоположность использованию «...».

Greg Hewgill 10.09.2008 11:59

git diff HEAD..branch идентичен git diff HEAD branch. Здесь важно помнить, что log принимает список / диапазон ревизий, а diff - нет. Вот почему они по-разному относятся к своим аргументам.

Lily Ballard 11.09.2008 11:52

Кажется, что git diff HEAD...branch (три точки) соответствует выходу git log HEAD..branch

jchook 31.10.2018 18:20

git cherry branch [newbranch]

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

Еще я очень люблю:

git diff --name-status branch [newbranch]

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

'git cherry' выводит список идентификаторов фиксации. Могу ли я преобразовать их в одно различие, объединяющее все изменения в каждом коммите?

Jonathan Hartley 20.07.2011 19:44

@JonathanHartley Возьмите первый и последний, подобные идентификаторам фиксации, и переместите их в gif-diff: git diff x..z, или для моего собственного примера это git diff 13bc4d..8eda3a.

towi 22.05.2013 13:37

Трудно понять, какой код необходимо заменить в вашей команде, например, какой из ветвей или новых веток является ключевым словом, а какой следует заменить на собственное имя ветки.

pal4life 16.06.2014 21:50

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

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

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

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

  • Если на мастере: gbin branch1 <- это покажет вам, что находится в branch1 и не в хозяине
  • Если на мастере: gbout branch1 <- это покажет вам, что в мастере, которого нет в ветке 1

Это будет работать с любой веткой.

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 точки дважды показывают первую фиксацию в ветке, а две - нет.

TJ Biddle 11.10.2012 03:17

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

git log master..branchName 

или же

git log master..branchName --oneline

Я предполагаю, что «branchName» был создан как отслеживающая ветвь «master».

Точно так же, чтобы увидеть входящие изменения, вы можете использовать:

git log branchName..master

@ A-B-B, если имя ветки опущено, по умолчанию используется значение «head», которое фактически является именем ветки в приведенном выше примере.

Debajit 06.11.2013 05:27

Добавьте туда -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 будет не очень полезен для получения различий, вносимых ТОЛЬКО посредством коммитов в указанной ветке.

guival 08.02.2017 18:30

Или явно указать ветви: git diff <branch1>...<branch2> покажет изменения, внесенные branch2.

Alex 15.03.2018 05:00

В 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.

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