Existe uma maneira de eu esconder apenas minhas alterações faseadas? O cenário com o qual estou tendo problemas é quando trabalhei em vários bugs em um determinado momento e tive várias alterações sem etapas. Gostaria de poder preparar esses arquivos individualmente, criar meus arquivos .patch e guardá-los até que o código seja aprovado. Dessa forma, quando for aprovado, eu posso esconder minha sessão inteira (atual), exibir o bug e enviar o código.
Estou fazendo isso da maneira errada? Estou entendendo mal como o git pode funcionar de outras maneiras para simplificar meu processo?
Respostas:
Sim, é possível com DOUBLE STASH
git stash --keep-index
. Este comando criará um stash com TODAS as suas alterações (em etapas e não em etapas ), mas deixará as alterações em etapas no seu diretório de trabalho (ainda no estado em etapas).git stash push -m "good stash"
"good stash"
tem SOMENTE encenado arquivos .Agora, se você precisar de arquivos não faseados antes do stash, basta aplicar o primeiro stash ( aquele criado com
--keep-index
) e agora poderá remover os arquivos nos quais você escondeu"good stash"
.Aproveitar
fonte
-u
switch.git stash apply --index
opção. Isso tentará manter seu estado não (faseado). Agora é mais fácil remover as alterações indesejadas da árvore de trabalho.Com o último git, você pode usar a
--patch
opçãoE o git solicitará que cada alteração em seus arquivos seja adicionada ou não ao stash.
Você acabou de responder
y
oun
Alias UPD para DOUBLE STASH :
Agora você pode preparar seus arquivos e executar
git stash-staged
.Como resultado, seus arquivos temporários serão salvos no stash .
Se você não deseja manter os arquivos temporários e deseja movê-los para o stash. Em seguida, você pode adicionar outro alias e executar
git move-staged
:fonte
-u|--include-untracked
opção degit-stash
Fiz um script que esconde apenas o que está sendo preparado no momento e deixa todo o resto. Isso é incrível quando começo a fazer muitas mudanças não relacionadas. Simplesmente prepare o que não está relacionado ao commit desejado e oculte exatamente isso.
(Obrigado a Bartłomiej pelo ponto de partida)
fonte
Aqui está uma linha simples:
E para adicionar uma mensagem simplesmente:
fonte
Para realizar a mesma coisa ...
git commit -m 'temp'
git add .
git stash
git reset HEAD~1
Estrondo. Os arquivos que você não deseja estão escondidos. Os arquivos que você deseja estão prontos para você.
fonte
Nesse cenário, prefiro criar novas ramificações para cada problema. Eu uso um prefixo temp / então eu sei que posso excluir esses ramos mais tarde.
Prepare os arquivos que corrigem o bug1 e os confirma.
Em seguida, você pode escolher os commits das respectivas ramificações conforme necessário e enviar uma solicitação de recebimento.
fonte
Por que você não confirma a alteração para um determinado bug e cria um patch a partir dessa confirmação e de seu predecessor?
Em seguida, para criar os patches apropriados, use
git format-patch
:Isso criará dois arquivos:
0001-fix-bug-123.patch
e0002-fix-bug-321.patch
Ou você pode criar ramificações separadas para cada erro, para mesclar ou refazer as correções individualmente ou até excluí-las, se não derem certo.
fonte
git stash --keep-index
é uma boa solução ... exceto que não funcionou corretamente nos caminhos que foram removidos, corrigidos no Git 2.23 (terceiro trimestre de 2019)Veja commit b932f6a (16 Jul 2019) por Thomas Gummerer (
tgummerer
) .(Incorporado por Junio C Hamano -
gitster
- in commit f8aee85 , 25 de jul de 2019)fonte
Armazenar apenas o índice (alterações em etapas) no Git é mais difícil do que deveria ser. Encontrei a resposta de @ Joe para funcionar bem e transformou uma pequena variação dela nesse alias:
Ele empurra tanto a encenado e mudanças unstaged em um esconderijo temporário, deixando a mudanças encenado sozinho. Em seguida, empurra as alterações faseadas para o esconderijo, que é o esconderijo que queremos manter. Argumentos passados para o alias, como
--message "whatever"
serão adicionados a este comando stash. Por fim, ele exibe o armazenamento temporário para restaurar o estado original e remover o armazenamento temporário e, finalmente, "remove" as alterações armazenadas no diretório ativo por meio de um aplicativo de correção reversa.Para o problema oposto de ocultar apenas as alterações não faseadas (alias
stash-working
), consulte esta resposta .fonte
É absolutamente necessário trabalhar com vários bugs de uma só vez? E por "de uma só vez", quero dizer "ter arquivos editados para vários bugs ao mesmo tempo". Porque, a menos que você precise absolutamente disso, eu trabalharia apenas com um bug de cada vez em seu ambiente. Dessa forma, você pode usar ramificações e rebase locais, o que acho muito mais fácil do que gerenciar um stash / estágio complexo.
Digamos que o mestre esteja no commit B. Agora trabalhe no bug # 1.
Agora você está no ramo bug1. Faça algumas alterações, confirme, aguarde a revisão do código. Como é local, você não está afetando ninguém, e deve ser fácil fazer um patch a partir do git diffs.
Agora você está trabalhando no bug2. Ir para trás a principal com
git checkout master
. Faça um novo ramogit checkout -b bug2
. Faça alterações, confirme, aguarde a revisão do código.Vamos fingir que alguém comete E & F no mestre enquanto você está aguardando a revisão.
Quando seu código for aprovado, você poderá refazê-lo novamente para dominar com as seguintes etapas:
Isso resultará no seguinte:
Em seguida, você pode pressionar, excluir seu ramo bug1 local e pronto. Um bug de cada vez no seu espaço de trabalho, mas com o uso de ramificações locais, seu repositório pode lidar com vários bugs. E isso evita uma dança de palco / stash complicada.
Responda à pergunta de ctote nos comentários:
Bem, você pode voltar ao esconderijo para cada bug e trabalhar apenas com um bug por vez. Pelo menos, você economiza o problema de preparação. Mas, tendo tentado isso, acho pessoalmente problemático. Os stashes são um pouco confusos em um gráfico de log do git. E o mais importante, se você estragar alguma coisa, não pode reverter. Se você tem um diretório de trabalho sujo e abre um stash, não pode "desfazer" esse pop. É muito mais difícil estragar confirmações já existentes.
Então
git rebase -i
.Ao refazer uma ramificação para outra, você pode fazer isso de maneira interativa (o sinalizador -i). Ao fazer isso, você tem a opção de escolher o que deseja fazer com cada confirmação. O Pro Git é um livro incrível, que também está online no formato HTML e tem uma boa seção sobre rebasing e squash:
http://git-scm.com/book/ch6-4.html
Vou roubar seu exemplo literalmente por conveniência. Finja que você tem o seguinte histórico de consolidação e deseja rebase e squash bug1 no master:
Aqui está o que você verá quando digitar
git rebase -i master bug1
Para compactar todas as confirmações de uma ramificação em uma única confirmação, mantenha a primeira confirmação como "pick" e substitua todas as entradas "pick" subsequentes por "squash" ou simplesmente "s". Você também terá a oportunidade de alterar a mensagem de confirmação.
Então, sim, esmagar é um pouco doloroso, mas eu ainda o recomendaria sobre o uso pesado de esconderijos.
fonte
git checkout master; git checkout -b bug2
pode ser reduzido paragit checkout -b bug2 master
. O mesmo se aplicagit checkout bug1; git rebase master; git checkout master; git merge bug1
, que é idêntico aogit rebase master bug1; git push . bug1:master
(concedida, opush
truque não é óbvio)Dos seus comentários à resposta de Mike Monkiewicz, sugiro usar um modelo mais simples: use ramos de desenvolvimento regulares, mas use a opção squash da mesclagem para obter um único commit em seu ramo mestre:
A vantagem deste procedimento é que você pode usar o fluxo de trabalho normal do git.
fonte
Depois de criar um alias:
Aqui
git diff
retorna lista de--staged
arquivos--name-only
e, em seguida, passamos esta lista como
pathspec
agit stash
commad.De
man git stash
:fonte
Para remover uma alteração acidental, especialmente a exclusão de vários arquivos, faça o seguinte:
em outras palavras, esconda a porcaria e jogue-a fora com a ocultação.
Testado na versão 2.17.1 do git
fonte