Quero listar todos os commits que são apenas parte de um ramo específico.
Com o seguinte, ele lista todos os commits da ramificação, mas também do pai (mestre)
git log mybranch
A outra opção que encontrei foi excluir os commits acessíveis pelo mestre e me fornecer o que quero, mas gostaria de evitar a necessidade de conhecer os nomes dos outros ramos.
git log mybranch --not master
Eu estava tentando usar git for-each-ref
, mas ele também está listando mybranch e, na verdade, está excluindo tudo:
git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Atualizar:
Estou testando uma nova opção que encontrei há algum tempo e, até agora, parece que isso poderia ser o que eu estava procurando:
git log --walk-reflogs mybranch
Atualização (2013-02-13T15: 08):
A opção --walk-reflogs é boa, mas verifiquei se há uma expiração para os reflogs (padrão: 90 dias, gc.reflogExpire ).
Acho que encontrei a resposta que estava procurando:
git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")
Estou apenas removendo a ramificação atual da lista de ramificações disponíveis e usando essa lista para ser excluída do log. Dessa forma, só recebo os commits que são alcançados apenas pelo mybranch .
Respostas:
Pelo que parece, você deve estar usando
cherry
:Isso mostraria todos os commits que estão contidos no mybranch , mas NÃO em desenvolvimento . Se você deixar de fora a última opção ( mybranch ), ela comparará a ramificação atual.
Como VonC apontou, você SEMPRE está comparando sua ramificação com outra ramificação, portanto, conheça suas ramificações e escolha qual delas comparar.
fonte
git cherry -v master
comparar sua ramificação atual com a ramificação mestre.fatal: Unknown commit mybranch
.Eu não acho que isso seja possível: uma ramificação no Git é sempre baseada em outra ou pelo menos em outra confirmação, conforme explicado em " git diff não mostra o suficiente ":
Você precisa de um ponto de referência para o seu log mostrar as confirmações corretas.
Conforme mencionado em " GIT - De onde eu ramifiquei? ":
Assim, mesmo se
git log master..mybranch
é uma resposta, seria ainda mostrar muitos commits, semybranch
baseia-semyotherbranch
, ela própria baseada emmaster
.Para encontrar essa referência (a origem do seu ramo), você só pode analisar confirmações e ver em qual filial elas estão, conforme visto em:
fonte
Finalmente encontrei o caminho para fazer o que o OP queria. É tão simples quanto:
O comando exibirá todas as confirmações alcançáveis a partir da ramificação fornecida no formato de gráfico. Porém, você pode filtrar facilmente todas as confirmações nesse ramo, observando o gráfico de confirmações cujo
*
é o primeiro caractere na linha de confirmação.Por exemplo, vejamos o trecho do
git log --graph master
repositório cakephp do GitHub abaixo:Como você pode ver, apenas confirma
8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
ec3f45e811e4b49fe27624b57c3eb8f4721a4323b
tem*
o primeiro caractere nas linhas de confirmação. Esses commits são da ramificação principal, enquanto os outros quatro são de outras ramificações.fonte
O seguinte comando shell deve fazer o que você deseja:
Ressalvas
Se você
mybranch
fez o check-out, o comando acima não funcionará. Isso porque os commits onmybranch
também são acessíveisHEAD
, então o Git não considera os commits exclusivosmybranch
. Para que ele funcione quando omybranch
check-out é feito, você também deve adicionar uma exclusão paraHEAD
:No entanto, você não deve excluir a
HEAD
menos que omybranch
check-out esteja marcado, caso contrário corre o risco de mostrar confirmações que não são exclusivasmybranch
.Da mesma forma, se você tiver uma ramificação remota chamada
origin/mybranch
que corresponda àmybranch
ramificação local , será necessário excluí-la:E se a ramificação remota for a ramificação padrão para o repositório remoto (geralmente apenas verdadeiro
origin/master
), você também terá que excluirorigin/HEAD
:Se você tiver feito o check-out da ramificação, e houver uma ramificação remota, e a ramificação remota for o padrão para o repositório remoto, você acaba excluindo muito:
Explicação
O
git rev-list
comando é um comando de nível inferior (encanamento) que percorre as revisões fornecidas e despeja os identificadores SHA1 encontrados. Pense nisso como equivalente a,git log
exceto que mostra apenas o SHA1 - nenhuma mensagem de log, nenhum nome de autor, nenhum registro de data e hora, nada disso "sofisticado".A
--no-walk
opção, como o nome indica, impedegit rev-list
de percorrer a cadeia ancestral. Portanto, se você digitargit rev-list --no-walk mybranch
, imprimirá apenas um identificador SHA1: o identificador da confirmação de ponta damybranch
ramificação.Os
--exclude=refs/heads/mybranch --all
argumentos dizemgit rev-list
para começar a partir de cada referência, excetorefs/heads/mybranch
.Portanto, quando você executa
git rev-list --no-walk --exclude=refs/heads/mybranch --all
, o Git imprime o identificador SHA1 da confirmação da dica de cada referência, excetorefs/heads/mybranch
. Esses commits e seus ancestrais são os commits nos quais você não está interessado - esses são os commits que você não deseja ver.Os outros commits são os que você deseja ver, então coletamos a saída
git rev-list --no-walk --exclude=refs/heads/mybranch --all
e pedimos ao Git para mostrar tudo, exceto esses commits e seus ancestrais.O
--no-walk
argumento é necessário para repositórios grandes (e é uma otimização para repositórios pequenos): sem ele, o Git precisaria imprimir e o shell precisaria coletar (e armazenar na memória) muito mais identificadores de confirmação do que o necessário. Com um repositório grande, o número de confirmações coletadas pode facilmente exceder o limite de argumentos da linha de comando do shell.Bug do Git?
Eu esperava que o seguinte funcionasse:
mas isso não acontece. Acho que isso é um bug no Git, mas talvez seja intencional.
fonte
hg log -b <branch>
. Não entendo por que as pessoas dizem que o git é hostil. / sgit log --all --not --exclude=refs/heads/mybranch --all
que não funciona, masgit log refs/heads/mybranch --not --exclude=refs/heads/mybranch --all
funciona, com as mesmas ressalvas em excluir HEAD e origem.Resposta rápida:
Digamos:
Que você tem um ramo mestre
Faça algumas confirmações
Você criou um ramo chamado b2
Faça
git log -n1
; o ID de confirmação é a base de mesclagem entre b2 e masterFaça alguns commits em b2
git log
mostrará seu histórico de log de b2 e masterUse o intervalo de confirmação, se você não estiver familiarizado com o conceito, convido você a pesquisar no Google ou empilhar o estouro,
Para o seu contexto real, você pode fazer, por exemplo
O ".." é o operador de intervalo para o comando log.
Isso significa que, de uma forma simples, me dê todos os logs mais recentes que o commitID_FOO ...
Veja o ponto 4, a base de mesclagem
Então:
git log COMMITID_mergeBASE..HEAD
mostrará a diferençaO Git pode recuperar a base de mesclagem para você assim
Finalmente você pode fazer:
fonte
Você pode tentar algo como isto:
Ou, tomando emprestado da receita no Manual do Usuário do Git :
fonte
git show-ref --tags
também.listará as dicas de cada ramo que não é
master
.listará todos os commit no
master
histórico que não estão no histórico de nenhum outro ramo.O seqüenciamento é importante para as opções que configuram o pipeline de filtro para a seleção de confirmação, portanto
--branches
, deve seguir todos os padrões de exclusão que ele deve aplicar e--no-walk
seguir os filtros que fornecem a lista de revisão de commits que não devem andar.fonte
Isso produzirá as confirmações na ramificação atual. Se qualquer argumento for passado, ele apenas gera os hashes.
git_show_all_commits_only_on_this_branch
fonte
Estou usando os seguintes comandos:
ou
fonte
Achei essa abordagem relativamente fácil.
Saída para a agência e depois
Corre
Isso fornecerá apenas dois SHAs:
1) último commit do ramo [C1]
2) e confirmar o pai no primeiro commit do ramo [C2]
Agora corra
Aqui C1 e C2 são duas strings que você obterá quando executar o primeiro comando. Coloque esses valores sem <> no segundo comando.
Isso fornecerá uma lista do histórico de alterações de arquivos dentro da ramificação.
fonte
Na minha situação, estamos usando o Git Flow e o GitHub. Tudo o que você precisa fazer é: Compare sua ramificação de recursos com a ramificação de desenvolvimento no GitHub.
Ele mostrará as confirmações feitas apenas no ramo de recursos.
Por exemplo:
https://github.com/your_repo/compare/develop...feature_branch_name
fonte
git
e usar o GitHub para fazer uma solicitação pull ou comparar as ramificações.