Isso fornece uma boa explicação para esmagar várias confirmações:
http://git-scm.com/book/en/Git-Branching-Rebasing
mas não funciona para confirmações que já foram enviadas. Como faço para esmagar os poucos commit mais recentes nos meus repositórios locais e remotos?
EDIT: Quando eu faço git rebase -i origin/master~4 master
, manter o primeiro como pick
, definir os outros três como squash
e, em seguida, sair (via cx cc no emacs), recebo:
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started
onde 2f40 é o pick
commit. E agora nenhum dos 4 commits aparece git log
. Eu esperava que meu editor fosse reiniciado para que eu pudesse inserir uma mensagem de confirmação. O que estou fazendo errado?
git push --force origin master
git rebase -i origin/master
e, na verdade, quer saber como refazer os commits mais antigos do que isso, por exemplogit rebase -i origin/master~20 master
.+
força apenas o refspec que é prefixado por ele.--force
forçará todos os refspecs sendo empurrados. Por favor, veja a resposta atualizada.Em uma ramificação, eu pude fazer isso da seguinte maneira (nos últimos 4 commits)
fonte
Diferença menor na resposta aceita, mas eu estava tendo muita dificuldade para esmagar e finalmente consegui.
esc --> :wq
Empurre para o controle remoto usando:
fonte
Muitos problemas podem ser evitados criando apenas um
branch
para trabalhar e não trabalhandomaster
:git checkout -b mybranch
Os trabalhos a seguir para
remote
confirmações já enviadas e uma mistura deremote
confirmações enviadas /local
confirma apenas:Também tenho algumas notas de solicitação de recebimento que podem ser úteis.
fonte
git rebase -i master
você vai abrir o editor vm e msgs algo como isto
Aqui eu mudei o pick para todos os outros commits para "f" (significa correção).
git push -f origin feature/feature-branch-name-xyz
isso consertará todas as confirmações em uma confirmação e removerá todas as outras confirmações. Eu fiz isso e isso me ajudou.
fonte
Ao trabalhar com um Gitlab ou Github, você pode ter problemas dessa maneira. Você esmaga seus commits com um dos métodos acima. Minha preferida é:
selecione squash ou correção para o seu commit. Nesse ponto, você deve verificar o status do git. E a mensagem pode ser:
E você pode ficar tentado a puxá-lo. NÃO FAÇA ISSO ou você estará na mesma situação de antes.
Em vez disso, avance para sua origem com:
O + permite forçar o envio apenas para um ramo.
fonte
Para esmagar dois commits, um dos quais já foi enviado, em um único ramo, o seguinte funcionou:
Por padrão, isso incluirá a mensagem de confirmação da confirmação mais recente como um comentário na confirmação mais antiga.
fonte
1)
git rebase -i HEAD~4
Elaborar: Funciona no ramo atual; o HEAD ~ 4 significa esmagar os quatro últimos commits; modo interativo (-i)
2) Nesse ponto, o editor abriu, com a lista de confirmações, para alterar a segunda confirmação e as confirmações seguintes, substituindo pick por squash e salve-a.
saída: refs / heads / branch-name refazidos e atualizados com sucesso.
3)
git push origin refs/heads/branch-name --force
resultado:
fonte