Como posso fazer o seguinte no Git?
Minha filial atual é branch1 e fiz algumas alterações locais. No entanto, agora percebo que realmente pretendia aplicar essas alterações ao branch2. Existe uma maneira de aplicar / mesclar essas alterações para que elas se tornem alterações locais na filial2 sem as comprometer na filial1?
Respostas:
Como seus arquivos ainda não foram confirmados em
branch1
:ou
Como comentado por benjohn (consulte a
git stash
página do manual ):fonte
-u
, então:git stash -u
.Esconderijo, confirmações temporárias e rebarbas podem ser um exagero. Se você ainda não adicionou os arquivos alterados ao índice, poderá fazer o checkout da outra ramificação.
Isso funcionará desde que nenhum arquivo que você esteja editando seja diferente entre branch1 e branch2. Isso deixará você no branch2 com as alterações de trabalho preservadas. Se eles forem diferentes, você poderá especificar que deseja mesclar suas alterações locais com as alterações introduzidas alternando ramificações com a
-m
opção de checkout.Se você adicionou alterações ao índice, desfaça essas alterações primeiro com uma redefinição. (Isso preservará sua cópia de trabalho, apenas removerá as alterações em etapas.)
fonte
checkout -m
não for "seguro" em alguma situação (talvez cause um conflito de mesclagem), o stash forneceria alguma vantagem (por exemplo, você pode soltar um stash pop)?.orig
?Uma alternativa mais curta à abordagem de stash mencionada anteriormente seria:
git stash
git stash branch new_branch_name
Então apenas
add
ecommit
as alterações para este novo ramo.fonte
AVISO: Não para iniciantes do git.
Isso aparece o suficiente no meu fluxo de trabalho que quase tentei escrever um novo comando git para ele. O
git stash
fluxo usual é o caminho a seguir, mas é um pouco estranho. Eu costumo fazer um novo commit primeiro, pois se eu estiver analisando as alterações, todas as informações estarão frescas em minha mente e é melhor começar agit commit
encontrar o que encontrei (geralmente uma correção de bug pertencente ao mestre que eu descobri enquanto trabalhava em um ramo de recursos) imediatamente.Então, como eu consegui isso é assim:
git commit
as alterações imediatamente com uma boa mensagem de confirmação.git reset HEAD~1
para desfazer o commit da ramificação atual.Às vezes mais tarde (de forma assíncrona) ou imediatamente em outra janela do terminal:
cd my-project-master
que é outro WD compartilhando o mesmo.git
git reflog
para encontrar a correção que acabei de fazer.git cherry-pick SHA1
do commit.Opcionalmente (ainda assíncrono), você pode refazer o processo (ou mesclar) sua ramificação de recursos para obter a correção de bugs, geralmente quando você está prestes a enviar um PR e já limpou sua ramificação de recursos e o WD:
cd my-project
qual é o principal WD em que estou trabalhando.git rebase master
para obter as correções.Dessa forma, eu posso continuar trabalhando no recurso sem interrupções e não preciso me preocupar com
git stash
nada ou ter que limpar meu WD antes de umgit checkout
(e depois verificar a ramificação do recurso novamente.) E ainda ter todas as minhas correções para emmaster
vez de escondido no meu ramo de recursos.IMO
git stash
egit checkout
é uma PIA real quando você está trabalhando em um grande recurso.fonte
my-project-master
partilha os mesmos.git
faz soar como ele. Por que nãogit checkout -b bugfixABC; git commit -a; git reset HEAD^ --hard
, então mais tarde (de forma assíncrona), enquanto emmaster
,git cherry-pick <SHA1 of the commit(s) in bugfixABC
? (ou até mesmo, para evitar ter que descobrir o SHA1,git rebase --onto master feature bugfixABC
de onde você está atualmente. O que significa que você pode fazer isso diretamente após ogit reset
exposto acimafeature
.)checkout -m
é apenas melhor.Se fosse sobre alterações confirmadas, você deveria dar uma olhada no git-rebase, mas, como apontado no comentário do VonC, enquanto você está falando sobre alterações locais, o git-stash certamente seria a melhor maneira de fazer isso.
fonte
As respostas dadas até o momento não são ideais, pois exigem muito trabalho desnecessário para resolver conflitos de mesclagem ou fazem muitas suposições que freqüentemente são falsas. É assim que se faz perfeitamente. O link é para o meu próprio site.
Como se comprometer com uma ramificação diferente no git
Você possui alterações não confirmadas nas
my_branch
quais deseja se comprometermaster
, sem confirmar todas as alteraçõesmy_branch
.Exemplo
Explicação
Comece mesclando-se
master
à sua filial, pois você precisará fazer isso de qualquer maneira e agora é o melhor momento para resolver qualquer conflito.A
-u
opção (aka--include-untracked
) emgit stash -u
impede de perder arquivos untracked quando você fazer mais tardegit clean -f -d
dentromaster
.Depois
git checkout master
, é importante que você NÃO o façagit stash pop
, porque precisará desse estoque mais tarde. Se você colocar o esconderijo criado emmy_branch
e depois fazergit stash
emmaster
, você vai causar conflitos de mesclagem desnecessárias quando posteriormente se aplicam que esconderijo nomy_branch
.git reset
desfaz tudo o que resultagit stash apply
. Por exemplo, os arquivos que foram modificados no stash, mas não existem,master
são testados como conflitos "excluídos por nós".git checkout .
egit clean -f -d
descarte tudo o que não foi confirmado: todas as alterações nos arquivos rastreados e todos os arquivos e diretórios não rastreados. Eles já estão salvos no stash e, se deixadosmaster
, causariam conflitos desnecessários de mesclagem ao voltar paramy_branch
.O último
git stash pop
será baseado no originalmy_branch
e, portanto, não causará conflitos de mesclagem. No entanto, se o seu stash contiver arquivos não rastreados que você se comprometeu a dominar, o git reclamará que "Não foi possível restaurar arquivos não rastreados do stash". Para resolver este conflito, excluir esses arquivos de sua árvore de trabalho, em seguidagit stash pop
,git add .
, egit reset
.fonte