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.

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.


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.


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

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
}

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.


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

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


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

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.