Как получить изменения в ветке в 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
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
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.

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