Git mark file as binary options


Git geralmente adivinha corretamente se um blob contém texto ou dados binários examinando o início do conteúdo. No entanto, às vezes você pode querer substituir sua decisão, seja porque um blob contém dados binários mais tarde no arquivo, ou porque o conteúdo, embora tecnicamente composto de caracteres de texto, é opaco para um leitor humano. Por exemplo, muitos arquivos postscript contêm apenas caracteres ascii, mas produzem diffs barulhentos e sem sentido. A maneira mais simples de marcar um arquivo como binário é desmarcar o atributo diff no arquivo. gitattributes: Isso fará com que o git gere arquivos binários diferentes (ou um patch binário, se os patches binários estiverem habilitados) em vez de um padrão regular. Em resumo: especifique - diff em. gitattributes. Após a caixa, o git pode facilmente adicionar arquivos binários ao seu índice e também armazená-los de forma eficiente, a menos que você faça atualizações freqüentes em grandes arquivos não compactáveis. Os problemas começam quando o git precisa gerar diffs e mescla: git não pode gerar diffs significativos ou mesclar arquivos binários de qualquer maneira que possa ter sentido. Então, todas as fusões, rebases ou cherrypicks envolvendo uma alteração em um arquivo binário envolverão que você faça uma resolução de conflito manual nesse arquivo binário. Você precisa decidir se as mudanças do arquivo binário são raras o suficiente para que você possa viver com o trabalho manual extra que eles causam no fluxo de trabalho git normal envolvendo fusões, rebases, cherrypicks. Respondeu Jan 15 11 às 0:21 Eu não conheço nenhuma ferramenta que tente armazenar diffs de arquivos binários para controle de versão, mas vale a pena notar que o Git não faz isso mesmo para arquivos de texto. Git armazena arquivos como blobs, e faz um diff entre eles quando precisa. Se você estiver procurando por fazer controle de versão em algo como documentos do PhotoshopIllustrator, o GridIron Flow pode fazer o truque para você. Se você estiver tentando mantê-los sincronizados entre as máquinas, o Dropbox ou o Rsync podem lidar com isso, mas eles não vão fazer diferenças inteligentes. Respondeu Jan 15 11 às 0: 15DESCRIPÇÃO Este comando atualiza o índice usando o conteúdo atual encontrado na árvore de trabalho, para preparar o conteúdo encenado para o próximo commit. Normalmente, ele adiciona o conteúdo atual dos caminhos existentes como um todo, mas com algumas opções ele também pode ser usado para adicionar conteúdo com apenas uma parte das mudanças feitas nos arquivos da árvore de trabalho aplicados ou remover caminhos que não existem na árvore de trabalho não mais. O índice contém um instantâneo do conteúdo da árvore de trabalho, e é esse instantâneo que é tomado como o conteúdo da próxima confirmação. Assim, depois de fazer qualquer alteração na árvore de trabalho, e antes de executar o comando de confirmação, você deve usar o comando de adicionar para adicionar arquivos novos ou modificados ao índice. Esse comando pode ser executado várias vezes antes de um commit. Somente adiciona o conteúdo do (s) arquivo (s) especificado (s) no momento em que o comando add é executado se desejar mudanças subseqüentes incluídas no próximo commit, então você deve executar git add again para adicionar o novo conteúdo ao índice. O comando git status pode ser usado para obter um resumo dos arquivos que as alterações são encenadas para o próximo commit. O comando git add não irá adicionar arquivos ignorados por padrão. Se algum arquivo ignorado fosse explicitamente especificado na linha de comando, git add falharia com uma lista de arquivos ignorados. Os arquivos ignorados alcançados por recursividade de diretório ou globalização de nome de arquivo executados pelo Git (cite seus globos antes do shell) serão silenciosamente ignorados. O comando git add pode ser usado para adicionar arquivos ignorados com a opção - f (força). Consulte git-commit1 para obter formas alternativas de adicionar conteúdo a um commit. Arquivos para adicionar conteúdo. Fileglobs (por exemplo. c) pode ser dado para adicionar todos os arquivos correspondentes. Além disso, um nome de diretório líder (por exemplo, dir para adicionar dirfile1 e dirfile2) pode ser dado para atualizar o índice para corresponder o estado atual do diretório como um todo (por exemplo, especificar que o dir irá gravar não apenas um arquivo dirfile1 modificado na árvore de trabalho, O arquivo dirfile2 adicionado à árvore de trabalho, mas também um arquivo dirfile3 removido da árvore de trabalho. Note-se que as versões mais antigas do Git usadas para ignorar arquivos removidos usam a opção --no-todas se você deseja adicionar arquivos modificados ou novos, mas ignore os removidos . Don8217t realmente adiciona o (s) arquivo (s), apenas mostre se eles existem e serão ignorados. Permita a adição de arquivos de outra forma ignorados. Adicione conteúdo modificado na árvore de trabalho interativamente ao índice. Os argumentos de caminho opcionais podem ser fornecidos para limitar a operação a um subconjunto Da árvore de trabalho. Consulte o 8220Interactive mode8221 para obter detalhes. Escolha interativamente métodos de patch entre o índice e a árvore de trabalho e adicione-os ao índice. Isso dá ao usuário a chance de rever a diferença antes de adicionar conteúdo modificado S para o índice. Isso efetivamente é executado adicionar - interativo. Mas ignora o menu de comando inicial e salta diretamente para o subcomando de patch. Veja 8220Interactive mode8221 para obter detalhes. Abra o diff versus o índice em um editor e deixe o usuário editá-lo. Depois que o editor foi fechado, ajuste os cabeçalhos do pão e aplique o patch ao índice. A intenção desta opção é escolher e escolher as linhas do patch para aplicar, ou mesmo modificar o conteúdo das linhas a serem encenadas. Isso pode ser mais rápido e mais flexível do que usar o seletor de pedaços interativo. No entanto, é fácil confundir-se e criar um patch que não se aplica ao índice. Veja EDIÇÃO PATCHES abaixo. Atualize o índice exatamente onde já possui uma entrada que corresponde a ltpathspecgt. Isso remove assim como modifica entradas de índice para coincidir com a árvore de trabalho, mas não adiciona novos arquivos. Se nenhum ltpathspecgt for dado quando a opção - u é usada, todos os arquivos rastreados em toda a árvore de trabalho são atualizados (versões antigas do Git usadas para limitar a atualização ao diretório atual e seus subdiretórios). Atualize o índice não apenas onde a árvore de trabalho possui um arquivo que corresponde a ltpathspecgt, mas também onde o índice já possui uma entrada. Isso adiciona, modifica e remove as entradas de índice para coincidir com a árvore de trabalho. Se nenhum ltpathspecgt for dado quando - Uma opção é usada, todos os arquivos em toda a árvore de trabalho são atualizados (versões antigas do Git usadas para limitar a atualização ao diretório atual e seus subdiretórios). Atualize o índice adicionando novos arquivos que são desconhecidos do índice e arquivos modificados na árvore de trabalho, mas ignoram arquivos que foram removidos da árvore de trabalho. Esta opção é uma não-op quando não é usado ltpathspecgt. Esta opção é principalmente para ajudar os usuários que estão acostumados a versões anteriores do Git, cujo git add ltpathspecgt82308203 era um sinônimo para git add --no-all ltpathspecgt82308203, ou seja, arquivos ignorados removidos. Grave apenas o fato de que o caminho será adicionado mais tarde. Uma entrada para o caminho é colocada no índice sem conteúdo. Isso é útil para, entre outras coisas, mostrar o conteúdo não descartado de tais arquivos com git diff e cometá-los com git commit - a. Don8217t adicione o (s) arquivo (s), mas apenas atualize suas informações stat () no índice. Se alguns arquivos não puderam ser adicionados devido a erros indexados, não interrompa a operação, mas continue adicionando os outros. O comando ainda deve sair com status diferente de zero. A variável de configuração add. ignoreErrors pode ser definida como true para tornar este o comportamento padrão. Esta opção só pode ser usada em conjunto com --dry-run. Ao usar esta opção, o usuário pode verificar se algum dos arquivos fornecidos seria ignorado, independentemente de já estarem presentes na árvore de trabalho ou não. Substitua o bit executável dos arquivos adicionados. O bit executável só é alterado no índice, os arquivos no disco são mantidos inalterados. Esta opção pode ser usada para separar as opções de linha de comando da lista de arquivos, (útil quando os nomes dos arquivos podem ser confundidos com opções de linha de comando). Configuração A variável de configuração opcional core. excludesFile indica um caminho para um arquivo contendo padrões de nomes de arquivos para excluir do git-add, semelhante ao GITDIRinfoexclude. Os padrões no arquivo de exclusão são usados ​​além daqueles em infoexclude. Veja gitignore5. Adiciona conteúdo de todos os arquivos. txt no Diretório de documentação e seus subdiretórios: Observe que o asterisco é citado do shell neste exemplo, isso permite que o comando inclua os arquivos dos subdiretórios do diretório de documentação. Considera adicionar conteúdo de todos os scripts git-.sh: porque este exemplo permite que o shell expanda o asterisco (ou seja, você está listando os arquivos explicitamente), ele não considera subdirgit-foo. sh. Modo interativo Quando o comando entra no modo interativo, ele mostra a saída do subcomando de status e, em seguida, entra em seu loop de comando interativo. O loop de comando mostra a lista de subcomandos disponíveis e fornece um prompt O que agora é. Em geral, quando o prompt termina com um único gt. Você pode escolher apenas uma das escolhas dadas e digitar retorno, assim: você também pode dizer s ou sta ou status acima, desde que a escolha seja única. O loop de comando principal possui 6 subcomandos (mais ajuda e saia). Isso mostra a mudança entre HEAD e índice (ou seja, o que será comprometido se você disser git commit) e entre o índice e os arquivos da árvore de trabalho (ou seja, o que você poderia avançar ainda mais antes do git commit usando git add) para cada caminho. Uma saída de amostra parece assim: mostra que foo. png tem diferenças de HEAD (mas isso é binário para que a contagem de linha não possa ser mostrada) e não há diferença entre a cópia indexada e a versão da árvore de trabalho (se a versão da árvore de trabalho também fosse Diferente, binário teria sido mostrado em lugar de nada). O outro arquivo, git-add interactive. perl, tem 403 linhas adicionadas e 35 linhas excluídas se você confirmar o que está no índice, mas o arquivo da árvore de trabalho ainda possui modificações (uma adição e uma exclusão). Isso mostra as informações de status e emite um prompt do Updategtgt. Quando o prompt termina com gtgt duplo. Você pode fazer mais de uma seleção, concatenado com espaço em branco ou vírgula. Também você pode dizer intervalos. Por exemplo. 2-5 7,9 para escolher 2,3,4,5,7,9 da lista. Se o segundo número de um intervalo for omitido, todos os patches restantes serão retirados. Por exemplo. 7- para escolher 7,8,9 da lista. Você pode dizer para escolher tudo. O que você escolheu é então destacado. Assim: Para remover a seleção, prefira a entrada com - como este: Depois de fazer a seleção, responda com uma linha vazia para encenar o conteúdo dos arquivos da árvore de trabalho para caminhos selecionados no índice. Isso tem uma UI muito similar para atualização. E a informação encenada para os caminhos selecionados é revertida para a versão HEAD. Revertir novos caminhos torna-os sem trilhas. Isso tem uma UI muito semelhante para atualizar e reverter. E permite adicionar caminhos não rastreados ao índice. Isso permite que você escolha um caminho de um status como seleção. Depois de escolher o caminho, ele apresenta o diff entre o índice e o arquivo da árvore de trabalho e pergunta se você deseja organizar a mudança de cada pedaço. Você pode selecionar uma das seguintes opções e digitar retorno: depois de decidir o destino de todas as penas, se houver algum pedaço escolhido, o índice é atualizado com os pedaços selecionados. Você pode omitir ter que digitar retornar aqui, definindo a variável de configuração interactive. singleKey como verdadeira. Isso permite que você analise o que será comprometido (ou seja, entre HEAD e índice). EDITANDO PATCHES Invocando git add - e ou selecionando e do seletor interactivo de pedaços, abrirá um patch em seu editor após o lançamento do editor, o resultado será aplicado ao índice. Você é livre para fazer alterações arbitrárias no patch, mas observe que algumas mudanças podem ter resultados confusos ou mesmo resultar em um patch que não pode ser aplicado. Se você deseja abortar a operação inteiramente (ou seja, não há nada de novo no índice), simplesmente exclua todas as linhas do patch. A lista abaixo descreve algumas coisas comuns que você pode ver em um patch e quais operações de edição fazem sentido nelas. O conteúdo adicionado é representado por linhas que começam com 43. Você pode evitar encenação de qualquer linha de adição, excluindo-as. O conteúdo removido é representado pelas linhas que começam com -. Você pode impedir a preparação de sua remoção, convertendo o - para um (espaço). O conteúdo modificado é representado por - linhas (removendo o conteúdo antigo) seguido de 43 linhas (adicionando o conteúdo de substituição). Você pode impedir o teste da modificação convertendo - linhas e removendo 43 linhas. Tenha cuidado de que a modificação de apenas metade do par provavelmente introduzirá alterações confusas no índice. Há também operações mais complexas que podem ser realizadas. Mas cuidado com isso porque o patch é aplicado apenas ao índice e não à árvore de trabalho, a árvore trabalhadora parece desfazer a alteração no índice. Por exemplo, a introdução de uma nova linha no índice que não está em HEAD nem na árvore de trabalho irá encenar a nova linha para confirmação, mas a linha parece ser revertida na árvore de trabalho. Evite usar essas construções, ou faça com extrema cautela. Removendo conteúdo intocado O conteúdo que não difere entre o índice e a árvore de trabalho pode ser mostrado em linhas de contexto, começando com um (espaço). Você pode organizar as linhas de contexto para a remoção, convertendo o espaço em um -. O arquivo da árvore de trabalho resultante aparecerá para re-adicionar o conteúdo. Modificando o conteúdo existente. Também é possível modificar as linhas de contexto, encenando-as para remoção (convertendo para -) e adicionando uma linha 43 com o novo conteúdo. Da mesma forma, pode-se modificar 43 linhas para adições ou modificações existentes. Em todos os casos, a nova modificação aparecerá revertida na árvore de trabalho. Você também pode adicionar novos conteúdos que não existem no patch simplesmente adicionar novas linhas, cada uma começando com 43. A adição aparecerá revertida na árvore de trabalho. Há também várias operações que devem ser evitadas inteiramente, pois tornarão o patch impossível de aplicar: adicionando linhas de contexto () ou remoção (-) excluindo contexto ou remoção de linhas modificando o conteúdo do contexto ou linhas de remoçãoGit Resolução de Conflitos O processo de resolução de conflito In git é ligeiramente diferente para cada comando git. Este tutorial irá acompanhar as principais variações. A página man para git-merge (1) fornece a maioria das informações sobre o processo de resolução de conflitos. Veja as duas seções: COMO OS CONFLITOS SÃO APRESENTADOS e COMO RESOLVER CONFLITOS. No entanto, rebase, am e apply também têm um processo de resolução de conflito que é diferente, mas não está bem documentado. Note, no entanto, que a documentação para o git melhora continuamente, por isso é uma boa idéia lê-lo para ver o que está lá. Quais comandos podem nos dar conflitos Os mergy, claro: Git Version Git está melhorando constantemente. Para referência, a saída dos comandos neste documento foi gerada usando a seguinte versão git: Configuração: merge. conflictstyle diff3 Antes de mergulhar na resolução de conflitos, precisamos dar uma olhada na configuração merge. conflictstyle. Está documentado em git-config (1) juntamente com vários outros fundidos. Configurações que podem ser interessantes para investigar. Merge. conflictstyle tem dois valores possíveis. A fusão é o padrão e isso fornece informações de conflito de dois sentidos em um arquivo conflitante. Diff3 é o outro valor possível, e isso dá informações de conflito de três vias que podem ser muito mais úteis. É um exemplo. Primeiro, vamos com o valor padrão da mesclagem: Isso nos dá marcadores de resolução de conflitos de duas vias que mostram apenas o estado atual de cada ramo: Alternando para diff3: E nós obtivemos marcadores de resolução de conflitos de três vias que incluem o estado original juntamente com O estado atual de cada ramo: o arquivo original antes das alterações teve Olá, Original ... O ramo mestre (HEAD) tem Olá, mudança mestra., E o ramo b1 tem Olá, mudança de ramificação b1. Esse diferencial de três vias pode ser Muito útil para determinar o que realmente mudou, então eu recomendo trabalhar com merge. conflictstyle configurado para diff3. Ainda mais útil é uma ferramenta de intercalação GUI como o kdiff3. Veja git mergetool abaixo para detalhes. Heres o script que eu uso para gerar um conjunto de conflitos para jogar. Git merge é a combinação de todos os comandos de gy de mergy. Mesmo que você use basicamente rebase ou am, é uma boa idéia passar algum tempo a se familiarizar com a forma de resolver conflitos com git merge. Muito do que você aprende aqui irá transferir para os outros comandos de mergy. Basta ter em mente que há diferenças sutis que podem ser bastante irritantes. Dada a configuração descrita em Alguns Conflitos acima, vamos tentar fundir b1 no mestre. É importante notar que a fusão de resultados em uma nova fusão comete que tem dois pais. Portanto, um conflito nesse processo interrompe a criação desse compromisso. Nosso objetivo é resolver os conflitos, organizar (adicionar) os arquivos e completar o commit. Merge nos permite saber que temos alguns conflitos. O status do git pode ser usado a qualquer momento para ver quais caminhos não combinados precisam de resolução de conflitos: note que o git também nos fornece algumas instruções básicas para lidar com a situação: corrija conflitos e execute git commit. Use o git diff para examinar os conflitos em um arquivo: Resolva os Conflitos Neste ponto, podemos editar os arquivos conflitantes e resolver os conflitos manualmente. Se houver um grande número de conflitos, git mergetool e uma ferramenta de mescla GUI como o kdiff3 facilitam as coisas. Veja a seção git mergetool para detalhes. O Git oferece algumas funções simples de resolução de conflitos. Podemos tomar todas as mudanças do ramo que estamos mesclando em mestre usando o checkout - eles: também podemos acompanhar todas as mudanças do mestre usando o checkout --ours: Se a resolução de conflito for desocupada em um arquivo e Queremos começar de novo, check-out - vai desfazer nossas mudanças: não há refazer, então se você passou um tempo considerável trabalhando nos conflitos em um arquivo, pense com atenção antes de fazer isso. Vamos com os deles para hello. txt. Git diff nos permite saber que não há mais conflitos para resolver. Então, vamos adicionar hello. txt ao índice e verificar o status para ver quais arquivos são deixados. Vamos prosseguir e resolver o resto dos conflitos, indo com nossos ou com os nossos. Concluir O estado de Confirmação mostra-nos que não há mais caminhos não unificados (conflitos não resolvidos), para que possamos terminar a mesclagem comprometendo. Abortando uma mesclagem Isso leva você de volta para onde você estava antes de tentar a mesclagem. Tenha muito cuidado com isso, pois perde qualquer trabalho que você tenha feito em sua cópia de trabalho e qualquer coisa que você possa ter encenado no índice. Se você estiver a caminho de uma fusão, isso pode ser um pouco extremo, a menos que você realmente apenas queira perder tudo. Ao lidar com um conflito em git merge: Use git status e git diff para descobrir o que deu errado. Resolva os conflitos por qualquer um dos seguintes métodos: Edite cada arquivo conflitante com seu editor favorito. Git mergetool e uma ferramenta GUI de mesclagem adequada, como o kdiff3. Git checkout - o seu ou o git checkout - o meu git checkout - m para desfazer a resolução de conflitos em arquivos específicos. (SEJA CUIDADOSO) git adicione os arquivos resolvidos. Se as coisas forem mantidas, use git merge - infeliz para começar de novo antes da fusão. (SEJA CUIDADOSO) git compromete-se a terminar e sair do modo de mesclagem. O git mergetool combinado com o kdiff3 fornece uma maneira visual de lidar com conflitos de mesclagem difíceis. Enquanto você tiver o kdiff3 instalado, o git mergetool deve encontrá-lo. Caso contrário, você pode especificar a ferramenta que deseja como uma opção: Ou você pode tornar a configuração persistente: Nota: kdiff3 não é a única opção que você obteve. Mas é um dos melhores. Experimente primeiro, tente os outros e veja o que quero dizer. Eu testei meld para isso, pois é o que eu geralmente uso para diffs. Meld era incapaz de lidar com os conflitos no meu cenário de teste. Também não fez nenhuma fusão para mim. Kdiff3 acabou por ser muito superior à meld. O arquivo mergetool. txt que é produzido pelo script Some Conflicts acima é projetado especificamente para testar os recursos do git mergetool. Depois de executar esse script, tente uma mesclagem e tente o git mergetool. Observe que isso nos levará a resolver conflitos para cada arquivo. Enter e kdiff3 serão lançados. Clique na captura de tela acima para uma versão em tamanho real. No topo são três versões do arquivo. O original (A), o ramo mestre (B) eo ramo b1 (C). Na parte inferior é a versão combinada com os conflitos marcados. Você pode clicar com o botão direito do mouse em conflitos no painel inferior e selecionar a versão que deseja. Com um grande número de conflitos, isso pode ser muito mais rápido do que remover marcadores de resolução de conflitos com um editor. Git mergetool é provavelmente o melhor para conflitos complicados. Se tudo o que você quer fazer é tirar uma ou outra versão por atacado, você pode fazer isso no kdiff3, mas git checkout - os seus (ou - seus) provavelmente são mais rápidos. Observe também que o kdiff3 provavelmente não pode manipular arquivos binários. Para completar a mesclagem, faça as modificações que deseja, toque em Salvar em kdiff3 e saia do kdiff3. Isso fará as alterações e o estágio (adicioná-las) para confirmação. Git mergetool tende a deixar arquivos. orig em torno de. Use o status git para encontrá-los. Você pode excluí-los com segurança. (Git clean pode ser usado para isso, mas tenha cuidado com isso.) Windows Para ajudar o Git a encontrar o kdiff3 no Windows, você precisa adicionar c: Program FilesKDiff3 para sua variável PATH. Eu tive resultados mistos com kdiff3 e Windows. Para projetos de teste simples, parece funcionar bem. Para projetos mais complexos com nomes de diretório longos e letras de unidade substituídas, ele não funcionou. Esteja preparado para problemas. O Rebase é semelhante ao da mesclagem, mas em vez de confirmar, usamos rebase --continue (e às vezes --skip) para finalizar o rebase. Dada a configuração descrita em Alguns Conflitos acima, vamos tentar rebase o ramo b1 no mestre. Rebase nos informa que temos alguns conflitos. O status do git pode ser usado a qualquer momento para ver quais caminhos não combinados precisam de resolução de conflitos: Note que o git nos fornece algumas instruções básicas para lidar com a situação: corrija conflitos e, em seguida, execute o git rebase --continue. (Estas instruções estão faltando o passo (adicionar) no git 1.8.1.) Use o git diff para examinar os conflitos em um arquivo: Resolva os conflitos. Como na mesclagem, podemos editar os arquivos conflitantes e resolver os conflitos manualmente. Se houver um grande número de conflitos, git mergetool e uma ferramenta de mescla GUI como o kdiff3 facilitam as coisas. Enquanto rebasing, o Git oferece algumas funções simples de resolução de conflitos. Podemos tomar todas as mudanças do ramo que estamos rebasing (b1) usando o checkout - theirs. Note-se que isso é para trás do que você poderia esperar, o deles é o que estamos atualmente: também podemos acompanhar todas as mudanças do destino (a montante) do rebase (mestre) usando o checkout --ours: O significado de O deles e o nosso estão atrasados ​​ao rebaixar. Se tivéssemos b1 verificado e nós rebase em mestre, o deles é b1, eo nosso é mestre. (A página do manual para git-checkout menciona que o nosso refere-se ao estágio 2 e o deles se refere ao estágio 3. Não estou certo do que isso significa, mas pode explicar por que eles parecem para trás. Tente git ls-files - u para ver o estágio s .) Se a resolução de conflitos for desocupada em um arquivo e queremos começar de novo, check-out irá desfazer nossas mudanças: Não há refazer, então, se você passou um tempo considerável trabalhando nos conflitos em um arquivo, pense com atenção antes de fazer esta. Vamos com os seus (de b1) para mergetool. txt. Git diff nos permite saber que não há mais conflitos para resolver. Então, podemos organizar (adicionar) o arquivo e continuar. Havia dois compromissos no ramo b1. Nós corrigimos o primeiro e continuamos, e agora git está tentando aplicar o segundo commit para dominar e há mais conflitos para resolver. Neste caso, vamos com os nossos (mestres) que descartarão as mudanças em b1. Desta vez, continue, não funciona. A razão é porque descartamos todas as mudanças neste commit específico do ramo (b1) que está sendo rebased. Então, precisamos deixar saber se realmente queremos jogar todo o compromisso. Basta usar --skip: E o rebase está completo. Abortar um Rebase Use rebase --abort: Isso leva você de volta para onde você estava antes de tentar o rebase. Tenha muito cuidado com isso, pois perde qualquer trabalho que você tenha feito em sua cópia de trabalho e qualquer coisa que você possa ter encenado no índice. Se você estiver parcialmente a meio de um rebase, isso pode ser um pouco extremo, a menos que você realmente simplesmente queira perder tudo. Ao lidar com um conflito no git rebase: Use git status e git diff para descobrir o que deu errado. Resolva os conflitos por qualquer um dos seguintes métodos: Edite cada arquivo conflitante com seu editor favorito. Git checkout - o seu ou git checkout - os seus. Tenha cuidado com o sentido inverso de - seus e --ours quando rebasing. Verifique novamente o arquivo para ter certeza de ter obtido o que você queria. Git checkout - m para desfazer a resolução de conflitos em arquivos específicos. (SEJA CUIDADOSO) git mergetool e uma ferramenta GUI de fusão apropriada como o kdiff3. Git adicione os arquivos resolvidos. Git rebase - continue para continuar o rebase. Git rebase --skip em situações raras quando você decide jogar fora todas as mudanças para um único commit do ramo que está sendo rebaseado. Tenha muito cuidado com pular para garantir que as mudanças não estejam perdidas. Git rebase - abundante para voltar para onde você estava antes do rebase. (CUIDADO) git am -3 é muito semelhante ao rebase. Dada a configuração descrita em Alguns Conflitos acima, vamos gerar arquivos de patch do ramo b1. Agora vamos aplicar os patches no mestre com git am -3. O -3 é importante porque solicita uma fusão de 3 vias. Sem essa opção, os conflitos não aparecerão nos arquivos apropriados. Git diff não mostrará nada. Neste ponto, você pode seguir em frente e editar os arquivos conflitantes e resolver os conflitos manualmente. Se você preferir uma GUI de mesclagem, experimente o git mergetool. Tal como acontece com a fusão e o rebase, você também pode usar o checkout - e os seus - para levar uma versão ou a outra na sua totalidade. Para git am, o significado deles e nosso é lógico. Deles é a versão do patch: enquanto o nosso é o que está no mestre: e você pode usar checkout - m para desfazer qualquer resolução de conflito que você tenha feito em um arquivo. Tenha cuidado porque não há refazer. Vamos com a versão do patch para este commit e continue. O diff não mostra conflitos a serem resolvidos, então adicionamos e deixamos saber que acabamos de resolver conflitos para este patch: Git passa para o próximo patch e encontra mais alguns conflitos. Vamos prosseguir e rejeitar todas as mudanças deste patch e ir com as mudanças no master (nosso). Como com o rebase, nós realmente pedimos para descartar um patch inteiro, então devemos dizer a git que estamos falando sério de ignorar isso. E é isso. Como com o rebase, tenha cuidado com a situação de saltar. Abortando um git am -3 Apenas use am - abort: use sempre -3 com git am para garantir que você obtenha marcadores de conflito. Use git status e git diff para descobrir o que deu errado. Resolva os conflitos por qualquer um dos seguintes métodos: Edite cada arquivo conflitante com seu editor favorito. Git checkout - o seu ou git checkout - os seus. Git checkout - m para desfazer a resolução de conflitos em arquivos específicos. (SEJA CUIDADOSO) git mergetool e uma ferramenta GUI de fusão apropriada como o kdiff3. Git adicione os arquivos resolvidos. Git am - continue a continuar a am. Git am --skip em situações raras quando você decide jogar fora todas as mudanças de um único patch. Tenha muito cuidado com pular para garantir que as mudanças não estejam perdidas. Git am - abort para voltar para onde você estava antes da fusão. (SEJA CUIDADOSO) Essencialmente, você quer evitar se candidatar se puder. Suas habilidades de resolução de conflitos são muito limitadas. Git am -3 é significativamente melhor e deve ser usado sempre que possível. Mas, se você tem um patch que não é compatível com git, esta é provavelmente a sua única escolha. Dada a configuração descrita em Alguns Conflitos acima, vamos gerar um arquivo de patch de b1 contra o mestre. E tente aplicá-lo ao mestre. Não se esqueça de usar - rejeitar tão bem obter arquivos. rej: vamos tentar o status git para descobrir o que aconteceu. Git status nos mostra o arquivo. rej que foi criado. E contém apenas o pedaço que falhou: para recuperar a partir desta, a única opção é de forma alguma aplicar manualmente o pedaço rejeitado. Todo o bom check-out, por exemplo, check-out, etc., não estão disponíveis quando se aplica. Uma vez terminado, você pode simplesmente adicionar e confirmar se deseja manter as mudanças. Aplicar não tem um modo como mesclar e rebase. Abortar git apply Use git reset --hard. Tenha muito cuidado, pois isso perde tudo o que você fez desde o último compromisso com o seu repo (HEAD). Prefiro git am -3 to git apply. Use sempre --rejecer com git aplicar para se certificar de que você obtenha arquivos. rej que mostram o que partes (pedaços) do patch não poderiam ser aplicadas. Use o status git para encontrar os arquivos. rej. Resolva os conflitos examinando os arquivos. rej e o arquivo de destino e fazendo alterações com um editor. Git reset - difícil cancelar a aplicação. (SEJA CUIDADOSO) adicionar e confirmar as alterações conforme apropriado. Provavelmente é melhor evitar conflitos com git stash pop trabalhando em filiais. Mas no caso de você se deparar com conflitos com o pop stash, ela sabe como lidar com isso. Quando colocamos o stash com mudanças conflitantes no master e no stash, obtemos isso: Resolva os Conflitos Como em outras situações de conflito, podemos editar os arquivos conflitantes e resolver os conflitos manualmente. O git mergetool também funciona bem com os conflitos do stash pop. Embora git checkout - nossos e - não funcionam com Stash pop, ainda podemos usar o check-out e especificar a versão que queremos. Se quisermos acompanhar todas as mudanças do master: também podemos acompanhar todas as mudanças no stash para um arquivo: e, se quiser voltar para a versão com conflitos, checkout - m funciona bem. Stash Drop Depois de ter obtido os conflitos resolvidos, você pode remover manualmente as mudanças ocultas do stash com gota git stash. Continue trabalhando O trabalho surgido do stash normalmente é um trabalho em andamento, então, neste momento, você pode continuar trabalhando, no entanto, o status git parecerá um pouco estranho com caminhos não misturados. Se isso incomoda você, você pode adicionar. Apenas certifique-se de adicionar o arquivo novamente se você fizer novas mudanças. Abortando um Stash Pop Para abortar um pop Stash conflitante e jogar fora todo o trabalho que você realizou desde o último commit to master (isso pode ser extremamente perigoso se você tende a fazer muitas mudanças sem se comprometer, então seja muito cuidadoso): isso leva você De volta ao último commit no master. Isso pode ser bastante perigoso. Especialmente se você tiver feito git stash drop. Então, as mudanças ocultas são perdidas. (Na verdade, eles são apenas órfãos e podem ser recuperados enquanto não fizerem gc.) Se você estivesse no meio da resolução de conflitos, isso descarta todo seu trabalho. Ao lidar com um conflito no git stash pop: use o status git e o diff git para descobrir o que deu errado. Resolva os conflitos por qualquer um dos seguintes métodos: Edite cada arquivo conflitante com seu editor favorito. Git mergetool e uma ferramenta GUI de mesclagem adequada, como o kdiff3. Git checkout master - filename para obter a versão principal. Git checkout stash - filename para obter a versão do armazenamento. Git checkout - m para desfazer a resolução de conflitos em arquivos específicos. (CUIDADO) git adicione os arquivos resolvidos (opcional). Git stash drop quando terminar de resolver conflitos para remover as alterações do stash. Se as coisas forem mantidas, use a reposição de git - difícil de começar antes do stash pop. (CUIDADO) Continue trabalhando como de costume. Conflitos e resoluções - Grande artigo básico dos gitguys. Resolução de Conflito no Git - Filme mostrando como usar o git mergetool e a GUI do opendibl para resolver conflitos. Git checkout - m arquivo - Saiba mais sobre como desfazer a resolução de conflitos com git checkout - m arquivo. Esta é uma ótima publicação por um desenvolvedor git. The way he talks about conflict resolution gives you more of a feel for what its all about. Careful examination of the merge section shows some ambiquity WRT whether or not git add is actually required. I think we need to track this down. It might mean that we would need to hand-edit one of the files to see a situation where add is required. Once this is sorted, determine whether this also affects the other sections. Examples for revert and cherry-pick. Or at least a quick summary of which of the big three they are most similar to, and any gotchas to watch out for. Work in git log --merge - p file. It shows the changes from the common point to where you are now. Might be useful in more complex situations. Copyright (C) 2017-2017, Ted Felix Permission is granted to copy, distribute andor modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. See gnu. orglicensesfdl. html for the full text of this license. lt - Back to my software page.

Comments

Popular Posts