Eu tenho alguns arquivos locais, puxo da ramificação remota e há conflitos. Sei que gostaria de manter minhas alterações locais e ignorar as alterações remotas que causam conflitos. Existe um comando que eu possa usar para dizer "marcar todos os conflitos como resolvidos, usar local"?
git
merge
conflict
git-merge-conflict
Tom DeMille
fonte
fonte
Respostas:
git checkout
tem a--ours
opção de verificar a versão do arquivo que você tinha localmente (ao contrário--theirs
, que é a versão que você puxou). Você pode passar.
paragit checkout
pedir para verificar tudo na árvore. Em seguida, é necessário marcar os conflitos como resolvidos, com os quais você pode fazergit add
e comprometer seu trabalho assim que terminar:Observe
.
ogit checkout
comando. Isso é muito importante e fácil de perder.git checkout
tem dois modos; uma na qual alterna ramificações e outra na qual verifica os arquivos do índice para a cópia de trabalho (algumas vezes, puxando-os para o índice a partir de outra revisão primeiro). A maneira como ele distingue é se você passou um nome de arquivo; se você não passou um nome de arquivo, ele tenta alternar ramificações (embora, se você não passar uma ramificação, apenas tentará verificar a ramificação atual novamente), mas se recusa a fazê-lo se houver arquivos modificados que isso afetaria. Portanto, se você quiser um comportamento que substitua os arquivos existentes, precisará passar.
um nome de arquivo ou um nome de arquivo para obter o segundo comportamentogit checkout
.Também é um bom hábito ter, ao passar um nome de arquivo, para compensá-lo
--
, comogit checkout --ours -- <filename>
. Se você não fizer isso, e o nome do arquivo coincidir com o nome de uma ramificação ou marca, o Git pensará que você deseja verificar essa revisão, em vez de verificar o nome do arquivo, e use a primeira forma docheckout
comando .Vou expandir um pouco sobre como os conflitos e a fusão funcionam no Git. Quando você mescla o código de outra pessoa (o que também acontece durante um pull; um pull é essencialmente uma busca seguida por uma mesclagem), há poucas situações possíveis.
O mais simples é que você está na mesma revisão. Nesse caso, você "já está atualizado" e nada acontece.
Outra possibilidade é que a revisão deles seja simplesmente uma descendente sua; nesse caso, você terá, por padrão, uma "mesclagem de avanço rápido", na qual você
HEAD
será atualizado apenas para o commit deles, sem que ocorra uma fusão (isso pode ser desativado se você realmente deseja gravar uma mesclagem usando--no-ff
).Então você entra nas situações em que você realmente precisa mesclar duas revisões. Nesse caso, existem dois resultados possíveis. Uma é que a mesclagem acontece de maneira limpa; todas as alterações estão em arquivos diferentes ou estão nos mesmos arquivos, mas suficientemente afastadas para que ambos os conjuntos de alterações possam ser aplicados sem problemas. Por padrão, quando uma mesclagem limpa acontece, ela é automaticamente confirmada, embora você possa desativá-la
--no-commit
se precisar editá-la antecipadamente (por exemplo, se você renomear a funçãofoo
parabar
e outra pessoa adicionar um novo código que chamafoo
, ela será mesclada corretamente , mas produza uma árvore quebrada; portanto, você pode limpá-la como parte do commit de mesclagem para evitar que haja comprometimentos).A possibilidade final é que haja uma verdadeira fusão e que haja conflitos. Neste caso, o Git fará tanto da fusão, uma vez que pode, e arquivos de produzir com marcadores de conflito (
<<<<<<<
,=======
e>>>>>>>
) em sua cópia de trabalho. No índice (também conhecido como "área de preparação"; o local em que os arquivos são armazenadosgit add
antes de enviá-los), você terá 3 versões de cada arquivo com conflitos; existe a versão original do arquivo do ancestral dos dois ramos que você está mesclando, a versão deHEAD
(seu lado da mesclagem) e a versão do ramo remoto.Para resolver o conflito, você pode editar o arquivo que está na sua cópia de trabalho, removendo os marcadores de conflito e corrigindo o código para que funcione. Ou, você pode conferir a versão de um ou dos outros lados da mesclagem, usando
git checkout --ours
ougit checkout --theirs
. Depois de colocar o arquivo no estado desejado, você indica que terminou de mesclar o arquivo e está pronto para confirmar o usogit add
, e então pode confirmar a mesclagemgit commit
.fonte
git add --all
adiciona todos os arquivos ao repositório, portanto, isso pode adicionar mais arquivos do que o pretendido, a menos que seus.gitignore
padrões estejam em um estado perfeito.git add -u
provavelmente é mais adequado para essa situação, é menos provável que você edite os arquivos rastreados que não deseja adicionar ao resolver uma mesclagem.git checkout --ours .
. O.
é importante; passar um nome de arquivo (nesse caso, o diretório inteiro) seleciona entre dois modos diferentes de operação decheckout
, um que alterna ramificações e outro que move arquivos do índice para a cópia de trabalho. Eu concordo, é muito confuso. Você também pode fazer umgit checkout --ours -- <filename>
check-out de um arquivo individual por vez.Verifique a origem do conflito: se é o resultado de a
git merge
, consulte a resposta de Brian Campbell .Mas se é o resultado de a
git rebase
, para descartar alterações remotas (deles) e usar alterações locais , você teria que fazer um:Consulte " Por que é o significado de‘
ours
’e‘theirs
’revertida" "para ver comoours
etheirs
são trocados durante uma rebase (porque o montante ramo é check-out).fonte