Como para obter as alterações em um branch no Git
Pergunta
Qual é a melhor forma para obter um log de commits em um ramo desde o momento em que foi ramificado a partir da ramificação atual?A minha solução até agora é:
git log $(git merge-base HEAD branch)..branch
A documentação para git diff indica que git diff A...B
é equivalente a git diff $(git-merge-base A B) B
.Por outro lado, a documentação para git-rev-analisar indica que r1...r2
é definido como r1 r2 --not $(git merge-base --all r1 r2)
.
Por que eles são diferentes?Note que git diff HEAD...branch
dá-me o diffs que eu quero, mas o correspondente git log de comando dá-me mais do que o que eu quero.
Nas fotos, suponha que este:
x---y---z---branch / ---a---b---c---d---e---HEAD
Eu gostaria de obter um log contendo compromete-se x, y, z.
git diff HEAD...branch
dá a estes compromete-se- no entanto,
git log HEAD...branch
dá x, y, z, c, d, e.
Solução
No contexto de uma lista de revisão, A...B
é como git-rev-parse
define.git-log leva uma lista de revisão. git-diff
não tome uma lista de revisões - ele leva uma ou duas revisões, e tem definido o A...B
a sintaxe para dizer, como é definido no git-diff
página de manual.Se git-diff
não definir explicitamente A...B
, e , em seguida, que a sintaxe seria inválido.Observe que o git-rev-parse
página de manual descreve A...B
em "Especificar Intervalos de seção", e tudo em que seção é válida apenas em situações onde um intervalo de revisões é válido (por exemplo,quando uma lista de revisão é pretendida).
Para obter um log contendo apenas de x, y e z, tente git log HEAD..branch
(dois pontos e não três).Este é idêntico ao git log branch --not HEAD
, e significa que todos os compromete-se no ramo que não estão na CABEÇA.
Outras dicas
git cherry branch [newbranch]
faz exatamente o que você está pedindo, quando você estiver no master
ramo.
Eu também sou muito fã de:
git diff --name-status branch [newbranch]
O que não é exatamente o que você está perguntando, mas ainda é muito útil no mesmo contexto.
O que você quer ver é a lista de saída compromete-se.Você pode fazer isso usando
git log master..branchName
ou
git log master..branchName --oneline
Onde eu assumo que "branchName" foi criado como um acompanhamento do ramo de "mestre".
Da mesma forma, para ver a entrada alterações que você pode usar:
git log branchName..master
Isso é semelhante a resposta que eu postado em: Pré-visualizar um Git push
Colocar estas funções em seu Bash perfil:
- gbout - git branch saída
- gbin - git branch entrada
Você pode usar esse como:
- Se no master:gbin branch1 <-- este vai mostrar o que está em branch1 e não no mestre
- Se no master:gbout branch1 <-- isto irá mostrar a você o que em mestre, que não é do ramo 1
Isso vai funcionar com qualquer ramo.
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
}
Semelhante a várias respostas, como Alex, V e NDavis, mas nenhum deles é exatamente o mesmo.
Quando já no ramo em questão
Usando:
git diff master...
O que combina vários recursos:
- é super curto
- mostra as alterações reais
Atualização:
Isto provavelmente deve ser git diff master
, mas também isso mostra a comparação, não a compromete-se como a questão especificado.
Jogue a-p lá para ver algumas ALTERAÇÕES de ARQUIVO
git log -p master..branch
Fazer alguns aliases:
alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"
alias gbl='git log -p master..\`gbc\`'
Consulte um ramo única compromete-se:
gbl
Para ver o registo da atual ramo desde ramificando-se mestre:
git log master...
Se você está atualmente em mestre, para ver o registo de uma ramificação diferente, pois ramificado mestre:
git log ...other-branch
git log --cherry-mark --oneline from_branch...to_branch
(3dots), mas às vezes mostra '+' em vez de '='
Eu encontrei
git diff <branch_with_changes> <branch_to_compare_to>
mais útil, desde que você não só obter as mensagens de confirmação, mas toda a comparação.Se você já está no ramo que você deseja ver as alterações e (por exemplo) quer ver o que foi alterado para o master, você pode usar:
git diff HEAD master