Acabei de me comprometer perfeitamente com o ramo errado. Como faço para desfazer o último commit no meu ramo principal e depois fazer essas mesmas alterações e colocá-las no meu ramo de atualização?
Acabei de me comprometer perfeitamente com o ramo errado. Como faço para desfazer o último commit no meu ramo principal e depois fazer essas mesmas alterações e colocá-las no meu ramo de atualização?
Respostas:
Se você ainda não enviou suas alterações, também pode fazer uma redefinição suave:
git reset --soft HEAD^
Isso reverterá a confirmação, mas colocará as alterações confirmadas novamente em seu índice. Supondo que as ramificações estejam relativamente atualizadas uma com a outra, o git permitirá que você faça uma verificação geral na outra ramificação, com a qual você pode simplesmente confirmar:
git checkout branch
git commit
A desvantagem é que você precisa digitar novamente sua mensagem de confirmação.
git reset --soft HEAD\^
4 anos atrasado sobre o assunto, mas isso pode ser útil para alguém.
Se você esqueceu de criar uma nova ramificação antes de confirmar e confirmar tudo no mestre, não importa quantas confirmações, a seguinte abordagem é mais fácil:
git stash # skip if all changes are committed
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop # skip if all changes were committed
Agora você tem sua ramificação principal igual a origin/master
e todas as novas confirmações estão ativadas my_feature
. Observe que my_feature
é uma filial local, não remota.
master
e redefinir master
para origin/master
.
origin/master
já está no commit que deseja redefinir! O crédito para a ponta é no entanto esta página: github.com/blog/...
Para reverter uma confirmação (verifique o hash da confirmação na próxima etapa):
git reset --hard HEAD^
Para puxar esse commit para um ramo diferente:
git checkout other-branch
git cherry-pick COMMIT-HASH
Observe também que as alterações não rastreadas e modificadasgit reset --hard
serão eliminadas , por isso, se você tiver as que preferir:
git reset HEAD^
git checkout .
git rev-parse BRANCH_NAME
para pegar o sha.
git reflog show <branch>
!
git stash
antes da reinicialização e uso git stash pop
depois de restaurá-los, por isso não há necessidade de ter medo da --hard
parte
Se você já enviou suas alterações, precisará forçar seu próximo envio após redefinir o HEAD.
git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force
Aviso: uma redefinição física desfaz todas as modificações não confirmadas em sua cópia de trabalho, enquanto um push forçado substitui completamente o estado da ramificação remota pelo estado atual da ramificação local.
Apenas no caso (no Windows (usando a linha de comando do Windows, não o Bash), na verdade são quatro em ^^^^
vez de um, então é
git reset --hard HEAD^^^^
git reset --hard COMMIT_HASH
git push --force
Recentemente, fiz o mesmo, onde acidentalmente cometi uma mudança de mestre, quando deveria ter me comprometido com outro ramo. Mas eu não forcei nada.
Se você acabou de se comprometer com a ramificação errada e não mudou nada desde então, e não enviou o repositório ao repositório, você pode fazer o seguinte:
// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes.
git reset HEAD~1
// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash
// create other-branch (if the other branch doesn't already exist)
git branch other-branch
// checkout the other branch you should have committed to.
git checkout other-branch
// take the temporary commit you created, and apply all of those changes to the new branch.
//This also deletes the temporary commit from the stack of temp commits.
git stash pop
// add the changes you want with git add...
// re-commit your changes onto other-branch
git commit -m "some message..."
NOTA: no exemplo acima, eu estava rebobinando 1 commit com git reset HEAD ~ 1. Mas se você quiser retroceder n commits, poderá fazer o git reset HEAD ~ n.
Além disso, se você acabou se comprometendo com a ramificação errada e também acabou escrevendo um pouco mais de código antes de perceber que se comprometeu com a ramificação errada, você pode usar o git stash para salvar seu trabalho em andamento:
// save the not-ready-to-commit work you're in the middle of
git stash
// rewind n commits
git reset HEAD~n
// stash the committed changes as a single temp commit onto the stack.
git stash
// create other-branch (if it doesn't already exist)
git branch other-branch
// checkout the other branch you should have committed to.
git checkout other-branch
// apply all the committed changes to the new branch
git stash pop
// add the changes you want with git add...
// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."
// pop the changes you were in the middle of and continue coding
git stash pop
NOTA: Eu usei este site como referência https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/
git checkout -b new_branch
partir daí, os commits estavam intactos, apenas foram pressionados e criaram um PR, não ' Não precisa se comprometer novamente.
Portanto, se o seu cenário é que você se comprometeu, master
mas pretende se comprometer another-branch
(que pode ou não já não existir), mas ainda não o fez, isso é muito fácil de corrigir.
// if your branch doesn't exist, then add the -b argument
git checkout -b another-branch
git branch --force master origin/master
Agora todos os seus compromissos master
estarão ativados another-branch
.
Originado com amor em: http://haacked.com/archive/2015/06/06/git-migrate/
another-branch
já existia. Nesse caso, apenas anulou os commits que fiz para dominar e não os colocou another-branch
.
Para elaborar esta resposta, caso você tenha vários commits para mudar, por exemplo, develop
para new_branch
:
git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started
Se, para você, é apenas uma confirmação, existem muitas outras soluções de redefinição mais fáceis disponíveis. Para mim, tive cerca de 10 confirmações feitas acidentalmente em master
vez de, vamos chamá-lo branch_xyz
, e não queria perder o histórico de confirmação.
O que você poderia fazer e o que me salvou estava usando esta resposta como referência, usando um processo de 4 etapas, que é -
master
branch_xyz
master
Aqui estão as etapas acima em detalhes -
Crie uma nova ramificação a partir de master
(onde acidentalmente cometi muitas alterações)
git checkout -b temp_branch_xyz
Nota: -b
flag é usado para criar uma nova ramificação
Apenas para verificar se acertamos, eu faria uma rápida git branch
para garantir que estamos na temp_branch_xyz
ramificação e uma git log
para verificar se acertamos os commits.
Mesclar a ramificação temporária na ramificação originalmente destinada às confirmações, ou seja branch_xyz
.
Primeiro, mude para a ramificação original, ou seja branch_xyz
(você pode precisar git fetch
se não tiver)
git checkout branch_xyz
Nota: Não usando -b
sinalizador
Agora, vamos mesclar a ramificação temporária na ramificação que atualmente efetuamos checkoutbranch_xyz
git merge temp_branch_xyz
Talvez você precise resolver alguns conflitos aqui, se houver. Você pode pressionar (eu faria) ou seguir para as próximas etapas, depois de mesclar com êxito.
Desfazer o acidental compromete-se a master
usar esta resposta como referência, primeiro mude para omaster
git checkout master
desfaça-o de volta para corresponder ao controle remoto (ou a um commit específico, se você quiser)
git reset --hard origin/master
Novamente, eu faria o git log
antes e o depois apenas para garantir que as alterações pretendidas entrassem em vigor.
Apagando as evidências, isso está excluindo a ramificação temporária. Para isso, primeiro você precisa fazer check-out do ramo no qual a temperatura foi mesclada, ou seja, branch_xyz
(se você permanecer master
ativado e executar o comando abaixo, poderá obter um error: The branch 'temp_branch_xyz' is not fully merged
), então vamos
git checkout branch_xyz
e exclua a prova desse acidente
git branch -d temp_branch_xyz
Ai está.
Se o ramo ao qual você deseja aplicar suas alterações já existe ( desenvolvimento do ramo , por exemplo), siga as instruções fornecidas pelo fotanus abaixo e:
git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature
E, obviamente, você pode usar tempbranch ou qualquer outro nome de filial em vez de my_feature, se desejar.
Além disso, se aplicável, adie o pop-stash (aplicar) até depois da mesclagem no ramo de destino.
Para mim, isso foi resolvido revertendo o commit que eu havia enviado e, em seguida, escolhendo o commit para o outro ramo.
git checkout branch_that_had_the_commit_originally
git revert COMMIT-HASH
git checkout branch_that_was_supposed_to_have_the_commit
git cherry pick COMMIT-HASH
Você pode usar git log
para encontrar o hash correto e enviar essas alterações sempre que quiser!