Git - trabalhando no ramo errado - como copiar alterações no ramo de tópico existente

333

Eu tenho trabalhado em um projeto, mas infelizmente esqueci de mudar para minha filial e, como tal, tenho trabalhado em master

Como posso copiar o trabalho (3 arquivos) que fiz aqui do master para o meu branch (chamado, por exemplo, branch123 ) sem comprometer o master?

Alex
fonte

Respostas:

540

Parece que tudo que você precisa é o seguinte:

git stash
git checkout branch123
git stash apply

Então você deve voltar ao seu próprio ramo sem tocar no ramo principal.

gnab
fonte
6
ok- eu executei isso, mas quando eu volto para master (git checkout master) e executo o status git, os mesmos arquivos ainda são "modificados" - isso é esperado?
1111 Alex
5
Na verdade, talvez você não precise ocultar se as diferenças entre sua ramificação atual (mestre) e a ramificação de tópico (branch123) não estiverem em nenhum dos arquivos que você modificou localmente. O Git permitirá que você verifique o ramo de tópicos nesse caso.
Cascabel
3
@ Alex: Sim, isso é esperado. Isso não envolve confirmações. stashsalva as modificações locais e as stash applytraz de volta.
Cascabel
6
como posso "me livrar" deles do ramo mestre .. para deixar isso limpo?
Alex
7
git reset --hard HEADe você voltou ao último commit que fez no seu ramo principal.
GNAB
46

A resposta aceita é a mais completa, mas há um caso especial em que você pode simplificar. Se os arquivos que você modificou no diretório de trabalho são idênticos nos dois mastere branch123você pode simplesmente fazer

git checkout branch123

Não há necessidade de esconder nada, pois o comportamento padrão de checkoutNÃO substituir arquivos modificados no diretório de trabalho, para que você não perca nada. (Isso foi mencionado nos comentários primeiro por Cascabel)

Como outras pessoas mencionaram nos comentários, se branch123ainda não existir, você pode fazer

git checkout -b branch123

Com base no que encontrei aqui .

Russel Dirks
fonte
3
Ou, se você deseja criar um novo ramo,git checkout -b newbranch
Phil Mitchell
2
Isso está funcionando melhor para mim do que o stash e é muito mais fácil. Obrigado!
Matthias
31
Não, isso não funciona. O Git mostrará a seguinte mensagem: "confirme suas alterações ou as oculte antes que você possa trocar de ramificação".
precisa saber é o seguinte
11
@DegenSharew: Sim, você está certo em alguns casos, a saber, se os arquivos que você modificou no diretório de trabalho não são idênticos em mastere branch123. Veja minha resposta editada.
Russel Dirks
11
Isso funcionou muito bem para mim. Ainda não tinha um ramo criado, então fiz o seguinte: git checkout -b newbranchname. Minhas mudanças apareceram naquele ramo por conta própria.
dex3703
6

git stash é o que você precisa.

uma explicação completa pode ser encontrada em Git-Tools-Stashing

Roee Gavirel
fonte
0

Como é possível criar uma nova ramificação, mas não é possível fazer check-out de uma ramificação existente enquanto os arquivos foram retirados, encontrei o seguinte truque usando uma ramificação temporária para trabalhar:

Esse cenário funciona pelo menos com o plug-in VS 2015 Git, mas provavelmente funcionaria com qualquer ferramenta git.

  1. faça o checkout e faça alterações nos arquivos no master (ups !, filial errada)
  2. crie uma nova ramificação "temp" (ou qualquer nome não utilizado que você escolher) no mestre. Os arquivos com check-out agora serão retirados em temp e não no master.
  3. o check-in é alterado para temp (o mestre não é tocado)
  4. Agora tudo está registrado e é possível verificar uma ramificação existente. Verifique a ramificação desejada (a ramificação em que eu queria fazer as alterações) 3.5 Git Rebase
  5. mesclar temp ao ramo desejado. Agora as alterações estão na ramificação correta.
  6. exclua o ramo temporário, pois não é mais necessário

EDIT: Descobri que você terá que executar uma rebase (git rebase --onto) da ramificação temporária antes de executar a mesclagem. Caso contrário, as alterações no mestre serão incluídas na mesclagem. Um passo extra 3.5 acima. Veja mais sobre rebase aqui: https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Pasi
fonte
Você poderia elaborar mais sua resposta adicionando um pouco mais de descrição sobre a solução que você fornece?
Abarisone 15/10/2015
Obrigado pelo seu feedback! A solução é bastante simples e segue o mesmo princípio que a solução "stash", exceto que uma ramificação temporária é usada em vez do stash. Este é mais conveniente, pelo menos para os usuários do Visual Studio desde esconderijo não é suportado pelo plugin GIT
Pasi