Eu suspeito que você está confuso aqui porque é fundamentalmente confuso. Para piorar as coisas, todo o nosso / o deles troca de papéis (fica para trás) quando você está fazendo uma nova revisão.
Em última análise, durante uma git merge
, o ramo "nosso" refere-se ao ramo que você está fundindo em :
git checkout merge-into-ours
e o ramo "deles" refere-se ao ramo (único) que você está mesclando:
git merge from-theirs
e aqui "nosso" e "deles" faz algum sentido, pois, embora "deles" é provavelmente seu de qualquer maneira, "deles" não é o que você estava em quando você executou git merge
.
Embora o uso do nome real da ramificação possa ser bem legal, ele se desfaz em casos mais complexos. Por exemplo, em vez do acima, você pode fazer:
git checkout ours
git merge 1234567
onde você está mesclando por commit-ID bruto. Pior, você pode até fazer isso:
git checkout 7777777 # detach HEAD
git merge 1234567 # do a test merge
nesse caso, não há nomes de filiais envolvidos!
Eu acho que é de pouca ajuda aqui, mas, de fato, na gitrevisions
sintaxe , você pode se referir a um caminho individual no índice por número, durante uma mesclagem conflitante
git show :1:README
git show :2:README
git show :3:README
O estágio 1 é o ancestral comum dos arquivos, o estágio 2 é a versão do ramo de destino e o estágio 3 é a versão da qual você está mesclando.
A razão pela qual as noções "nossa" e "deles" são trocadas durante o processo rebase
é que a rebase funciona fazendo uma série de escolhas de cereja, em uma ramificação anônima (modo HEAD desanexado). A ramificação de destino é a ramificação anônima e a ramificação de mesclagem é sua ramificação original (pré-rebase): então "--ours" significa que a rebase anônima está sendo construída enquanto "--theirs" significa "nossa ramificação sendo rebased" .
Quanto à entrada gitattributes: poderia ter um efeito: "nosso" realmente significa "usar o estágio # 2" internamente. Mas, como você observa, ele não está realmente no lugar no momento, portanto não deve ter efeito aqui ... bem, a menos que você o copie na árvore de trabalho antes de começar.
Além disso, a propósito, isso se aplica a todos os usos nossos e deles, mas alguns estão em um nível de arquivo inteiro ( -s ours
para uma estratégia de mesclagem; git checkout --ours
durante um conflito de mesclagem) e alguns são peça por peça ( -X ours
ou -X theirs
durante uma -s recursive
mesclar). O que provavelmente não ajuda com nenhuma confusão.
Eu nunca inventei um nome melhor para eles, no entanto. E: veja a resposta do VonC para outra pergunta, onde git mergetool
introduz ainda mais nomes para eles, chamando-os de "local" e "remoto"!
O ' nosso ' no Git está se referindo ao ramo de trabalho original que possui parte autoritária / canônica da história do git.
O ' deles ' refere-se à versão que contém o trabalho para ser refazida (alterações a serem repetidas na ramificação atual).
Isso pode parecer ter sido trocado por pessoas que não sabem que fazer o rebaseamento (por exemplo
git rebase
) está realmente retendo seu trabalho (que é deles ) para reproduzir a história canônica / principal que é nossa , porque estamos refazendo nossa muda conforme o trabalho de terceiros.A documentação para
git-checkout
foi esclarecida em Git> = 2.5.1 conformef303016
commit :Pois
git-merge
é explicado da seguinte maneira:Além disso, aqui é explicado como usá-los:
Às vezes, pode ser confuso, por exemplo:
git pull origin master
onde-Xours
é o nosso local,-Xtheirs
é o ramo deles (remoto)git pull origin master -r
onde-Xours
é deles (remoto),-Xtheirs
é nossoPortanto, o segundo exemplo é oposto ao primeiro, porque estamos refazendo nossa ramificação em cima da remota, portanto nosso ponto de partida é remoto e nossas alterações são tratadas como externas.
Semelhante para
git merge
estratégias (-X ours
e-X theirs
).fonte
git merge
, masgit pull
egit checkout
como exemplo. Se você gosta de usar esse parâmetrogit merge
, deve usar-X ours
. Você ainda pode usar a--ours
sintaxe paragit checkout
. Esclarei a resposta ainda mais.Sei que isso foi respondido, mas esse problema me confundiu muitas vezes. Criei um pequeno site de referência para me lembrar: https://nitaym.github.io/ourstheirs/
Aqui estão os princípios básicos:
Mescla:
Se você deseja selecionar a versão em
master
:Se você deseja selecionar a versão em
feature
:Rebase:
Se você deseja selecionar a versão em
master
:Se você deseja selecionar a versão em
feature
:(Isso é para arquivos completos, é claro)
fonte
Portanto, se você está no release / 2.5 da filial e mescla o recurso de ramificação / novos botões nele, o conteúdo conforme encontrado na liberação / 2.5 é o que o nosso se refere e o conteúdo conforme encontrado no recurso / novos botões é o que eles se referem para. Durante uma ação de mesclagem, isso é bastante simples.
O único problema para o qual muitas pessoas se enquadram é o caso de rebase . Se você fizer uma nova base em vez de uma mesclagem normal, as funções serão trocadas. Como é isso? Bem, isso é causado apenas pela maneira como o rebaseamento funciona. Pense em rebase para funcionar assim:
Claro, isso não é realmente o que está acontecendo, mas é um modelo de mente legal para mim. E se você olhar para 2 e 3, entenderá por que as funções são trocadas agora. A partir de 2, sua ramificação atual agora é a ramificação do servidor sem nenhuma alteração; portanto, essa é nossa (a ramificação em que você está). As alterações feitas agora estão em um ramo diferente que não é o atual ( BranchX ) e, portanto, essas alterações (apesar de terem sido as alterações que você fez) são delas (o outro ramo usado em sua ação).
Isso significa que, se você mesclar e quiser que suas alterações sempre vencam, você diria ao git para sempre escolher "nosso", mas se você se recuperar e quiser que todas as suas alterações sempre vencam, você diz ao git para sempre escolher "deles".
fonte
Eu sei que isso não explica o significado, mas criei uma pequena imagem, como referência para lembrar qual usar:
Espero que ajude!
PS - Verifique também o link na resposta do Nitay 🙂
fonte
Vou postar meu memorando aqui, porque tenho que voltar aqui novamente.
CENÁRIO 1. Desenvolvedor normal: você é um desenvolvedor que não pode se unir
master
e precisa jogarfeature
apenas com ramificações.Caso 1: o mestre é um rei. Você deseja atualizar sua
feature
ramificação (= rebase paramaster
), porquemaster
contém novas atualizações de dependências e deseja substituir suas alterações modestas.Caso 2: você é um rei. Você deseja refazer sua
feature
ramificação paramaster
alterações. Mas você fez mais do que seus colegas fizeram e deseja usar suas próprias alterações em uma prioridade.IMPORTANTE: Como você pode ver, desenvolvedores normais devem preferir
rebase
e repeti-lo todas as manhãs como exercícios / café.CENÁRIO 2. Sensibilidade de mesclagem: você é líder de equipe e deseja mesclar outras ramificações e enviar um resultado mesclado diretamente para um mestre.
master
é um ramo que você vai mudar.Caso 1: mestre é rei Você deseja mesclar ramificações de terceiros, mas
master
é uma prioridade.feature
é um ramo que seu sénior fez.Caso 2: novas mudanças são o rei Quando seu desenvolvedor sênior lançou um cool
feature
e você deseja sobrescrever o antigo erro nomaster
ramo.LEMBRE-SE: Lembrar à meia-noite qual escolher:
master
éours
SEMPRE. Etheirs
éfeature
isso que eles fizeram.fonte
Do
git checkout
uso:Ao resolver conflitos de mesclagem, você pode fazer
git checkout --theirs some_file
egit checkout --ours some_file
redefinir o arquivo para a versão atual e as versões recebidas, respectivamente.Se você fez
git checkout --ours some_file
ougit checkout --theirs some_file
gostaria de redefinir o arquivo para a versão de mesclagem em três vias, pode fazê-logit checkout --merge some_file
.fonte