Eu tenho um ramo antigo que gostaria de excluir. No entanto, antes de fazer isso, quero verificar se todas as confirmações feitas neste ramo foram em algum momento mescladas em outro ramo. Portanto, gostaria de ver todos os commits feitos no meu branch atual que não foram aplicados a nenhum outro branch [ou, se isso não for possível sem algum script, como é possível ver todos os commits em um branch que não foram aplicados para outro ramo?].
git
branch
git-branch
sircolinton
fonte
fonte
Respostas:
Você provavelmente só quer
Isso listará todas as ramificações que contêm as confirmações de "ramificação para exclusão". Se ele relatar mais do que apenas "ramificar para excluir", a ramificação foi mesclada.
Suas alternativas são realmente apenas coisas de sintaxe de lista de revenda. por exemplo,
git log one-branch..another-branch
mostra tudo o queone-branch
precisa ter tudo o queanother-branch
tem.Você também pode estar interessado em
git show-branch
uma maneira de ver o que há onde.fonte
git branch --contains some-branch
apenas retornarsome-branch
, ela retornará algo, mas não foi mesclada.git log foo..bar
mostrará os commits entre os mais recentes do bar e os mais recentes do foo, mas nenhum outro commit ausente ainda mais no tempo. Para ver tudo no bar, mas não no foo, você deve usar a solução do @ jimmyorr.Para ver uma lista de quais confirmações estão em uma ramificação, mas não em outra, use o git log:
... ou seja, mostre logs de confirmação para todos os commit no oldbranch que são não no newbranch. Você pode listar várias ramificações para incluir e excluir, por exemplo
Nota: no Windows
^
é uma chave de escape, portanto, ele precisa ser escapado com outra^
:fonte
^
como prefixo aqui me confundiu. Nesse contexto, significa excluir esse ramo. Usar^
como sufixo seria uma referência relativa ao commit pai desse ramo.gitk oldbranch ^newbranch --no-merges
(Testado com git 1.8.1.1). Nota lateral, para mim^
significa inclusivo HEAD commit do branchnewbranch
.Para mostrar os commits em oldbranch, mas não em newbranch:
Para mostrar o diff por esses commits (observe que há três pontos):
Aqui está o documento com uma ilustração do diagrama https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
fonte
newbranch
ouoldbranch
, o que podemos fazergit log ..oldbranch
ougit log newbranch..
, respectivamente..
entre os nomes dos árbitros. Também usei a--cherry-pick
opção para ocultar confirmações que estão presentes nos dois ramos, mas que têm um hash diferente porque foram escolhidas de um ramo para o outro.Para aqueles que ainda procuram uma resposta simples, confira git cherry . Ele compara diffs reais em vez de confirmar hashes. Isso significa que ele acomoda confirmações que foram escolhidas ou refazidas com cereja.
Primeiro faça o checkout do ramo que você deseja excluir:
git checkout [branch-to-delete]
então use git cherry para compará-lo ao seu ramo de desenvolvimento principal:
git cherry -v master
Exemplo de saída:
Nota: O
-v
sinalizador deve incluir a mensagem de confirmação junto com o hash SHA.As linhas com o '+' na frente estão no ramo a excluir, mas não no ramo mestre. Aqueles com um '-' na frente têm um commit equivalente no master.
Para APENAS os commits que não estão no master, combine cherry pick com grep:
git cherry -v master | grep "^\+"
Exemplo de saída:
fonte
diff
utilitário unix para comparar os vários arquivos. Ou, você pode criar uma ramificação temporária e compactar todos os commits da mesma forma que fez com a ramificação original e, em seguida, usar isso, o que acho que funcionaria.Embora algumas das respostas postadas aqui ajudem a encontrar o que você procura, o seguinte subcomando do git branch é uma solução mais adequada para sua tarefa.
--merged é usado para encontrar todos os ramos que podem ser excluídos com segurança, uma vez que esses ramos estão totalmente contidos pelo HEAD.
Enquanto em
master
um era possível executar o comando para enumerar as ramificações, era possível remover com segurança, da seguinte maneira:fonte
A resposta de jimmyorr não funciona no Windows. ajuda a usar em
--not
vez de^
:fonte
^
é suportado no Windows, mas precisa ser escapado, o que, no Windows, é (outro)^
:git log oldbranch ^^newbranch --no-merges
.Se for necessário verificar uma ramificação (única) , por exemplo, se você deseja que a ramificação 'B' seja totalmente mesclada na ramificação 'A', basta fazer o seguinte:
git branch -d <branchname>
tem a segurança de que "A filial deve ser totalmente mesclada no HEAD".Cuidado : isso realmente exclui o ramo B se ele for mesclado no A.
fonte
Você pode usar este script simples para ver confirmações que não são mescladas
Você também pode usar a ferramenta git-wtf que exibirá o estado das ramificações
fonte
Basta usar
git cherry
para selecionar todos os commits na ramificação,newFeature42
por exemplo:git cherry -v master newFeature42
fonte
Comece a criar uma solicitação pull por meio do serviço de hospedagem git que você está usando. Se a ramificação tiver sido totalmente mesclada na ramificação base, você não poderá criar o novo PR.
Você não precisa realmente fazer a solicitação de recebimento, basta usar a primeira etapa em que escolhe as ramificações.
Por exemplo, no GitHub:
Isso não usa git na linha de comando, mas geralmente acho útil usar as outras ferramentas à sua disposição com um modelo mental claro, em vez de tentar lembrar outro comando arcano git.
fonte