Sourcetree - desfazer confirmações não pressionadas

208

Estou usando o Sourcetree for Windows para um repositório git e gostaria de desfazer uma confirmação não enviada.

Isso é possível? Se eu "reverter a confirmação", ele cria uma segunda confirmação que reverte a primeira confirmação, mas não quero que a primeira confirmação apareça no meu controle de origem.

Eu também poderia excluir meu repositório local e removê-lo novamente sem o meu commit local, mas talvez haja outra maneira?

deimos1988
fonte
Eu escrevi um artigo detalhado com screenshots. Compartilhando a esperança de que isso ajudaria: attosol.com/undo-in-git-using-sourcetree
Rahul Soni

Respostas:

345
  1. Clique com o botão direito do mouse no commit que você deseja redefinir (não no que você deseja excluir!)
  2. Selecione "Redefinir mestre para este commit"
  3. Selecione "Soft" redefinir.

Uma reinicialização suave manterá as alterações locais.

Fonte: https://answers.atlassian.com/questions/153791/how-should-i-remove-push-commit-from-sourcetree

Editar

Sobre git revert: Este comando cria um novo commit que irá desfazer outros commit. Por exemplo, se você tem um commit que adiciona um novo arquivo, git revertpoderia ser usado para fazer um commit que excluirá o novo arquivo.

Sobre a aplicação de uma reinicialização suave: Suponha que você tenha confirmações Aem E( A---B---C---D---E) e gostaria de excluir a última confirmação ( E). Em seguida, você pode fazer uma redefinição suave para confirmar D. Com uma reinicialização suave, a confirmação Eserá excluída do git, mas as alterações locais serão mantidas. Existem mais exemplos na documentação do git reset .

nightlyop
fonte
34
Ou se você estiver trabalhando em um ramo - "Redefinir o ramo atual para este commit"
Tom Auger
5
Eu não entendo muito essas explicações da interface do usuário ... Redefina a ramificação atual para esse commit para que não pareça que ele excluirá o commit. E acabou fazendo o que você esperaria mais. Ele redefiniu minha cópia de trabalho para o commit, em vez de excluí-lo.
MrFox
Eu concordo com o @MrFox. Depois que eu fiz isso, o commit que eu não quero ainda é mostrado na árvore.
Timmmm 11/01
@ Timmmm: A nova explicação ajuda?
nightlyop 11/01
Na verdade, percebi que já havia pressionado meu commit no github. Encontrei um artigo que explica como "reescrever a história", mas parece que é mais problema do que vale a pena!
Timmmm
46

Se você selecionar a entrada de log para a qual deseja reverter, poderá clicar em "Redefinir para esta confirmação". Use esta opção apenas se você não enviar as alterações de confirmação inversa. Se você estiver preocupado em perder as alterações, poderá usar o modo dinâmico que deixará um conjunto de alterações não confirmadas (o que você acabou de alterar). O uso da combinação redefine a cópia de trabalho, mas mantém essas alterações, e um disco apenas se livra das alterações completamente. Aqui estão algumas capturas de tela:

insira a descrição da imagem aqui

Muhammad Awais
fonte
3
Se você ainda vir um ícone mostrando que um Push está disponível em seu commit anterior (que você acabou de eliminar), puxe e o Sourcetree parece atualizar a interface do usuário.
ChristoKiwi
6

Se você deseja excluir uma confirmação, você pode fazê-lo como parte de uma nova base interativa. Mas faça-o com cuidado, para não atrapalhar seu repo.

Em Sourcetree:

  1. Clique com o botão direito do mouse em um commit mais antigo que você deseja excluir e escolha " Rebase children of xxxx interativamente ... ". Aquele em que você clicar será sua "base" e poderá fazer alterações em todos os commit feitos após esse.
  2. Na nova janela, selecione o commit que você deseja executar e pressione o botão " Excluir " na parte inferior, ou clique com o botão direito do mouse no commit e clique em " Excluir commit ".
  3. Clique em " OK " (ou " Cancelar " se você deseja abortar).

Confira esta postagem no blog Atlassian para obter mais informações sobre rebasing interativo no Sourcetree.

jna
fonte
Esta é a resposta que eu estava procurando, funcionou exatamente conforme necessário.
Cliff Burton
0

Se você estiver em outro ramo, primeiro precisará "verificar este commit" para confirmar que deseja excluir e somente "redefinir o branch atual para esse commit", escolhendo o commit wright anterior, funcionará.

pomaranga
fonte