Git łączy lewe znaki HEAD w moich plikach

102

Próbowałem scalić plik w wierszu poleceń za pomocą Gita, kiedy pojawił się komunikat o błędzie informujący mnie, że scalanie zostało przerwane.

Myślałem, że to koniec, ale potem zdałem sobie sprawę, że w moich plikach są znaczniki gitmark. Tak jak to:

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

Pliki były edytowane nie przeze mnie i pokazują wiersze wstawione z:

  • GŁOWA po mniej niż znakach ( <<<<<<< HEAD)
  • wiersze zmienionego kodu
  • ciąg znaków równości ( =======)
  • nowa wersja kodu
  • kolejna linia zaczynająca się od znaków większości i nazwy gałęzi ( >>>>>>> gh-pages)

Co gorsza, zawartość pliku nie jest już w porządku. Czy ktoś wie, jak przywrócić te pliki do normalnego stanu, a zmiany, które wprowadziłem w gałęzi gh, zostały włączone do gałęzi głównej?

mały klawisz
źródło

Odpowiedzi:

96

To są znaki konfliktu . Nadal jesteś w trakcie scalania, ale było kilka części, których Git nie mógł scalić automatycznie. Będziesz musiał ręcznie edytować te części tak, jak chcesz, aby były, a następnie zatwierdzić wyniki.


Na przykład w twoim konkretnym przypadku prawdopodobnie chciałbyś rozwiązać ten problem w ten sposób (uwaga - strzałki / tekst po prawej stronie to tylko moje notatki, a nie coś, co wpisałeś w pliku):

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

i dlatego zapiszesz plik jako ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
Bursztyn
źródło
4
@lowerkey Dokładnie tak, jak chcesz, aby końcowy wynik scalony wyglądał. Domyślam się, że naprawdę chcesz tylko część w gh-pageswersji, więc po prostu usuniesz zawartość z <<<<<<do, ======a także usuniesz jedną >>>>>>linię, pozostawiając dwie linie rzeczywistego kodu między =======a >>>>>>.
Bursztyn
Dzięki, myślę, że rozumiem. Usuń wszystko od głowy do ======, a następnie usuń pozostałe znaki HEAD.
niższy klawisz
1
Tak, zgadza się. (Nie ma prawdziwego „odpoczynku”, którym trzeba się zająć - po prostu zatwierdzasz wyniki scalenia, które normalnie Git zrobiłby automatycznie, gdyby nie było konfliktów.)
Amber
2
@lowerkey, rozważ także przeczytanie książki na ten temat. Poleciłbym przeczytać tę książkę w całości, ponieważ wydaje się, że brakuje Ci pewnej podstawowej wiedzy na temat działania VCS i lepiej jest przygotować się na ewentualne problemy w przyszłości.
kostix
1
Jakie to zabawne. Wskazujesz odpowiedź na pytanie, które jest oznaczane jako duplikat tego pytania, chociaż odpowiedź na to pytanie znajduje się w drugim pytaniu.
t3chb0t
22

Absolutnie zacznij od `` statusu gita '', aby zobaczyć, co masz. Jeśli przerwałeś scalanie (lub przerwałeś scalanie) i masz pliki będące w konflikcie w katalogu roboczym, coś poszło nie tak. Status Git powie Ci, gdzie jesteś. Następnie masz kilka opcji. Powinieneś rozwiązać zobowiązanie scalające ręcznie, co może być trudne, lub za pomocą narzędzia, takiego jak:

git mergetool

Narzędzie do scalania będzie działać, jeśli Twoje pliki są wymienione jako wymagające scalenia.

Możesz też wykonać jedną z:

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

Możesz zobaczyć różne wersje używając składni: 1: nazwa_pliku. Zobacz tutaj, aby uzyskać wyjaśnienie. Ale wszystkie powyższe zakładają, że „stan git” pokazuje, że pliki wymagają scalenia.

Wreszcie, zawsze masz możliwość:

git reset --hard   # sounds like --hard is what you need but check other options
GoZoner
źródło
6
Absolutnie chciałbym git statuspoprzeć radę „zacznij od, aby zobaczyć, co masz”: w niektórych kręgach fascynujące jest obwinianie Gita za jego wyimaginowaną złożoność, ale tak naprawdę git statuswystarczy uważne przeczytanie wyniku , aby zrozumieć, co robić dalej w większości typowych sytuacji. Stąd tak naprawdę: jeśli coś pójdzie nie tak, zatrzymaj się, przeczytaj git status, pomyśl.
kostix
4

Wszystkie odpowiedzi są poprawne, ale jeśli chcesz automatycznie usunąć wszystkie znaki konfliktu i chcesz automatycznie zmienić pliki, aby zachować HEAD, możesz utworzyć własny skrypt bash, taki jak: -

Przykładowy skrypt:

# vim /usr/sbin/solve.git

(Dołącz po)

#!/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

i po prostu uruchom go w swoim repozytorium / ścieżce GIT, aby rozwiązać:

$ cd <path_to_repo>
$ solve.git

Uwaga: - Powyższe rozszerzenia plików to php, css, js, html, svg i txt.

Panie Pundir
źródło
0

W Atom miałem problem z tym, że niektóre pliki nie zapisywały na dysku rozwiązanych konfliktów scalania, więc musiałem ręcznie kliknąć „zapisz”. Zajęło mi trochę czasu, zanim się zorientowałem.

Timar Ivo Batis
źródło
0

Pochodzę z tego pytania . I chciałem jakiejś zautomatyzowanej metody łączenia na pół scalonych plików, zamiast ręcznej edycji plików ( jak sugerowano w innych odpowiedziach, co nie jest zbyt wygodne ). Oto, co ostatecznie zrobiłem przez netbeans, ale można to zrobić również za pomocą wiersza poleceń.

Teraz pamiętaj, że działa to tylko wtedy, gdy natychmiast po merge->add->commitzdałeś sobie sprawę, że popsułeś się i chcesz ponownie przejść przez ten proces.

KROK 1: Zresetuj do poprzedniego zatwierdzenia.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

KROK 2: Spróbuj ponownie scalić gałąź

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

W tym momencie zostaniesz poproszony o okno łączenia, jeśli używasz GUI. i możesz postępować normalnie.

Mohd Abdul Mujib
źródło