Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
- 2.43.2 → 2.45.2 no changes
- 2.43.1
02/09/24
- 2.43.0
11/20/23
- 2.42.1 → 2.42.3 no changes
- 2.42.0
08/21/23
- 2.39.4 → 2.41.2 no changes
- 2.39.3
04/17/23
- 2.38.1 → 2.39.2 no changes
- 2.38.0
10/02/22
- 2.35.1 → 2.37.7 no changes
- 2.35.0
01/24/22
- 2.34.1 → 2.34.8 no changes
- 2.34.0
11/15/21
- 2.33.2 → 2.33.8 no changes
- 2.33.1
10/12/21
- 2.33.0
08/16/21
- 2.30.1 → 2.32.7 no changes
- 2.30.0
12/27/20
- 2.29.1 → 2.29.3 no changes
- 2.29.0
10/19/20
- 2.27.1 → 2.28.1 no changes
- 2.27.0
06/01/20
- 2.25.1 → 2.26.3 no changes
- 2.25.0
01/13/20
- 2.24.1 → 2.24.4 no changes
- 2.24.0
11/04/19
- 2.23.1 → 2.23.4 no changes
- 2.23.0
08/16/19
- 2.22.2 → 2.22.5 no changes
- 2.22.1
08/11/19
- 2.22.0
06/07/19
- 2.20.1 → 2.21.4 no changes
- 2.20.0
12/09/18
- 2.19.1 → 2.19.6 no changes
- 2.19.0
09/10/18
- 2.18.1 → 2.18.5 no changes
- 2.18.0
06/21/18
- 2.17.1 → 2.17.6 no changes
- 2.17.0
04/02/18
- 2.16.6
12/06/19
- 2.15.4
12/06/19
- 2.14.6
12/06/19
- 2.13.7
05/22/18
- 2.12.5
09/22/17
- 2.10.5 → 2.11.4 no changes
- 2.9.5
07/30/17
- 2.8.6
07/30/17
- 2.7.6 no changes
- 2.6.7
05/05/17
- 2.5.6
05/05/17
- 2.4.12
05/05/17
- 2.3.10 no changes
- 2.2.3
09/04/15
- 2.1.4
12/17/14
- 2.0.5
12/17/14
RESUMO
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit] [--no-verify] [-s <estratégia>] [-X <opção-da-estratégia>] [-S[<keyid>]] [--[no-]allow-unrelated-histories] [--[no-]rerere-autoupdate] [-m <msg>] [-F <arquivo>] [<commit>…] [--into-name <ramo>] [<commit>…] git merge (--continue | --abort | --quit)
DESCRIÇÃO
Incorpora as alterações dos commits citados (desde o momento em que os seus históricos divergirem do ramo atual) para dentro do ramo atual. Este comando é utilizado pelo git pull para incorporar as alterações vindos de outro repositório e pode ser utilizado manualmente para mesclar as alterações do outro ramo para um outro.
Suponha que exista o seguinte histórico e o ramo atual seja master
:
A---B---C topic / D---E---F---G master
Em seguida, git merge topic
repetirá as alterações feitas no ramo topic
uma vez que ele divergiu de master
(ou seja,E
) até que o seu commit atual (C
) no topo do master
registrando o resultado num novo commit junto com os nomes de dois commits relacionados numa mensagem log vindo do usuário descrevendo as alterações. Antes que a operação ORIG_HEAD
seja definida no cume do ramo atual (C
).
A---B---C topic / \ D---E---F---G---H master
A segunda sintaxe ("git merge --abort
") só pode ser executada após o resultado da mesclagem apresentar conflitos. O comando git merge abort abortará o processo de mesclagem e tentará reconstruir a condição anterior a mesclagem. No entanto, Caso haja alterações com commits não realizados quando a mesclagem for iniciada (e especialmente caso estas alterações forem modificadas posteriormente após o início da mesclagem), o git merge abort será, em alguns casos, incapaz de reconstruir as alterações originais (pré-mesclagem). Portanto:
Aviso: É desencorajado executar o comando git merge com alterações não-triviais dos commits que não foram feitos é desencorajado: enquanto possível, pode deixá-lo numa condição difícil de sair no caso de haver um conflito.
A terceira sintaxe ("git merge --continue
") só pode ser executada depois que a mesclagem apresentar conflitos.
OPÇÕES
- --commit
- --no-commit
Execute a mesclagem e faça o commit com o resultado. Esta opção pode ser usada para substituir a opção
--no-commit
.Com a opção
--no-commit
, executa a mesclagem e para imediatamente antes de criar a mesclagem de um commit, para dar ao usuário a chance de inspecionar e ajustar ainda mais o resultado da mesclagem antes de fazer o commit.Note that fast-forward updates do not create a merge commit and therefore there is no way to stop those merges with --no-commit. Thus, if you want to ensure your branch is not changed or updated by the merge command, use --no-ff with --no-commit.
- --edit
- -e
- --no-edit
Chame um editor antes de fazer a mesclagem mecânica de um commit bem sucedido para editar ainda mais a mensagem da mesclagem que foi gerada automaticamente, para que o usuário possa explicar e justificar a mesclagem. A opção
--no-edit
pode ser utilizada para aceitar a mensagem que foi gerada automaticamente (em geral isso é desencorajado). A opção--edit
(ou-e
) ainda é útil caso esteja enviando uma mensagem de rascunho com a opção-m
na linha de comando e queira editá-la no editor.Os scripts mais antigos podem depender do comportamento histórico de não permitir que o usuário edite a mensagem do registro log da mesclagem. Eles verão um editor aberto quando executar o
git merge
. Para facilitar o ajuste destes scripts para o comportamento que foi atualizado, a variável de ambienteGIT_MERGE_AUTOEDIT
pode ser definido comono
no início deles.- --cleanup=<modo>
Esta opção determina como a mensagem da mesclagem será limpa antes da confirmação. Para mais detalhes consulte git-commit[1]. Além disso, caso o valor de
scissors
seja dado ao <mode> , oscissors
(tesouras) será anexada aoMERGE_MSG
antes de ser repassada para o mecanismo de commit caso exista mesclagens conflitantes.- --ff
- --no-ff
- --ff-only
Specifies how a merge is handled when the merged-in history is already a descendant of the current history.
--ff
is the default unless merging an annotated (and possibly signed) tag that is not stored in its natural place in therefs/tags/
hierarchy, in which case--no-ff
is assumed.With
--ff
, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When not possible (when the merged-in history is not a descendant of the current history), create a merge commit.Com
--no-ff
, crie um commit da mesclagem em todos os casos, mesmo quando a mesclagem puder ser resolvida como um avanço rápido.With
--ff-only
, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.- -S[<keyid>]
- --gpg-sign[=<keyid>]
- --no-gpg-sign
Assine a mesclagem resultante do commit com o GPG. O argumento
keyid
é opcional e a predefinição retorna para a identidade de quem fez o commit; se utilizado, deve estar anexado a opção sem espaço. A opção--no-gpg-sign
é útil para revogar a variável de configuraçãocommit.gpgSign
e a anterior--gpg-sign
.- --log[=<n>]
- --no-log
Além dos nomes dos ramos, preencha a mensagem do registro log com descrições de uma linha com no máximo <n> commits atuais que estão sendo mesclados. Consulte também git-fmt-merge-msg[1].
Com --no-log, não liste as descrições de uma linha vindas do commits que estão atualmente sendo mescladas.
- --signoff
- --no-signoff
Add a
Signed-off-by
trailer by the committer at the end of the commit log message. The meaning of a signoff depends on the project to which you’re committing. For example, it may certify that the committer has the rights to submit the work under the project’s license or agrees to some contributor representation, such as a Developer Certificate of Origin. (See https://developercertificate.org for the one used by the Linux kernel and Git projects.) Consult the documentation or leadership of the project to which you’re contributing to understand how the signoffs are used in that project.A opção --no-signoff pode ser usada para contra-ordenar uma opção --signoff anterior na linha de comando.
- --stat
- -n
- --no-stat
Exiba um "diffstat" no final da mesclagem. O diffstat também é controlado pela opção da configuração merge.stat.
Com
-n
ou--no-stat
, não mostre o diffstat no final da mesclagem.- --squash
- --no-squash
Produce the working tree and index state as if a real merge happened (except for the merge information), but do not actually make a commit, move the
HEAD
, or record$GIT_DIR/MERGE_HEAD
(to cause the nextgit commit
command to create a merge commit). This allows you to create a single commit on top of the current branch whose effect is the same as merging another branch (or more in case of an octopus).Com a opção
--no-squash
, execute a mesclagem e faça o commit com o resultado. Esta opção pode ser usada para substituir a opção--squash
.Com a opção
--squash
, a opção--commit
não é permitida e irá falhar.- --[no-]verify
By default, the pre-merge and commit-msg hooks are run. When
--no-verify
is given, these are bypassed. See also githooks[5].- -s <estratégia>
- --strategy=<estratégia>
Use the given merge strategy; can be supplied more than once to specify them in the order they should be tried. If there is no
-s
option, a built-in list of strategies is used instead (ort
when merging a single head,octopus
otherwise).- -X <opção>
- --strategy-option=<opção>
Passe a opção específica da estratégia através da estratégia de mesclagem.
- --verify-signatures
- --no-verify-signatures
Verify that the tip commit of the side branch being merged is signed with a valid key, i.e. a key that has a valid uid: in the default trust model, this means the signing key has been signed by a trusted key. If the tip commit of the side branch is not signed with a valid key, the merge is aborted.
- --summary
- --no-summary
É um sinônimos para
--stat
e--no-stat
; estas opções foram descontinuadas e serão removidas no futuro.- -q
- --quiet
Opere em silêncio. Implica no uso da opção
--no-progress
.- -v
- --verbose
Seja loquaz.
- --progress
- --no-progress
Turn progress on/off explicitly. If neither is specified, progress is shown if standard error is connected to a terminal. Note that not all merge strategies may support progress reporting.
- --autostash
- --no-autostash
Automatically create a temporary stash entry before the operation begins, record it in the ref
MERGE_AUTOSTASH
and apply it after the operation ends. This means that you can run the operation on a dirty worktree. However, use with care: the final stash application after a successful merge might result in non-trivial conflicts.By default,
git merge
command refuses to merge histories that do not share a common ancestor. This option can be used to override this safety when merging histories of two projects that started their lives independently. As that is a very rare occasion, no configuration variable to enable this by default exists and will not be added.
- -m <msg>
Defina a mensagem do commit que será utilizada para a mesclagem do commit (no caso de uma ser criada).
Caso
--log
seja utilizado, um atalho dos commits que estão sendo mesclados será anexado à mensagem informada.O comando git fmt-merge-msg pode ser utilizado para informar uma boa predefinição para as invocações automatizadas do comando git merge. A mensagem automatizada pode incluir a descrição da ramificação.
- --into-name <ramo>
Prepare a mensagem predefinida da mesclagem como se fosse uma mesclagem para a ramificação
<ramificação>
em vez do nome da ramificação real para onde a mesclagem for feita.- -F <arquivo>
- --file=<arquivo>
Leia a mensagem de commit que será utilizada para mesclar o commit (no caso de uma ser criada).
Caso
--log
seja utilizado, um atalho dos commits que estão sendo mesclados será anexado à mensagem informada.- --rerere-autoupdate
- --no-rerere-autoupdate
Após o mecanismo rerere reutilizar uma resolução gravada no conflito atual para atualizar os arquivos na árvore de trabalho, permita que ele também atualize o índice com o resultado da resolução. A opção
--no-rerere-autoupdate
é uma boa maneira de verificar novamente o que orerere
fez e também detectar possíveis erros da mesclagem antes de enviar o resultado para o índice com umgit add
separado.
- --overwrite-ignore
- --no-overwrite-ignore
Silently overwrite ignored files from the merge result. Este é o comportamento predefinido. Use
--no-overwrite-ignore
to abort.- --abort
Interrompa o processo atual da resolução de conflitos e tente reconstruir a condição de pré-mesclagem. Caso uma entrada de "autostash" esteja presente, aplique-a à árvore de trabalho.
Caso existam commits que não tenham sido realizados e estejam presentes na árvore de trabalho quando a mesclagem for iniciada, o comando git merge --abort será, em alguns casos, incapaz de reconstruir essas alterações. Portanto, é recomendável sempre fazer o commit ou acumular as suas alterações antes de executar o git merge.
O comando git merge --abort é o equivalente ao git reset --merge quando
MERGE_HEAD
estiver presente ou a menos que oMERGE_AUTOSTASH
também esteja; neste caso, o comando git merge --abort aplica a entrada "stash" na área de trabalho enquanto git reset --merge salvará as alterações acumuladas na lista "stash".- --quit
Não se preocupe com a mesclagem em andamento. Mantenha o índice e a árvore de trabalho como estão. Caso
MERGE_AUTOSTASH
esteja presente, os lançamentos armazenados serão salvos na lista "stash".- --continue
Depois que um git merge for interrompido por causa dos conflitos, é possível concluir a mesclagem executando o comando git merge --continue (consulte a seção "COMO RESOLVER CONFLITOS" abaixo).
- <commit>…
Os commits, geralmente outros cabeçalhos do ramo que serão mesclados na nossa filial. A especificação de mais de um commit criará uma mesclagem com mais de duas origens (carinhosamente chamada de mesclagem polvo (octopus merge)).
Caso nenhum commit seja informado na linha de comando, mescle as ramificações monitoradas remotamente para que a ramificação atual esteja configurada para ser utilizada como sua upstream. Consulte também a seção de configuração desta página do manual.
Quando
FETCH_HEAD
(e nenhum outro commit) for definido, as ramificações registradas no arquivo.git/FETCH_HEAD
através da invocação anterior para mesclagem com o comandogit fetch
, serão mescladas no ramo atual.
VERIFICAÇÕES PRÉVIAS DA MESCLAGEM
Você deve ter o seu próprio trabalho em boas condições e com o commit feito localmente antes de aplicar as alterações externas, para evitar que sejam sobrescritos no caso da existência de conflitos. Consulte também git-stash[1]. Os comandos git pull e git merge ficarão inertes sem fazer nada quando as modificações dos commits que não foram aplicados localmente se sobrepuserem aos arquivos que os comandos git pull/git merge talvez precisem atualizar.
Para evitar o registro de alterações não relacionadas a mesclagem do commit, os comandos git pull e git merge também serão cancelados caso exista alguma alteração registrada no índice em relação ao commit HEAD
. (Podem existir algumas poucas exceções especiais a essa regra dependendo de qual estratégia de mesclagem estiver em uso, no geral, o índice deve corresponder ao HEAD.)
Caso todos os commits sejam antecessores ao HEAD
, então o comando git merge encerrara prematuramente exibindo a mensagem "Já foi atualizado"
MESCLAGEM COM AVANÇO RÁPIDO
Frequentemente, o cabeçalho do ramo atual é um ancestral do commit informado. Este é o caso mais comum especialmente quando invocado a partir do comando git pull: você está monitorando um repositório upstream, não efetuou as alterações locais e agora deseja atualizar para uma revisão upstream mais recente. Nesse caso, não é necessário um novo commit para armazenar o histórico combinado; em vez disso, o HEAD
(junto com o índice) é atualizado para apontar para o commit informado sem criar uma mesclagem extra do commit.
Este comportamento pode ser suprimido ao usar a opção --no-ff
.
MESCLAGEM REAL
Exceto numa mesclagem de avanço rápido (veja acima), as ramificações que serão mescladas devem ser vinculadas através de uma consolidação da mesclagem que tenha ambas como as suas origens.
Uma versão mesclada que reconcilia as alterações de todas as ramificações que serão mescladas, o commit é feito e o seu HEAD
, índice e a árvore de trabalho são atualizados para ela. É possível ter alterações na árvore de trabalho, desde que não se sobreponham; a atualização irá preservá-las.
Quando não é óbvio como reconciliar as alterações, acontece o seguinte:
O indicador do
HEAD
se mantém o mesmo.O "ref" do
MERGE_HEAD
é definido para indicar oHEAD
do outro ramo.Os caminhos que foram mesclados corretamente são atualizados no arquivo do índice e na sua árvore de trabalho.
Para caminhos conflitantes, o arquivo do índice registra até três versões: o estágio 1 armazena a versão do ancestral comum, o estágio 2 do
HEAD
e o estágio 3 deMERGE_HEAD
(você pode inspecionar os estágios comgit ls-files -u
). Os arquivos da árvore de trabalho contêm o resultado da operação de mesclagem, ou seja, os resultados da mesclagem de três vias com marcadores de conflito familiares<<<
===
>>>
.Uma ref especial
AUTO_MERGE
é gravada, apontando para uma árvore correspondente ao conteúdo atual da árvore de trabalho (incluindo os marcadores de conflito para conflitos textuais). Observe que essa referência só é gravada quando a estratégia de mesclagem "ort" é usada (o padrão).Nenhuma outra alteração é feita. Em particular, as alterações locais que você tinha antes de iniciar a mesclagem permanecerão as mesmas e as entradas do índice para elas permanecerão como estavam, ou seja, correspondendo com `HEAD '.
Caso tenha tentado uma mesclagem que resultou em conflitos complexos e queira recomeçar, execute o comando git merge --abort
.
MESCLANDO TAG
Ao mesclar uma tag anotada (e possivelmente assinada), o Git sempre cria a mesclagem de um commit, mesmo que seja possível realizar uma mesclagem de avanço rápido, o modelo da mensagem do commit é preparado com a mensagem da tag. Além disso, caso a tag esteja assinada, a verificação da assinatura será relatada como um comentário no modelo de mensagem. Consulte também git-tag[1].
Quando você deseja apenas integrar-se ao trabalho que leva ao commit que está marcado, por exemplo, sincronizando com um ponto de liberação upstream, talvez você não queira fazer uma consolidação desnecessária da mesclagem.
Neste caso, você pode "desembrulhar" a etiqueta antes de encaminhá-la para o comando git merge
ou passar ao --ff-only
quando você não tiver nenhum trabalho feito por conta própria. por exemplo.
git fetch origin git merge v1.2.3^0 git merge --ff-only v1.2.3
COMO OS CONFLITOS SÃO APRESENTADOS
Durante uma mesclagem, os arquivos da árvore de trabalho são atualizados para refletir o resultado da mesclagem. Entre as alterações feitas no ancestral da versão comum, as que não se sobrepõem (ou seja, você alterou uma área do arquivo enquanto o outro lado deixou a área intacta ou vice-versa) são incorporadas no resultado final, literalmente. Quando os dois lados que fizeram as alterações na mesma área, porém, o Git não pode escolher aleatoriamente um lado sobre o outro e solicita que você o resolva, deixando intacto o que os dois lados fizeram nessa área.
É predefinido que o Git utilize o mesmo estilo que o utilizado pelo programa "merge" (mesclar) do conjunto RCS para apresentar um pedaço conflitante, como este:
Aqui estão as linhas que não são alteradas em relação ao ancestral comum ou resolvido de maneira limpa porque apenas um lado foi alterado ou foi resolvido de forma limpa porque ambos os lados foram igualmente alterados. <<<<<<< yours:sample.txt A resolução de conflitos é difícil; vamos às compras. ======= O Git facilita a resolução de conflitos. >>>>>>> theirs:sample.txt E aqui está outra linha que foi claramente resolvida ou não foi modificada.
A área onde ocorreu um para de alterações conflitantes é marcada com os marcadores <<<<<<<
, =======
e >>>>>>>
. A parte anterior ao =======
é tipicamente do seu lado e a parte posterior é tipicamente do lado deles.
O formato predefinido não exibe o que o original disse na área conflitante. Você não pode dizer quantas linhas foram excluídas e substituídas através das observações do seu lado. A única coisa que é possível dizer é que o seu lado quer dizer que é difícil e você prefere ir às compras, enquanto o outro lado quer dizer que é fácil.
Um estilo alternativo pode ser utilizado ao definir a variável de configuração "merge.conflictStyle" para "diff3" ou "zdiff3". No estilo "diff3", o conflito acima pode ser assim:
Aqui estão as linhas que não são alteradas em relação ao ancestral comum ou foi resolvido de maneira limpa porque apenas um lado foi alterado. <<<<<<< seu:sample.txt ou resolvidos de forma limpa porque ambos os lados foram alterados igualmente. A resolução de conflitos é difícil; vamos às compras. ||||||| base:sample.txt ou resolvidos de forma limpa porque ambos os lados foram igualmente alterados. A resolução de conflitos é difícil. ======= ou resolvidos de forma limpa porque ambos os lados foram alterados igualmente. O git facilita a resolução de conflitos. >>>>>>> deles:sample.txt E aqui está outra linha que foi resolvida ou não foi modificada.
enquanto no estilo "zdiff3", por ficar assim:
Aqui estão as linhas que não são alteradas a partir do ancestral comum ou foi resolvido de maneira limpa porque apenas um lado foi alterado, ou foi resolvido de maneira limpa porque apenas um lado foi alterado. <<<<<<< seu:sample.txt A resolução de conflitos é difícil; vamos às compras. ||||||| base:sample.txt ou resolvidos de forma limpa porque ambos os lados foram igualmente alterados. A resolução de conflitos é difícil; ======= O Git facilita a resolução de conflitos. >>>>>>> deles:sample.txt E aqui está outra linha que foi claramente resolvida ou não foi modificada.
Além dos marcadores <<<<<<<
, =======
e >>>>>>>
, ele utiliza outro marcador `|||||||
que é seguido pelo texto original. Você pode dizer que o original acabou de declarar um fato e o seu lado simplesmente cedeu a essa afirmação e desistiu, enquanto o outro lado tentou ter uma atitude mais positiva. Às vezes, você pode ter uma resolução melhor visualizando o original.
COMO RESOLVER OS CONFLITOS
Após encontrar um conflito, você pode fazer duas coisas:
Decida não fazer a mesclagem. As únicas limpezas necessárias são para redefinir o arquivo no índice para o commit
HEAD
para que 2 seja revertido. e para limpar as alterações na árvore de trabalho feitas por 2. e o 3 .; Ogit merge --abort
pode ser utilizado para isso.Resolva os conflitos. O Git marcará os conflitos na árvore de trabalho. Edite os arquivos em ordem e comando git add adiciona eles ao índice. Utilize o comando git commit ou git merge --continue para selar o acordo. O último comando verifica a existência de uma mesclagem (interrompida) em andamento antes de chamar o comando git commit.
Você pode trabalhar o conflito com uma quantidade de ferramentas:
Utilize uma ferramenta de mesclagem "mergetool".
git mergetool
para iniciar uma interface gráfica para lhe auxiliar no processo de mesclagem.Olhando os diffs. O
git diff
mostrará um diff de três vias, destacando as alterações das versõesHEAD
eMERGE_HEAD
. Ogit diff AUTO_MERGE
mostrará as alterações que você fez até o momento para resolver os conflitos textuais.Veja as diferenças de cada ramo. O comando
git log --merge -p <caminho>
exibirá as diferenças primeiro para a versãoHEAD
e depois para a versãoMERGE_HEAD
.Consulte os originais. O comando
git show :1:filename
exibe o ancestral comum,git show :2:filename
exibe a versão doHEAD
e ogit show :3:filename
exibe a versão doMERGE_HEAD
.
EXEMPLOS
Mescla as ramificações
fixes
eenhancements
no cume do ramo atual, fazendo um conjunto de mesclagens:$ git merge fixes enhancements
Mescle o ramo
obsolete
(obsoleto) no ramo atual, utilizando anossa
estratégia de mesclagem:$ git merge -s ours obsolete
Mescla o ramo
maint
no ramo atual, porém não faça um novo commit de forma automática:$ git merge --no-commit maint
Isso pode ser utilizado quando você queira incluir outras alterações na mesclagem ou se deseja, grave a sua própria mensagem do commit na mesclagem.
Você deve evitar abusar dessa opção para ocultar as alterações substanciais numa mesclagem do commit. Pequenos reparos, como o nome da versão/revisão são aceitáveis.
ESTRATÉGIAS DE MESCLAGEM
O mecanismo da mesclagem (comandos git merge
e git pull
) permite que as estruturas das estratégias de mesclagem sejam escolhidas com a opção -s
. Algumas estratégias também podem ter suas próprias opções, que podem ser passadas usando -X<opção>
como argumentos para o comando git merge
e/ou git pull
.
- ort
Isso é a estratégia predefinida ao obter o mesclar um ramo. Esta estratégia pode resolver apenas duas cabeças usando o algoritmo da mesclagem de 3 vias. Quando há mais de um ancestral comum que pode ser usado para a mesclagem de 3 vias, ele cria uma árvore mesclada dos ancestrais comuns e o usa como a árvore de referência para a mesclagem de 3 vias. Foi informado que isso resulta em menos conflitos durante mesclagem sem causar distorções pelos testes feitos nas mesclagens reais dos commits, retiradas do histórico de desenvolvimento do Linux kernel 2.6. Além disso, essa estratégia pode detectar e manipular as mesclagens envolvendo renomeações, não faz uso das cópias detectadas. O nome para este algoritmo é uma sigla de ("Ostensibly Recursive’s Twin") ele foi escrito como um substituto para o algoritmo padrão anterior, o
recursive
.A estratégia ort pode adotar as seguintes opções:
- ours
Esta opção impõem que os pedaços conflitantes que sejam resolvidos de forma automática e de maneira limpa, favorecendo a nossa versão. As alterações vindos de outra árvore que não conflitam com o nosso lado são refletidas no resultado da mesclagem. Para um arquivo binário, todo o conteúdo é retirado do nosso lado.
Isso não deve ser confundido com a estratégia da nossa de mesclagem, que sequer olha para o que a outra árvore contém. Descarta tudo o que a outra árvore fez, declarando que o nosso histórico contém tudo o que aconteceu nela.
- theirs
Este é o oposto do nosso; observe que, diferentemente do nosso, não existe uma estratégia de mesclagem deles para confundir esta opção de mesclagem.
- ignore-space-change
- ignore-all-space
- ignore-space-at-eol
- ignore-cr-at-eol
Trata as linhas com o tipo indicado da mudança do espaço como inalterado por uma mesclagem de três vias. As alterações de espaço combinadas com outras alterações em uma linha não são ignoradas. Consulte também git-diff[1]
-b
,-w
,--ignore-space-at-eol
, e--ignore-cr-at-eol
.Caso a versão their (dele) introduzir apenas as alterações de espaço em uma linha, a our (nossa) versão será utilizada;
Caso a our (nossa) versão introduzir alterações nos espaços, porém a versão their (dele) incluir uma alteração substancial, a versão their (dele) será utilizada;
Caso contrário, a mesclagem continuará de forma usual.
- renormalize
Executa uma averiguação e um check-in virtual de três estágios em um arquivo ao resolver uma mesclagem de três vias. Esta opção deve ser utilizada ao mesclar os ramos com diferentes filtros que estejam limpos ou as regras normais para a quebra de linha. Para obter mais detalhes, consulte "Mesclando ramificações com diferentes atributos de check-in/check-out" em gitattributes[5].
- no-renormalize
Desativa a opção
renormalize
. Substitui a variável de configuraçãomerge.renormalize
.- find-renames[=<n>]
Liga a detecção de renomeação, configurando opcionalmente o limite de similaridade. Esta é a predefinição. Isso substitui a configuração da variável merge.renames. Consulte também git-diff[1]
--find-renames
.- rename-threshold=<n>
É um sinônimo obsoleto para
find-renames=<n>
.- subtree[=<caminho>]
Essa opção é uma forma mais avançada da estratégia da subárvore, onde a estratégia adivinha como as duas árvores devem ser deslocadas para coincidirem uma com a outra durante a mesclagem. Em vez disso, o caminho definido é prefixado (ou removido desde o início) para criar a forma das duas árvores que serão coincididas.
- recursive
Isso pode resolver apenas duas cabeças usando o algoritmo da mesclagem de 3 vias. Quando há mais de um ancestral comum que pode ser usado para a mesclagem de 3 vias, ele cria uma árvore mesclada dos ancestrais comuns e o usa como a árvore de referência para a mesclagem de 3 vias. Foi informado que isso resulta em menos conflitos durante mesclagem sem causar distorções pelos testes feitos nas mesclagens reais dos commits, retiradas do histórico de desenvolvimento do Linux kernel 2.6. Adicionalmente, pode detectar e lidar com mesclagens envolvendo renomeações. Não faz uso das cópias que forem detectadas. Esta foi a estratégia padrão para resolver dois heads do Git v0.99.9k até a v2.33.0.
A estratégia recursive (recursiva) tem as mesmas opções que ort. Contudo, existem três opções adicionais que ort ignora (não documentada acima) que são potencialmente úteis com a estratégia recursiva:
- patience
É um sinônimo obsoleto para
diff-algorithm=patience
.- diff-algorithm=[patience|minimal|histogram|myers]
Usa um algoritmo diff diferente durante a mesclagem, pode ajudar a evitar as distorções que ocorrem devido as linhas coincidentes sem importância (como chaves das funções distintas). Consulte também git-diff[1]
--diff-algorithm
. Observe que oort
utiliza especificamente odiff-algorithm=histogram
enquantorecursive
é a predefinição para a configuraçãodiff.algorithm
.- no-renames
Desativa a detecção de renomeação. Isso substitui a variável de configuração
merge.renames
. Consulte tambémgit-diff[1]--no-renames
.
- resolve
Isso só pode resultar em dois cabeçalhos (ou seja, a ramificação atual e uma outra ramificada da que você obteve) utilizando um algoritmo de mesclagem de três vias. Ele tenta detectar cuidadosamente as ambiguidades cruzadas da mesclagem. Ele não lida com renomeações.
- octopus
Isso resolve os casos com mais de dois cabeçalhos, porém se recusa a fazer uma mesclagem complexa que precise de uma resolução manual. Destina-se primeiramente para ser usado para agrupar junto o tópico dos cabeçalhos. Esra é a estratégia de mesclagem predefinida durante a extração ou a mesclagem com mais de um ramo.
- ours
Isso resolve qualquer quantidade dos cabeçalhos, porém a árvore resultante da mesclagem é sempre a do cabeçalho atual do ramo, ignorando efetivamente todas as alterações de todas os outros ramos. Ele deve ser usado para substituir o histórico antigo de desenvolvimento das ramificações laterais. Observe que isso é diferente da opção
-Xours
da estratégia de mesclagem recursiva.- subtree
Esta é uma estratégia
ort
modificada. Ao mesclar as árvores A e B, caso B corresponda a uma subárvore de A, o B será ajustado primeiro para coincidir à estrutura da árvore A, em vez de ler as árvores no mesmo nível. Esse ajuste também é feito na árvore ancestral comum.
Com as estratégias que usma a mesclagem de 3 vias (incluindo a predefinição, ort), caso uma alteração seja feita em ambas as ramificações, porém depois revertida em uma das ramificações, essa alteração estará presente no resultado mesclado; algumas pessoas acham este comportamento confuso. Isso ocorre porque apenas os cabeçalhos e a base da mesclagem são consideradas ao fazer uma mesclagem, e não os commits individuais. Portanto, o algoritmo da mesclagem considera a alteração revertida como nenhuma alteração e substitui a versão alterada.
CONFIGURAÇÃO
Warning | Missing See original version for this content. |
Warning | Missing See original version for this content. |
GIT
Parte do conjunto git[1]