Como obter as alterações em uma ramificação no Git

265

Qual é a melhor maneira de obter um log de confirmações em uma ramificação desde o momento em que ela foi ramificada da ramificação atual? 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-parse indica que r1...r2é definido como r1 r2 --not $(git merge-base --all r1 r2).

Por que isso é diferente? Observe que isso git diff HEAD...branchme dá as diferenças que eu quero, mas o comando git log correspondente me dá mais do que eu quero.

Nas imagens, suponha o seguinte:

         x --- y --- z --- ramo
        /
--- a --- b --- c --- d --- e --- CABEÇA

Gostaria de obter um log contendo confirmações x, y, z.

  • git diff HEAD...branch dá esses commits
  • no entanto, git log HEAD...branchfornece x, y, z, c, d, e.
Greg Hewgill
fonte
Você está usando "git log" incorretamente para seus propósitos, pelo que posso ver. Eu adicionei minha resposta abaixo.
PlagueHammer

Respostas:

186

No contexto de uma lista de revisão, A...Bé como a git-rev-parsedefine. O git-log faz uma lista de revisão. git-diffnão aceita uma lista de revisões - é necessária uma ou duas revisões e definiu a A...Bsintaxe para significar como é definida na página de git-diffmanual. Se git-diffnão definisse explicitamente A...B, essa sintaxe seria inválida. Observe que a página de git-rev-parsemanual descreve A...Bna seção "Especificando intervalos" e tudo nessa seção é válido apenas em situações em que um intervalo de revisão é válido (ou seja, quando uma lista de revisão é desejada).

Para obter um log contendo apenas x, ye z, tente git log HEAD..branch(dois pontos, não três). Isso é idêntico git log branch --not HEADe significa que todos os commit na ramificação que não estão no HEAD.

Lily Ballard
fonte
31
Uau, isso é confuso. Acontece que o uso de "git diff HEAD..branch" mostra todos os commits (x, y, z, c, d, e), mas "git log HEAD..branch" faz exatamente o que eu quero e mostra apenas x, y , z! Este é exatamente o oposto de usar "...".
Greg Hewgill 10/09/08
22
git diff HEAD..branché idêntico a git diff HEAD branch. A principal coisa a lembrar aqui é que o log recebe uma lista / intervalo de revisões, enquanto o diff não. É por isso que eles tratam seus argumentos de maneira diferente.
Lily Ballard
4
Parece que git diff HEAD...branch(três pontos) corresponde à saída degit log HEAD..branch
jchook
72
git cherry branch [newbranch]

faz exatamente o que você está perguntando, quando você está no masterramo.

Também gosto muito de:

git diff --name-status branch [newbranch]

O que não é exatamente o que você está perguntando, mas ainda é muito útil no mesmo contexto.

skiphoppy
fonte
8
'git cherry' gera uma lista de IDs de confirmação. Posso convertê-los em um diff único combinando todas as alterações em cada commit?
22811 Jonathan Hartley
1
git cherryé realmente muito útil. Obrigado :)
jkp
2
@JonathanHartley Pegue o primeiro e o último como os IDs de confirmação e jogue-os no gif-diff:: git diff x..zou, no meu próprio exemplo, é git diff 13bc4d..8eda3a.
towi
3
É difícil de entender qual o código deve ser substituído em seu comando como em que um dos ramo ou newbranch é uma palavra-chave e que deve ser substituído com o nome do ramo de costume
pal4life
37

O que você deseja ver é a lista de confirmações de saída. Você pode fazer isso usando

git log master..branchName 

ou

git log master..branchName --oneline

Onde eu assumo que "branchName" foi criado como um ramo de rastreamento de "master".

Da mesma forma, para ver as alterações recebidas, você pode usar:

git log branchName..master
PlagueHammer
fonte
1
@ABB, se branchName for omitido, o padrão será "head", que é efetivamente branchName no exemplo acima.
PlagueHammer
25

Isso é semelhante à resposta que eu postei em: Visualizar um push do Git

Solte estas funções no seu perfil do Bash:

  • gbout - saída do ramo git
  • gbin - ramificação do git recebida

Você pode usar isso como:

  • Se no master: gbin branch1 <- isso mostrará o que está no branch1 e não no master
  • Se no master: gbout branch1 <- isso mostrará o que está no master que não está no branch 1

Isso 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
}
Clintm
fonte
16

Semelhante a várias respostas como Alex V e NDavis, mas nenhuma delas é a mesma.

Quando já estiver no ramo em questão

Usando:

git diff master...

Que combina vários recursos:

  • é super curto
  • mostra as mudanças reais

Atualizar:

Provavelmente deve ser git diff master, mas também mostra o diff, não o commit, conforme a pergunta especificada.

Michael Durrant
fonte
2
Se você git co master; git pullcriou o ramo desde então, git diff masternão será muito útil para obter as diferenças introduzidas SOMENTE por confirmações no ramo especificado.
guival
1
Ou para especificar ramificações explicitamente: git diff <branch1>...<branch2>mostrará as alterações introduzidas por branch2.
21318 Alex
10

Jogue um -p para ver algumas ALTERAÇÕES DE ARQUIVO

git log -p master..branch

Faça alguns apelidos:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"

alias gbl='git log -p master..\`gbc\`'

Veja as confirmações exclusivas de uma filial:

gbl
Alex V
fonte
6

Para ver o log da ramificação atual desde a ramificação do mestre:

git log master...

Se você está atualmente no mestre, para ver o log de uma ramificação diferente, uma vez que ela ramificou o mestre:

git log ...other-branch

NDavis
fonte
4
git log --cherry-mark --oneline from_branch...to_branch

(3dots), mas às vezes mostra '+' em vez de '='

nopsoft
fonte
3 pontos mostram o primeiro commit no ramo duas vezes, enquanto dois não.
TJ Biddle
2

eu encontrei

git diff <branch_with_changes> <branch_to_compare_to>

mais útil, já que você não apenas recebe as mensagens de confirmação, mas todo o diff. Se você já está no ramo em que deseja ver as alterações e (por exemplo) deseja ver o que mudou para o mestre, pode usar:

git diff HEAD master
Dominik Ehrenberg
fonte