2008-09-10 9 views
225

Каков наилучший способ получить журнал фиксации на ветке с момента ее разветвления с текущей ветки? Мое решение до сих пор:Как получить изменения на ветке в 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 

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

  • git diff HEAD...branch дает эти фиксаций
  • однако, дает git log HEAD...branch х, у, Z, C, D, E.
+0

Вы используете «git log» неправильно для своих целей из того, что я вижу. Я добавил свой ответ ниже. – PlagueHammer 2012-11-20 02:32:46

ответ

161

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

+26

Вау, это сбивает с толку. Оказывается, использование «git diff HEAD..branch» показывает все коммиты (x, y, z, c, d, e), но «git log HEAD..branch» делает именно то, что я хочу, и только показывает x, y , z! Это полная противоположность использованию «...». – 2008-09-10 07:59:07

+20

`git diff HEAD..branch` идентичен` git diff HEAD branch`. Ключевая вещь, которую следует запомнить здесь, - это то, что журнал принимает список/диапазон ревизий, а diff - нет. Вот почему они относятся к своим аргументам по-разному. – 2008-09-11 07:52:10

60
git cherry branch [newbranch] 

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

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

git diff --name-status branch [newbranch] 

Который не то, что вы просите, но все еще очень полезно в том же контексте.

+0

А, это тоже хорошо! – 2008-11-07 21:48:16

+7

'git cherry' выводит список идентификаторов фиксации. Могу ли я преобразовать их в один diff, объединяя все изменения в каждом коммите? – 2011-07-20 15:44:50

+1

`git cherry` очень полезен. Спасибо :) – jkp 2011-08-26 12:14:23

22

Это похоже на ответ, который я разместил на: Preview a Git push

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

  • gbout - мерзавец филиал исходящего
  • gbin - мерзавец филиал входящих

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

  • Если на мастер: 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 
} 
4
git log --cherry-mark --oneline from_branch...to_branch 

(3dots), но иногда он показывает '+' вместо '='

30

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

git log master..branchName 

или

git log master..branchName --oneline 

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

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

git log branchName..master 
7

Бросьте -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 
2

Я нашел

git diff <branch_with_changes> <branch_to_compare_to> 

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

git diff HEAD master 
6

Чтобы увидеть журнал текущей ветви, так как ветвление от мастера:

git log master...

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

git log ...other-branch

8

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

Когда уже в отрасли в вопросе

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

git diff master... 

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

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

Обновление:

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

Смежные вопросы