Как получить изменения на ветке в Git - PullRequest
249 голосов
/ 10 сентября 2008

Каков наилучший способ получить журнал коммитов на ветке с момента его ветвления от текущей ветки? Мое решение до сих пор:

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.

Ответы [ 9 ]

176 голосов
/ 10 сентября 2008

В контексте списка редакций 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.

64 голосов
/ 08 ноября 2008
git cherry branch [newbranch]

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

Я тоже очень люблю:

git diff --name-status branch [newbranch]

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

33 голосов
/ 20 ноября 2012

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

git log master..branchName 

или

git log master..branchName --oneline

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

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

git log branchName..master
23 голосов
/ 14 мая 2010

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

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

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

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

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

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

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
}
13 голосов
/ 09 мая 2016

Похоже на несколько ответов, таких как Alex V и NDavis, но ни один из них не является одинаковым.

Когда уже в ветке идет речь

Использование:

git diff master...

, который сочетает в себе несколько функций:

  • это супер коротко
  • показывает фактические изменения

Обновление:

Вероятно, это должно быть git diff master, но также показывает diff, а не коммиты, как указано в вопросе.

8 голосов
/ 15 августа 2013

Добавьте туда -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
6 голосов
/ 13 октября 2015

Для просмотра журнала текущей ветки с момента ветвления от master:

git log master...

Если вы в настоящее время используете мастер, чтобы посмотреть журнал другой ветви, так как она разветвлена ​​от мастера:

git log ...other-branch

4 голосов
/ 27 июля 2012
git log --cherry-mark --oneline from_branch...to_branch

(3 точки), но иногда вместо '='

отображается '+'
2 голосов
/ 11 октября 2013

Я нашел

git diff <branch_with_changes> <branch_to_compare_to>

более полезно, так как вы получаете не только сообщения коммита, но и весь diff. Если вы уже находитесь в ветке, в которой хотите увидеть изменения и (например) хотите увидеть, что изменилось в мастере, вы можете использовать:

git diff HEAD master
...