Considere a seguinte sequência de comandos:
git replace --graft <sha> <new_parent_sha>
new_commit_sha="$(git show-ref refs/replace/<sha> | awk '{print $1}')"
git update-ref -d refs/replace/<sha>
O resultado final é que temos um commit (new_commit_sha) com novos pais, que é idêntico ao commit original (mesma árvore, mesma mensagem, mesmo autor e responsável pelo commit, data do autor, data do commit), exceto que os pais são diferentes.
Existe uma maneira mais direta de obter o mesmo efeito de duplicar um commit com pais substituídos sem primeiro criar uma replace
referência e depois excluí-la?
Eu olhei git-commit-tree
, mas não vi uma opção para pegar a maioria das propriedades de commit de um commit de origem.
Eu também brinquei com git cherry-pick
mas isso tenta aplicar um patch que pode entrar em conflito e resultar em uma árvore diferente se o pai for diferente. Estou tentando produzir um commit com exatamente a mesma árvore (e outras propriedades).
Há uma maneira mais fácil de obter o sha do ref de substituição e uma maneira mais direta de fazer tudo, mas é mais detalhada.
Mais fácil:
Mais direto, mas você tem que dizer as alterações exatas que deseja. A ideia é que o formato de commit do Git seja intencionalmente um texto simples e direto. Edite-o para substituir os pais e então escreva o resultado como um novo commit:
então, por exemplo, o acima com dois pais e sem se preocupar com o replace-ref tango em um sistema GNU é
Se você não tem um sed ou shell GNU, você pode construir as instruções de edição para se adequarem ao seu próprio conjunto de ferramentas; é mais fácil, provavelmente até um pouco mais barato e provavelmente mais claro simplesmente fazer o
git replace
, ele domina a dança da reconfiguração dos pais.ps em uma tangente lateral usando mais recursos de legibilidade do shell, talvez isso esteja se aprofundando muito aqui, mas se você tiver as ferramentas, poderá fazer bom uso da leitura linha por vez do shell para torná-lo mais claro. (Infelizmente, isso confunde horrivelmente a coloração de sintaxe interna do SO e até mesmo do emacs, mas, sem surpresa, não do vim.) O Markdown consome tabulações, mas o shell pode usá-las para tornar os dados inline mais fáceis para os olhos, aqui está o que eu realmente usei para meu teste de fumaça em uma mesclagem de dois pais aqui, todos os espaços em branco iniciais são tabulações:
ou mesmo