Como fazer git merge punho alterações não confirmadas para a minha árvore de trabalho?

StackOverflow https://stackoverflow.com/questions/813822

  •  03-07-2019
  •  | 
  •  

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?

Foi útil?

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"
    • 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
      • 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
  • 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
    • 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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top