Eu fiz um bom trabalho ("Seu ramo está à frente de 'origem / mestre' em 37 commits".) Que realmente deveria ter entrado em seu próprio ramo e não em master
. Esses commits existem apenas na minha máquina local e não foram enviados origin
, mas a situação é um pouco complicada porque outros desenvolvedores estão pressionando origin/master
e eu fiz essas alterações.
Como passo retroativamente meus 37 commits locais para uma nova ramificação? Com base nos documentos, parece que git rebase --onto my-new-branch master
ou ...origin/master
deveria fazer isso, mas ambos me deram o erro "fatal: precisava de uma única revisão". man git-rebase
não diz nada sobre como fornecer uma revisão rebase
e seus exemplos não o fazem, por isso não tenho idéia de como resolver esse erro.
(Observe que isso não é uma duplicata de Mover trabalho não confirmado existente para uma nova ramificação no Git ou Como mesclar minhas alterações não confirmadas locais em outra ramificação do Git? Pois essas perguntas lidam com alterações não confirmadas na árvore de trabalho local, e não com alterações foi confirmado localmente.)
Respostas:
Isso deve ser bom, já que você não enviou seus commits em nenhum outro lugar ainda, e você pode reescrever o histórico de sua ramificação depois
origin/master
. Primeiro, eu executaria umgit fetch origin
para ter certeza de queorigin/master
está atualizado. Supondo que você esteja atualmentemaster
, você deve ser capaz de:... que irá reproduzir todos os seus commits que não estão em
origin/master
paraorigin/master
. A ação padrão do rebase é ignorar confirmações de mesclagem (por exemplo, aquelas que vocêgit pull
provavelmente introduziu) e tentará aplicar o patch introduzido por cada uma das confirmaçõesorigin/master
. (Talvez seja necessário resolver alguns conflitos ao longo do caminho.) Em seguida, você pode criar sua nova ramificação com base no resultado:... e, em seguida, redefina as
master
costas paraorigin/master
:Ao fazer este tipo de manipulação de ramos com
git branch
,git reset
etc. Acho que é útil para freqüentemente olhar para o gráfico com commitgitk --all
ou uma ferramenta semelhante, apenas para verificar que eu entendo de onde todos os diferentes refs estão apontando.Como alternativa, você pode ter acabado de criar uma ramificação de tópico com base no local onde seu mestre está (
git branch new-work-including-merges
) e, em seguida, redefinirmaster
como acima. No entanto, como o ramo de tópicos incluirá mesclagensorigin/master
e você ainda não efetuou alterações nas alterações, sugiro que você faça uma nova reformulação para que o histórico fique mais organizado. (Além disso, quando você eventualmente mesclar a ramificação do tópico de volta ao mestre, as alterações serão mais óbvias.)fonte
master
; a rebase reescreve amaster
ramificação para que as novas confirmações estejam linearmente em cimaorigin/master
egit branch new-work
cria umanew-work
ramificação apontando na ponta demaster
(a ramificação atual) sem mudar a ramificação atual paranew-work
. Então agoranew-work
contém todos os novos commits. A redefinição move a ramificação atual (estáticamaster
) de volta paraorigin/master
.git reset
várias outras maneiras. Elegit branch new-work
está apenas dizendo "crie um ramo apontando para esse commit enquanto eu permanecer no meu ramo atual (que é mestre nesse caso)". Portanto, não há necessidade de ter um comando que move os commits de mestre para a nova filial - você apenas criar um novo ramo lá e quando você redefinir mestre o novo ramo é deixado onde mestre eraSe você tem um número baixo de confirmações e não se importa se elas são combinadas em um mega-commit, isso funciona bem e não é tão assustador quanto
git rebase
:desestabilizar os arquivos (substitua 1 pelo número de confirmações)
crie uma nova ramificação
adicione as mudanças
fazer um commit
fonte
git log --all --decorate --oneline --graph
.Eu fiquei com o mesmo problema. Eu encontrei a solução mais fácil que eu gostaria de compartilhar.
1) Crie uma nova ramificação com suas alterações.
2) (Opcional) Pressione o novo código da filial no servidor remoto.
3) Finalize a compra para o ramo principal.
4) Redefina o código da ramificação principal com o servidor remoto e remova a confirmação local.
fonte
Mais uma maneira de assumir que branch1 - é ramo com alterações confirmadas branch2 - é ramo desejável
selecione os IDs de confirmação que você precisa mover
Agora reverta confirmações não enviadas da ramificação inicial
fonte
Como alternativa, logo após confirmar com a ramificação errada, execute estas etapas:
git log
git diff {previous to last commit} {latest commit} > your_changes.patch
git reset --hard origin/{your current branch}
git checkout -b {new branch}
git apply your_changes.patch
Eu posso imaginar que existe uma abordagem mais simples para as etapas um e dois.
fonte
A respeito:
git reset
volte para a última confirmação antes de começar a fazer alterações.git pull
para puxar novamente apenas as alterações remotas que você jogou fora com a redefinição.Ou isso explodirá quando você tentar mesclar novamente o ramo?
fonte
Aqui está uma maneira muito mais simples:
Crie uma nova ramificação
Em sua nova ramificação, faça um
git merge master
- isso mesclará as alterações confirmadas (não enviadas) para sua nova ramificaçãoExcluir sua ramificação principal local
git branch -D master
Use em-D
vez de-d
porque deseja forçar a exclusão da ramificação.Basta fazer um
git fetch
no seu ramo principal egit pull
no seu ramo principal para garantir que você tenha o código mais recente da sua equipe.fonte
Uma abordagem mais simples, que eu tenho usado (supondo que você queira mover 4 confirmações):
(Procure no diretório a partir do qual você executou o último comando para os 4
.patch
arquivos)Então:
Na ordem que você quisesse.
fonte
Fazer checkout de uma nova cópia de suas fontes
git clone ........
Faça ramificação da posição desejada
git checkout {position}
git checkout -b {branch-name}
Adicionar repositório remoto
git remote add shared ../{original sources location}.git
Obter fontes remotas
git fetch shared
Fazer checkout da filial desejada
git checkout {branch-name}
Mesclar fontes
git merge shared/{original branch from shared repository}
fonte
Para mim, essa foi a melhor maneira:
git fetch
git branch my-changes
e envie para remotogit master -u upstream-branch remotes/origin/my-changes
git branch master --set-upstream-to remotes/origin/master
fonte