Como fazer git merge punho alterações não confirmadas para a minha árvore de trabalho?
Pergunta
Um colega de trabalho e eu estamos tanto trabalho sobre o branch master no momento. Eu tenho algum código em minha árvore de trabalho que eu não quero cometer (depuração declarações e similares). Agora, se ele cometer mudanças para alguns desses mesmos arquivos, não pode juntá-las:
$ git merge origin/master
Updating 1b8c5c6..eb44c23
error: Entry 'blah.java' not uptodate. Cannot merge.
Vindo de um fundo de subversão, eu estou acostumado a ter minha árvore de trabalho automaticamente mescladas quando eu puxar mudanças a partir do repositório e se há conflitos, eu resolvê-los manualmente.
A maneira mais rápida que eu encontrei para fazer isso no git é:
$ git stash
$ git merge origin/master
$ git stash pop
Essencialmente, retirando minhas alterações não confirmadas, fazendo a junção e, em seguida, voltar a aplicar as alterações. Como posso saber mesclagem para mesclar automaticamente minha árvore de trabalho com as mudanças que eu estou tentando puxar?
Solução
Tanto quanto eu posso dizer, o melhor que você pode fazer é o que você já tem com git stash
. Eu também achar estranho que merge quer lidar apenas com árvores limpas.
Outras dicas
Esqueça tudo o que você aprendeu com a subversão.
Sempre cometer antes de introduzir mudanças externas.
Imagine que você tinha uma árvore principalmente-trabalhando - talvez não seja perfeito, mas você está fazendo algum progresso. Então você vai fazer uma mesclagem e o código que você está trazendo o caos apenas causou (era de buggy em si, muitos conflitos para lidar com, etc ...). Não seria bom se você pudesse apenas desfazer isso?
Se você se comprometer, você pode. Se você não fizer isso, você só vai sofrer.
Lembre-se:. O que você cometer não Have para ser o que você empurra, mas o que você não cometer você pode facilmente perder
Apenas fazer a coisa segura e fácil e comprometer cedo e cometer muitas vezes.
- Se o trabalho local é descompromissado
- E você introduziu completamente novos arquivos que não existem no ramo remoto:
- Ou os arquivos afetados por seu trabalho local tem ZERO sobreposição com os arquivos afetados pelas mudanças que você precisa para puxar a partir do controle remoto:
- Você está com sorte:
git pull
irá "apenas trabalho"
- Você está com sorte:
- Caso contrário:
- Se as alterações locais não têm sobreposição com as alterações que estão puxando:
- git stash de vai funcionar:
-
git stash save
-
git pull
-
git stash pop
-
- git stash de vai funcionar:
- Se suas alterações locais têm alguma sobreposição com as alterações que estão puxando:
- git stash de exigirá a resolução de conflitos manual:
-
git stash save
-
git pull
-
git stash pop
- resolver conflitos de mesclagem
-
git reset
-
git stash drop
-
- git stash de exigirá a resolução de conflitos manual:
- Se as alterações locais não têm sobreposição com as alterações que estão puxando:
- Se o trabalho local é comprometido
- E os arquivos afetados por seu trabalho local tem ZERO sobreposição com os arquivos afetados por
- Você está com sorte:
git pull
irá "apenas trabalho" - No entanto:
git pull --rebase
vontade "trabalho ainda melhor" por causa de uma história mais limpa - não há merge commit; suas alterações serão cometidos após as alterações a montante
- Você está com sorte:
- Caso contrário:
- git pull vai exigir a resolução de conflitos manual:
-
git pull
- resolver conflitos de mesclagem
-
git add FILE
Para cada arquivo em conflito -
git commit
-
-
git pull --rebase
ainda podia "trabalho ainda melhor" por causa de uma história mais limpa- No entanto, a resolução de conflitos de mesclagem poderia ser muito mais difícil
- git pull vai exigir a resolução de conflitos manual:
- E os arquivos afetados por seu trabalho local tem ZERO sobreposição com os arquivos afetados por
Para uma explicação detalhada, consulte: https://happygitwithr.com/pull-tricky.html
Você não pode dizer git merge
a mudanças de mesclagem em arquivos que possuem alterações em relação ao seu repositório local. Isso protege-lo de perder suas alterações nesses momentos em que uma fusão vai mal.
Com o CVS e SVN abordagem à fusão, se você fez não copiar manualmente seus arquivos antes da atualização e mexidos-los em merge, você tem que re-editar manualmente para voltar a um estado bom.
Se você quer confirmar as alterações ou armazená-las antes de fazer uma mesclagem, tudo é reversível. Se a integração não correr bem, você pode tentar várias maneiras de fazê-lo funcionar para fora e ir com o que funciona melhor.
Se você confirmar as alterações experimentais ou de depuração, você pode usar git rebase
para movê-los após os commits que você recebe via git merge
para torná-lo mais fácil de se livrar deles ou para evitar a empurrá-los para um repositório acidentalmente.
Note que o uso de git rebase
em um galho de ter empurrado a um repositório compartilhado irá causar sofrimento para todos que está puxando a partir desse repositório.
Eu prefiro usar git stash
nestes casos, mas eu só usá-lo se a fusão muda arquivos que eu editei e não comprometido.