Criar ramificação Git com as alterações atuais

851

Comecei a trabalhar no meu ramo principal pensando que minha tarefa seria fácil. Depois de um tempo, percebi que seria mais trabalhoso e quero fazer todo esse trabalho em um novo ramo.

Como posso criar uma nova ramificação e levar todas essas alterações comigo sem sujar o mestre ?

willcodejavaforfood
fonte
4
Sim, essas são perguntas duplicadas, mas o texto é tão diferente que acho útil manter isso. Observe as palavras-chave aqui: branch current changesvs existing uncommited branch. Qualquer pessoa que fale inglês verá imediatamente que é a mesma, mas os mecanismos de pesquisa provavelmente não. Mantenha essa pergunta.
Scott Biggs

Respostas:

691

Se você ainda não fez nenhum commit, apenas (1: branch) e (3: checkout) seriam suficientes.
Ou, em um comando:git checkout -b newBranch

Conforme mencionado na git resetpágina do manual :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Você fez alguns commits, mas percebe que eles eram prematuros para estar no masterramo " ". Você deseja continuar polindo-os em uma ramificação de tópico, " topic/wip" portanto, crie ramificações fora da atual HEAD.
  2. Rebobine o masterramo para se livrar desses três commits.
  3. Mude para o topic/wipramo " " e continue trabalhando.

Nota: devido ao efeito "destrutivo" de um git reset --hardcomando (redefine o índice e a árvore de trabalho. Quaisquer alterações nos arquivos rastreados na árvore de trabalho desde que <commit>são descartadas), eu preferiria:

$ git reset --soft HEAD~3  # (2)

Isso garantiria que eu não estivesse perdendo nenhum arquivo privado (não adicionado ao índice).
A --softopção não toca no arquivo de índice nem na árvore de trabalho (mas redefine o cabeçalho para <commit>, assim como todos os modos).


Com o Git 2.23+ , o novo comandogit switch criaria a ramificação em uma linha (com o mesmo tipo reset --hard, portanto, tenha cuidado com seu efeito):

git switch -f -c topic/wip HEAD~3
VonC
fonte
6
Provavelmente, também vale a pena notar que isso não seria uma boa ideia se você enviasse material de tópico para sua ramificação principal em um repositório de onde outras pessoas extraem. Ou pelo menos, se você precisar fazer uma redefinição, precisará dizer às pessoas que é isso que você está fazendo, para que os avisos da próxima atração não sejam um choque.
Andrew Walker
39
Nota para futuros leitores: leia de baixo para cima (ou não deixe de ler a coisa toda). git reset --hardirá alterar suas alterações e, se elas não forem confirmadas, serão irrecuperáveis! Talvez você só precisagit checkout -b …
Conrad Meyer
3
@ConradMeyer Bom argumento. Eu editei a resposta e coloquei a git checkout -bprimeira.
VonC
5
Por que tópico / ramo ?? por que não apenas branchname, existe um motivo especial para essa nomeação? apenas me perguntando.
precisa saber é o seguinte
1
@ É apenas uma convenção de nomenclatura de espaço para nome (uma maneira de classificar facilmente ramificações, usando nomes de ramificações hierárquicas para definir espaços para nome): stackoverflow.com/a/2527436/6309 . Por exemplo, para problemas: randyfay.com/content/… . Você não precisa usar uma hierarquia ao nomear suas ramificações. topic_wipfuncionaria também;)
VonC
269

Como afirmado nesta pergunta: Git: Crie uma ramificação a partir de alterações não marcadas / não confirmadas no master : stash não é necessário.

Apenas use:

git checkout -b topic/newbranch

Qualquer trabalho não confirmado será levado para a nova filial.

Se você tentar pressionar, receberá a seguinte mensagem

fatal: O recurso de ramificação atual / NEWBRANCH não possui ramificação upstream. Para enviar a ramificação atual e definir o controle remoto como upstream, use

git push --set-upstream origin feature/feature/NEWBRANCH

Faça o que foi sugerido para criar a filial remotamente:

git push --set-upstream origin feature/feature/NEWBRANCH

EeKay
fonte
3
Você receberá o erro 'sem ramificação upstream' apenas se enviar por push a nova ramificação, não quando confirmar o novo trabalho.
sam
2
@sam Alterei a resposta de acordo #
Nick Kennedy
73

Siga esses passos:

  1. Crie uma nova ramificação:

    git branch newfeature
    
  2. Fazer checkout da nova filial: (isso não redefinirá seu trabalho.)

    git checkout newfeature
    
  3. Agora comprometa seu trabalho neste novo ramo:

    git commit -s
    

O uso das etapas acima manterá sua ramificação original limpa e você não precisará fazer nenhum 'git reset --hard'.

AvadhP
fonte
3
O que os '-s' fazem na etapa 3?
`
12
@ScottBiggs É desnecessário, mas é uma prática que algumas pessoas seguem. É a abreviação de "--signoff" e adiciona seu nome de usuário ao commit para que futuras pessoas que estão olhando os logs saibam que você aceitou esse commit.
Frank Bryce
5
Resposta de Nice, mas não há necessidade de -sno passo 3.
Mohammed Ali
Aprendi algo novo com o comentário, obrigado @FrankBryce
Kasparov92
30

Como você ainda não fez nenhum commit, você pode salvar todas as suas alterações no stash, criar e alternar para um novo ramo, e depois colocar essas alterações novamente na sua árvore de trabalho:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list
Éter
fonte
9
ou como VonC apontou 'git checkout -b newbranch' e pule o stash
willcodejavaforfood
@ will: Eu estava pensando que a criação de uma nova ramificação substituiria as alterações não confirmadas que você teve, mas, se esse não for o caso, sim, você pode pular o esconderijo.
Éter
1
Eu tentei e funcionou muito bem, git é muito atencioso e não vai substituir quaisquer alterações locais
willcodejavaforfood
2
Suponho que foi um erro de digitação, mas apenas um aviso que git stash pushnão é um comando. Você provavelmente gostaria de usar git stashou git stash save. Se você deseja incluir arquivos não rastreados no stash, use a --include-untrackedopção Da mesma forma, se você deseja incluir arquivos não rastreados e ignorados no stash, use a --addopção.
6
caso você já tenha criado a ramificação, isso é útil.
Certamente
13

Para adicionar novas alterações a uma nova ramificação e enviar para remoto:

git branch branch/name
git checkout branch/name
git push origin branch/name

Muitas vezes, esqueço de adicionar a parte de origem para empurrar e me confundir porque não vejo a nova ramificação / confirmação no bitbucket

Patrick Schaefer
fonte