Mova o trabalho existente e não confirmado para uma nova ramificação no Git


3126

Comecei a trabalhar em um novo recurso e, depois de codificar um pouco, decidi que esse recurso deveria estar em seu próprio ramo.

Como mover as alterações não confirmadas existentes para uma nova ramificação e redefinir a atual?

Quero redefinir minha ramificação atual, preservando o trabalho existente no novo recurso.


O mesmo assunto interessante stackoverflow.com/q/556923/269514 ?
Gilberto

Respostas:


3642

Use o seguinte:

git checkout -b <new-branch>

Isso deixará sua ramificação atual como está, criará e retirará uma nova ramificação e manterá todas as suas alterações. Em seguida, você pode preparar alterações nos arquivos para confirmar:

git add <files>

e comprometa-se com seu novo ramo com:

git commit -m "<Brief description of this commit>"

As alterações no diretório de trabalho e as alterações realizadas no índice ainda não pertencem a nenhuma ramificação . Isso altera a ramificação onde essas modificações terminariam.

Você não redefine sua ramificação original, ela permanece como está. A última confirmação <old-branch>ainda será a mesma. Portanto, você checkout -be depois se compromete.


Atualização 2020 / Git 2.23

O Git 2.23 adiciona o novo switchsubcomando na tentativa de eliminar parte da confusão resultante do uso sobrecarregado de checkout(alternar ramificações, restaurar arquivos, desanexar HEAD etc.)

Começando com esta versão do Git, substitua o comando acima por:

git switch -c <new-branch>

O comportamento é idêntico e permanece inalterado.


15
Só para garantir, preciso confirmar o recurso inacabado ANTES de redefinir minha ramificação original? Ou esses arquivos não confirmados serão preservados, independentemente da confirmação?
Dane O'Connor

192
FYI: alterações no diretório de trabalho e alterações organizadas no índice não pertencem a um ramo. git checkout -b <new branch>altera onde essas alterações terminaria no.
Jakub Narębski

152
Se você já possui uma ramificação e deseja mover suas alterações para a ramificação existente, faça checkout stackoverflow.com/questions/556923/…
Chirantan

14
Se você deseja enviar sua nova ramificação para o repositório remoto: stackoverflow.com/questions/2765421/…
Dewayne

10
@ JDSmith: alterações não confirmadas NÃO pertencem a nenhum ramo. Eles só residem no diretório de trabalho git checkout ./ git reset --hardvai unrecoverably remover -los
knittl

330

Alternativamente:

  1. Salve as alterações atuais em um stash temporário:

    $ git stash

  2. Crie uma nova ramificação com base nesse stash e alterne para a nova ramificação:

    $ git stash branch <new-branch> stash@{0}

Dica: use a tecla Tab para reduzir a digitação do nome do stash.


51
Se o outro ramo já existir, você pode simplesmente mudar para ele com checkout, então git stash apply.
Archonic

6
Não entendo a dica "Dica: use a tecla Tab para reduzir a digitação do nome do esconderijo". "Stash @ {0}" não é o nome? Não consigo executá-lo com sucesso.
Herbert

7
Por que isso é melhor do que a resposta aceita stackoverflow.com/a/1394804/754997 ?
Chris Page

10
Eu não entendo por que isso é melhor do que a resposta aceita degit checkout -b <new branch name>
Noitidart

6
Você não precisa git add -Aantes de guardar.
Vichle

48

Se você fez commits em sua ramificação principal enquanto codificava, mas agora deseja movê-las para uma ramificação diferente, esta é uma maneira rápida:

  1. Copie seu histórico atual para uma nova ramificação, trazendo também alterações não confirmadas:

    git checkout -b <new-feature-branch>
    
  2. Agora force o ramo "bagunçado" original a reverter: (sem mudar para ele)

    git branch -f <previous-branch> <earlier-commit-id>
    

    Por exemplo:

    git branch -f master origin/master
    

    ou se você fez 4 confirmações:

    git branch -f master HEAD~4
    

Aviso: git branch -f master origin/master vai redefinir as informações de rastreamento para esse ramo. Portanto, se você configurou suamasterramificação para enviar para outro lugar que não sejaorigin/master, essa configuração será perdida.

Aviso: Também há um perigo se você se recuperar novamente após a ramificação, descrita aqui . A única maneira de evitar isso é criar uma nova história usando a seleção de cereja. Esse link descreve o método mais seguro e à prova de falhas . Se você tiver alterações não confirmadas, convémgit stashno início egit stash popno final.


6
Isso responde a uma pergunta um pouco diferente do que a operação fez. Decidi colocar esta resposta aqui, porque foi aqui que o Google me trouxe quando eu procurava uma resposta. A questão real que lida com essa situação está aqui .
Joeytwiddle

26

O cenário comum é o seguinte: esqueci de criar o novo ramo para o novo recurso e estava fazendo todo o trabalho no ramo de recursos antigo. Eu enviei todo o trabalho "antigo" para o ramo mestre e quero que meu novo ramo cresça do "mestre". Eu não fiz um único commit do meu novo trabalho. Aqui está a estrutura do ramo: "master" -> "Old_feature"

git stash 
git checkout master
git checkout -b "New_branch"
git stash apply

18

Se você o confirmar, também poderá escolher o ID de confirmação único. Faço isso frequentemente quando começo a trabalhar no master e, em seguida, quero criar uma ramificação local antes de avançar para a minha origem /.

git cherry-pick <commitID>

Há muita coisa que você pode fazer com o cherry-pick, conforme descrito aqui , mas esse pode ser um caso de uso para você.


2
Solução mais agradável para mover alterações parciais para uma nova ramificação ... já que você pode confirmar o que deseja por agora, ocultar todas as outras alterações, verificar a ramificação da qual deseja ramificar, escolher a cereja que confirmar para a nova ramificação, voltar para a ramificação original, redefina novamente um commit e, em seguida, faça um stash pop, adicione, confirme e cante aleluia.
Meredith

1
@ Meredith, haha, ya algo assim. Isso é ótimo, a menos que você planeje suas alterações com antecedência ... e quem faz isso;)
senha

1

Isso pode ser útil para todos os que usam ferramentas para o GIT

Comando

Alternar ramificação - moverá suas alterações para nova ramificação. Então você pode confirmar as alterações.

 $ git checkout -b <new-branch>

TortoiseGIT

Clique com o botão direito do mouse em seu repositório e use TortoiseGit-> Switch / Checkout

insira a descrição da imagem aqui insira a descrição da imagem aqui

SourceTree

Use o botão "Finalizar compra" para alternar entre ramificações. Você verá o botão "checkout" na parte superior depois de clicar em um ramo. As alterações da ramificação atual serão aplicadas automaticamente. Então você pode cometê-los.

insira a descrição da imagem aqui


0

Eu costumava @Robin resposta & listando tudo o que eu fiz,

git status                               <-- review/list uncommitted changes
git stash                                <-- stash uncommitted changes
git stash branch <new-branch> stash@{1}  <-- create a branch from stash
git add .                                <-- add local changes
git status                               <-- review the status; ready to commit
git commit -m "local changes ..."        <-- commit the changes
git branch --list                        <-- see list of branches incl the one created above
git status                               <-- nothing to commit, working tree (new-branch) is clean
git checkout <old-branch>                <-- switch back

! Se o repositório tiver mais de um stash, veja qual deles deve ser aplicado à nova ramificação:

git stash list  
  stash@{0}: WIP on ...  
  stash@{1}: WIP on ...

e inspecionar o estoque individual,

git stash show stash@{1}

Ou inspecione todos os stashes de uma só vez:

git stash list -p

0

Na verdade, existe uma maneira muito fácil de fazer isso com o GitHub Desktop agora que eu não acredito que fosse um recurso antes.

Tudo o que você precisa fazer é mudar para a nova ramificação no GitHub Desktop e solicitará que você deixe as alterações na ramificação atual (que será ocultada) ou traga as alterações com você para a nova ramificação. Basta escolher a segunda opção, para trazer as alterações para o novo ramo. Você pode confirmar como de costume.

Área de trabalho do GitHub

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.