Git merge deixou marcas HEAD em meus arquivos

102

Tentei mesclar um arquivo na linha de comando usando Git, quando uma mensagem de erro apareceu informando que a mesclagem foi abortada.

Eu pensei que era o fim de tudo, mas então percebi que há gitmarks em meus arquivos. Igual a:

start =
    expression

validchar = 
    [0-9a-zA-Z_?!+\-=@#$%^&*/.]

integer = 
<<<<<<< HEAD
    digits:[0-9]+
        { return digits.join(""); }
=======
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages

Os arquivos não foram editados por mim e mostram linhas inseridas com:

  • HEAD após menos de sinais ( <<<<<<< HEAD)
  • linhas de código alterado
  • uma sequência de sinais de igual ( =======)
  • a nova versão do código
  • outra linha começando com sinais de maior que e o nome da ramificação ( >>>>>>> gh-pages)

O pior é que o conteúdo do arquivo não está mais em ordem. Alguém sabe como faço para que esses arquivos voltem ao normal e as alterações que fiz no gh-branch foram mescladas com o branch master?

tecla inferior
fonte

Respostas:

96

Esses são marcadores de conflito . Você ainda está no processo de fusão, mas havia algumas partes que o Git não conseguia fundir automaticamente. Você precisará editar manualmente essas partes para o que deseja que sejam e, em seguida, comprometer os resultados.


Por exemplo, em seu caso particular, você provavelmente desejaria resolver assim (observe - as setas / texto à direita são apenas minhas notas, não algo que você digitaria no arquivo):

integer = 
<<<<<<< HEAD                                  <-+ remove the bits here
    digits:[0-9]+                               |
        { return digits.join(""); }             |
=======                                       <-+
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages                              <-- and this

e assim você salvaria o arquivo como ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
Âmbar
fonte
4
@lowerkey Exatamente como você deseja que o resultado final mesclado pareça. Meu palpite é que você realmente quer apenas a parte na gh-pagesversão, então você apenas excluiria o material de <<<<<<para ======e também removeria a única >>>>>>linha, deixando as duas linhas do código real entre =======e >>>>>>.
Amber
Obrigado, acho que estou pegando o jeito. Exclua tudo do cabeçalho até ====== e, em seguida, remova as marcas HEAD restantes.
lowerkey de
1
Sim, isso é correto. (Não há nenhum "descanso" real para cuidar - você está apenas confirmando os resultados da fusão, o que o Git normalmente faria automaticamente se não houvesse conflitos.)
Amber
2
@lowerkey, por favor, considere também a leitura de um livro sobre o assunto. Eu recomendaria ler esse livro na íntegra, pois você parece não ter certos conhecimentos básicos sobre como funcionam os VCSes e é melhor se preparar para possíveis problemas no futuro.
kostix
1
Que engraçado é isso. Você aponta para uma resposta da pergunta que está sendo marcada como uma duplicata desta, embora a resposta a esta pergunta possa ser encontrada na outra pergunta.
t3chb0t
22

Comece com 'git status' para ver o que você tem. Se você abortou uma mesclagem (ou a mesclagem foi abortada) e você tem arquivos conflitantes no diretório de trabalho, algo deu errado. O status do Git informará onde você está. Depois disso, você tem várias opções. Você deve resolver o commit de mesclagem manualmente, o que pode ser desafiador, ou usando uma ferramenta como:

git mergetool

A ferramenta de mesclagem funcionará se seus arquivos estiverem listados como necessitando de uma mesclagem.

Você também pode realizar um dos seguintes:

git checkout --ours -- /path/to/conflicted-file       # this is probably the one you want
git checkout --theirs -- /path/to/conflicted-file

Você pode ver as diferentes versões usando a: 1: sintaxe de nome de arquivo. Veja aqui uma explicação. Mas todos os itens acima assumem que 'git status' mostra os arquivos como necessitando de uma fusão.

Finalmente, você sempre tem a opção de:

git reset --hard   # sounds like --hard is what you need but check other options
GoZoner
fonte
6
Eu absolutamente gostaria git statusde apoiar o conselho "comece para ver o que você tem": é fascinante em alguns círculos culpar o Git por sua complexidade imaginária, mas na verdade a leitura cuidadosa da saída de git statusé o suficiente para entender o que fazer a seguir na maioria das situações comuns. Portanto, realmente: se algo der errado, pare, leia git status, pense.
kostix
4

Todas as respostas estão corretas, mas se você deseja remover automaticamente todas as marcas de conflito e deseja alterar automaticamente os arquivos para manter o HEAD, então você pode criar seu próprio script bash como: -

Script de exemplo:

# vim /usr/sbin/solve.git

(Anexar a seguir)

#!/bin/bash
for f in $(grep -Rl '^>>>>>>> ' --include="*.php" --include="*.css" --include="*.js" --include="*.html" --include="*.svg" --include="*.txt" .)
do
sed -i -e '/^=======/,/^>>>>>>> /d' -e '/^<<<<<<< /d' $f
sed -i -e '/^>>>>>>> /d' $f
echo "$f Fixed"
done
git add . ; git commit -am "[+] Resolved on `date` from `hostname` by `whoami`" --no-verify

# chmod 755 /usr/sbin/solve.git

e apenas execute-o em seu repositório / caminho GIT para resolver:

$ cd <path_to_repo>
$ solve.git

Aviso: - As extensões de arquivo mencionadas acima são php, css, js, html, svg e txt.

Sr. Pundir
fonte
0

No Atom, tive o problema de alguns arquivos não salvarem os conflitos de mesclagem resolvidos na unidade, então tive que clicar manualmente em "salvar". Levei algum tempo para descobrir.

Timar Ivo Batis
fonte
0

Estou saindo dessa questão . E eu queria algum método automatizado de mesclar os arquivos parcialmente mesclados, em vez de editar os arquivos manualmente ( como sugerido em outras respostas, o que não me sinto realmente confortável em fazer ). Então aqui está o que acabei fazendo via netbeans, mas também pode ser feito via linha de comando.

Agora, lembre-se de que isso só funciona se imediatamente após merge->add->commitvocê perceber que errou e quiser refazer o processo.

PASSO 1: Redefinir para um commit anterior.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

ETAPA 2: tente mesclar novamente o branch

git merge --ff origin/feature/YOUR-Branch_here

Neste ponto, será exibida a janela de mesclagem se você estiver usando uma GUI. e você pode prosseguir normalmente.

Mohd Abdul Mujib
fonte