Gostaria de remover as entradas de log de confirmação selecionadas de uma árvore de confirmação linear, para que as entradas não apareçam no log de confirmação.
Minha árvore de commit se parece com:
R--A--B--C--D--E--HEAD
Gostaria de remover as entradas B e C para que elas não apareçam no log de confirmação, mas as alterações de A para D devem ser preservadas. Talvez introduzindo um único commit, para que B e C se tornem BC e a árvore pareça.
R--A--BC--D--E--HEAD
Ou, idealmente, depois que A vem D diretamente. D 'representando mudanças de A para B, B para C e C para D.
R--A--D'--E--HEAD
Isso é possível? se sim, como?
Este é um projeto relativamente novo e, portanto, não possui filiais a partir de agora; portanto, também não há mesclagens.
rebase
pode remover antigos / criar novos commits. Não sei o que significa "confirmar entradas de log".git log
mostra o "log de confirmação" git-scm.com/docs/git-log . E eu queria me livrar de duas entradas desse log - não das alterações.Respostas:
O git-rebase (1) faz exatamente isso.
git awsome-ness [git rebase --interactive] contém um exemplo.
git-rebase
em confirmações públicas (remotas).commit
ou sestash
as alterações atuais).$EDITOR
.pick
antesC
eD
porsquash
. Ele irá mesclar C e D em B. Se você quiser excluir um commit, basta excluir sua linha.Se você estiver perdido, digite:
fonte
git rebase -i D [A]
?push -f
suas alterações. Não faça isso se você não estiver trabalhando sozinho.git-rebase
máquina manual e wayback para o post do blog.fonte
Aqui está uma maneira de remover um ID de confirmação específico, sabendo apenas o ID de confirmação que você deseja remover.
Observe que isso realmente remove a alteração introduzida pelo commit.
fonte
Para expandir a resposta de JF Sebastian:
Você pode usar o git-rebase para fazer facilmente todos os tipos de alterações no seu histórico de consolidação.
Após executar o git rebase --interactive, você obtém o seguinte em seu $ EDITOR:
Você pode mover linhas para alterar a ordem das confirmações e excluir linhas para remover essa confirmação. Ou você pode adicionar um comando para combinar (squash) duas confirmações em uma única confirmação (confirmação anterior é a confirmação acima), editar confirmações (o que foi alterado) ou reformular as mensagens de confirmação.
Acho que pick significa apenas que você deseja deixar esse commit em paz.
(O exemplo é daqui )
fonte
Você pode remover não interativamente B e C no seu exemplo com:
ou simbolicamente,
Observe que as alterações em B e C não estarão em D; eles se foram .
fonte
Mais uma maneira,
escolha o hash que deseja usá-lo como base e o comando acima deve torná-lo interativo para que você possa compactar todas as principais mensagens (você precisa deixar a mais antiga)
fonte
Acho esse processo muito mais seguro e fácil de entender, criando outro ramo a partir do SHA1 de A e escolhendo as alterações desejadas, para garantir que estou satisfeito com a aparência desse novo ramo. Depois disso, é fácil remover o ramo antigo e renomear o novo.
fonte
Acabei de coletar todas as respostas das pessoas: (sou novo no git plz, use-o apenas para referência)
git rebase para excluir quaisquer confirmações
log git
git rebase -i CABEÇA ~ 1
Então a tela ficará assim:
Altere aqui a primeira linha conforme sua necessidade (usando os comandos listados acima, ou seja, 'drop' para remover o commit etc.) Depois de concluída a edição, pressione ': x' para salvar e sair do editor (isto é apenas para o editor vim)
E depois
empurrão
Se está mostrando um problema, você precisa forçar as alterações para o controle remoto (SEU MUITO CRÍTICO: não force o push se estiver trabalhando em equipe)
origem git push -f
fonte
Você pode usar git cherry-pick para isso. 'cherry-pick' aplicará uma confirmação no ramo em que você está agora.
então faça
depois aplique as confirmações D e E.
Isso ignorará o commit B e C. Dito isto, pode ser impossível aplicar o commit D ao ramo sem B, então YMMV.
fonte
reset --hard
, nãorebase --hard
(o que não existe) #