name - see stash list git




Como resolver git stash conflict without commit? (7)

Como perguntado nesta pergunta , eu também quero saber como resolver um git stash pop conflitante sem adicionar todas as modificações em um commit (assim como "git stash pop" sem um conflito).

Minha abordagem atual é muito legal porque eu faço assim:

git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>

[Update] Uma maneira de reproduzi-lo:

mkdir foo; cd foo; git init
echo "1" > one
echo "2" > two
git add -A; git commit -m "first"
echo "1.1" > one
echo "2.1" > two
git stash
echo "2.2" > two
git commit -a -m "second"
echo "Only this file would stay in HEAD without the conflict" > third
git add third
git stash pop
git status

2016-06-27: Adicionado um novo arquivo chamado 'third' ao exemplo para mostrar que soluções alternativas como a scy só funcionam para HEADs vazios, mas não corrigem o problema inicial de que o HEAD não tenha o mesmo conteúdo como para um git stash pop sem um conflito.


A maneira mais rápida que encontrei é resolver o conflito, então git add -u , e então git reset HEAD , que nem envolve um commit.


De acordo com as perguntas do git stash , após corrigir o conflito, git add <file> é o curso correto de ação.

Foi depois de ler este comentário que entendi que as alterações são automaticamente adicionadas ao índice (por design). É por isso que o git add <file> conclui o processo de resolução de conflitos.


Eu não acho que fazer uma confirmação e, em seguida, redefinir a ramificação para remover essa confirmação e soluções alternativas semelhantes sugeridas em outras respostas são a maneira limpa para resolver esse problema.

A solução a seguir parece ser muito mais limpa para mim e também é sugerida pelo próprio Git - execute o git status no repositório com um conflito:

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

Vamos fazer o que o Git sugere sem fazer nenhum commit:

  1. Manualmente (ou usando alguma ferramenta de mesclagem de GUI) resolve o (s) conflito (s).
  2. Use git reset para marcar o (s) conflito (s) conforme resolvido e desassociar as alterações. Você pode executá-lo sem nenhum parâmetro e o Git removerá tudo do índice. Você não precisa executar o git add antes.
  3. Finalmente, remova o stash com git stash drop , porque o Git não faz isso em conflito.

Assim:

$ git stash pop

# ...manually resolve conflict(s)

$ git reset

$ git stash drop

Nota: adicionar arquivos ao índice depois que um conflito é resolvido é propositalmente. Dessa forma, você pode diferenciar as alterações do stash anterior e das alterações feitas depois que o conflito foi resolvido. Se você não gostar, você sempre pode usar o git reset para remover tudo do índice.

Outra observação: eu recomendo usar qualquer ferramenta de mesclagem de 3 vias para resolver conflitos, por exemplo, o KDiff3 . Geralmente resolve a maioria dos conflitos automaticamente.


Não é a melhor maneira de fazer isso, mas funciona:

$ git stash apply
$ >> resolve your conflict <<
$ >> do what you want to do with your code <<
$ git checkout HEAD -- file/path/to/your/file

Suponha que você tenha este cenário onde você esconde suas alterações para poder puxar da origem. Possivelmente porque suas alterações locais são apenas debug: true em algum arquivo de configurações. Agora você puxa e alguém introduziu uma nova configuração lá, criando um conflito.

git status diz:

# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      src/js/globals.tpl.js
no changes added to commit (use "git add" and/or "git commit -a")

OK. Eu decidi ir com o que o Git sugeriu: eu resolvi o conflito e cometi:

vim src/js/globals.tpl.js
# type type type …
git commit -a -m WIP   # (short for "work in progress")

Agora minha cópia de trabalho está no estado que quero, mas criei um commit que não quero ter. Como me livrar desse commit sem modificar minha cópia de trabalho? Espere, há um comando popular para isso!

git reset HEAD^

Minha cópia de trabalho não foi alterada, mas o WIP commit acabou. Isso é exatamente o que eu queria! (Note que eu não estou usando --soft aqui, porque se houver arquivos auto-mesclados em seu stash, eles são auto-preparados e, portanto, você acabaria com esses arquivos sendo testados novamente após a reset ).

Mas há mais uma coisa: A página man do git stash pop nos lembra que "Aplicar o estado pode falhar com conflitos; nesse caso, ele não é removido da lista de stash. Você precisa resolver os conflitos manualmente e chamar git stash drop manualmente depois ". Então é exatamente isso que fazemos agora:

git stash drop

E feito.


git stash branch will works, que cria um novo branch para você, verifica o commit em que você estava quando você escondeu seu trabalho, reaplica seu trabalho lá e então descarta o stash se ele for aplicado com sucesso. verifique this


git checkout stash -- .

trabalhou para mim.

Observação : isso pode ser perigoso, pois não tenta mesclar as alterações do stash em sua cópia de trabalho, mas substitui -a pelos arquivos ocultos. Então você pode perder suas alterações não confirmadas.





git-stash