Eu odeio usar git stash
. Ele deveria me deixar colocar o que estou trabalhando de lado e voltar a ele mais tarde, mas existem problemas claros que eu encontrei.
- Escondendo algo e esquecendo-se disso
- Fazer
git stash pop
e obter conflitos de mesclagem + perder a capacidade de tentar novamente
Como resultado, muitas vezes eu simplesmente faço git add .; git commit -am "WIP"
e depois faço git reset HEAD^
quando volto.
Há momentos, porém, em que quero armazenar “ideias de código”. Não os quero no repositório, mas gostaria de poder consultá-los se quiser procurá-los.
A maioria dos comandos em git aceita um argumento -p
: Este argumento mostra as mudanças relacionadas ao comando atual na “forma de patch”.
git show -p
o padrão éHEAD
e, nesse caso, é equivalente agit diff
. Pode ser usado para mostrar qualquer referência válida.git log -p
mostra a história em formato de patchgit diff -p
mostra diferenças entre dois árbitros em formato de patch
Portanto, eles são particularmente úteis quando combinados com git apply
. Este comando pegará um arquivo ou STDIN
e aplicará as mudanças na árvore de trabalho.
Exemplo: imaginei que um bug estava relacionado ao modo como truncamos tabelas com acessórios transacionais. Ele falhou no CI e eu quero voltar e “divergir” disso e tentar bagunçar nossa serialização JSON, mas não quero perder o trabalho caso tenha sido uma boa direção.
git log -1 -p > ~/tmp/project/transactional_fixtures.patch
git reset HEAD^ --hard
# do the work!
Digamos que eu descubra depois de mexer no branch e IC atuais e descubra que realmente queria ir com a direção transactional_fixtures.
git reset REF^ --hard #REF is the common parent of the divergence
cat ~/tmp/project/transactional_fixtures.patch | git apply
Voila! Eu tenho meu (s) commit (s) original (is) de volta para a direção original.
Você pode imaginar que isso seja útil quando estiver preocupado com git stash
. git cmd -p
e git apply
são muito úteis para manter stashes offline fora do repo e poder usá-los mais tarde.