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?

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.


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 .


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


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


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
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.