Acabei de esmagar alguns commits git rebase
e fiz um git push --force
(que é mau, eu sei).
Agora os outros engenheiros de software têm uma história diferente e, quando fazem isso git pull
, o Git se fundirá. Existe uma maneira de corrigir isso, exceto fazendo um rm my-repo; git clone [email protected]:my-repo.git
?
Eu preciso de algo como o oposto de git push --force
, mas git pull --force
não deu os resultados pretendidos.
git checkout master && git branch -D test && git checkout -b test origin/test
Respostas:
Para receber os novos commits
Redefinir
Você pode redefinir a confirmação para uma filial local usando
git reset
.Para alterar a confirmação de uma ramificação local:
Tenha cuidado, porém, como a documentação coloca:
Se você deseja realmente manter as alterações localmente, faça uma
--soft
redefinição. O que atualizará o histórico de consolidação da ramificação, mas não alterará nenhum arquivo no diretório ativo (e você poderá confirmá-los).Rebase
Você pode reproduzir seus commits locais sobre qualquer outro commit / branch usando
git rebase
:Isso invocará o rebase no modo interativo, onde você poderá escolher como aplicar cada confirmação individual que não está no histórico que você está refazendo.
Se as confirmações que você removeu (com
git push -f
) já foram inseridas no histórico local, elas serão listadas como confirmações que serão reaplicadas - elas precisarão ser excluídas como parte da reestruturação ou serão simplesmente incluídas novamente na história para o ramo - e reaparecer no histórico remoto no próximo impulso.Use a ajuda
git command --help
para obter mais detalhes e exemplos de qualquer um dos comandos acima (ou outros).fonte
git reset origin/otherbranch --hard
reset --hard
, ou Opção 2:reset --soft
+rebase
, certo?git reset --soft origin/master
alterará o histórico de confirmação para corresponder as diferenças remotas e de estágio com o remoto que será confirmado . Não haveria necessidade de se refazer nesse cenário (e você seria impedido de fazê-lo por causa das alterações não confirmadas) porque não há diferença no histórico de confirmação. As duas opções são redefinidas ou reformuladas - não uma combinação de ambas. Faça uma pergunta se seu cenário for diferente do que eu respondi aqui.Isso não consertará ramificações que já possuem o código que você não deseja (veja abaixo como fazer isso), mas se elas tivessem puxado alguma ramificação e agora desejam que ela esteja limpa (e não "à frente") origem / alguma ramificação), então você simplesmente:
Nota: Você pode combinar tudo isso colocando && entre eles
Nota2: Florian mencionou isso em um comentário, mas quem lê comentários ao procurar respostas?
Nota 3: Se você tiver galhos contaminados, poderá criar novos com base no novo "galho burro" e apenas a escolha de cereja será confirmada.
Ex:
Agora, o feature-new é o seu ramo sem o comprometimento extra (possivelmente ruim)!
fonte
git checkout -b base-branch origin/base-branch
comgit checkout --track origin/base-branch
Puxe com rebase
Uma atração regular é buscar + mesclar, mas o que você deseja é buscar + rebater. Esta é uma opção com o
pull
comando:fonte