Git dosyalarımda sol HEAD işaretlerini birleştir


102

Git kullanarak komut satırındaki bir dosyayı birleştirmeyi denedim, bana birleştirmenin iptal edildiğini bildiren bir hata mesajı göründü.

Bunun sonu olduğunu düşündüm ama sonra dosyalarımda gitmarklar olduğunu fark ettim. Şöyle:

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

Dosyalar benim tarafımdan düzenlenmedi ve şununla eklenen satırları göster:

  • İşaretten az sonra HEAD ( <<<<<<< HEAD)
  • değiştirilen kodun satırları
  • bir dizi eşittir işareti ( =======)
  • kodun yeni versiyonu
  • büyüktür işaretleriyle başlayan başka bir satır ve dalın adı ( >>>>>>> gh-pages)

Daha kötüsü, dosya içeriğinin artık sıralı olmamasıdır. Bu dosyaları nasıl normale döndürdüğümü ve gh-dalında yaptığım değişiklikleri ana dalda birleştirdiğimi bilen var mı?

Yanıtlar:


96

Bunlar çatışma belirteçleridir . Hala birleşme sürecindesiniz, ancak Git'in otomatik olarak birleştiremediği bazı parçalar vardı. Bu parçaları , olmasını istediğiniz şekilde elle düzenlemeniz ve ardından sonuçları işlemeniz gerekir.


Örneğin, sizin özel durumunuzda, muhtemelen bu şekilde çözmek istersiniz (not - sağdaki oklar / metin, dosyaya yazacağınız bir şey değil, sadece notlarımdır):

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

ve böylece dosyayı ...

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

4
@lowerkey Son birleştirilmiş sonucun tam olarak nasıl görünmesini istediğinizi. Benim tahminim eğer gerçekten sadece bir bölümünü istememizdir gh-pagessadece bir şeyler silmek istiyorum bu yüzden, sürüm <<<<<<için ======ve ayrıca tek kaldırmak >>>>>>arasındaki gerçek kod iki satır Misinan =======ve >>>>>>.
Amber

Teşekkürler, sanırım buna alıştım. Baştan ======'ye kadar her şeyi silin ve sonra kalan BAŞLIK işaretlerini kaldırın.
lowerkey

1
Evet, bu doğru. (İlgilenecek gerçek bir "dinlenme" yok - sadece birleştirme işleminin sonuçlarını işliyorsunuz, ki normalde Git çakışma olmasaydı bunu otomatik olarak yapardı.)
Amber

2
@lowerkey, lütfen konuyla ilgili bir kitap okumayı da düşünün . VCS'lerin nasıl çalıştığı hakkında bazı temel bilgilerden yoksun göründüğünüz ve gelecekteki olası sorunlara kendinizi hazırlamanız daha iyi olacağı için bu kitabı bütünüyle okumanızı tavsiye ederim.
kostix

1
Bu ne kadar komik. Bu sorunun cevabı diğer soruda bulunmasına rağmen, bunun bir kopyası olarak işaretlenen sorunun cevabına işaret ediyorsunuz.
t3chb0t

22

Elinizde ne olduğunu görmek için kesinlikle 'git durumu' ile başlayın. Bir birleştirmeyi iptal ettiyseniz (veya birleştirme iptal edildiyse) ve çalışma dizininde çakışan dosyalar varsa, bir şeyler ters gitti. Git durumu size nerede olduğunuzu söyleyecektir. Bundan sonra bir dizi seçeneğiniz var. Birleştirme taahhüdünü elle çözmelisiniz, bu zor olabilir veya aşağıdaki gibi bir araç kullanarak:

git mergetool

Birleştirme aracı, dosyalarınız birleştirme gerektiren olarak listelenmişse çalışacaktır.

Ayrıca şunlardan birini gerçekleştirebilirsiniz:

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

1: dosya adı sözdizimini kullanarak farklı sürümleri görebilirsiniz. Açıklama için buraya bakın . Ancak yukarıdakilerin tümü, 'git durumu'nun dosyaları bir birleştirme ihtiyacı olarak gösterdiğini varsayar.

Son olarak, her zaman şu seçeneğiniz vardır:

git reset --hard   # sounds like --hard is what you need but check other options

6
" git statusNeye sahip olduğunuzu görmek için başlayın " tavsiyesini kesinlikle ikinci kez söylemek istiyorum : Bazı çevrelerde Git'i hayali karmaşıklığından dolayı suçlamak büyüleyici, ama aslında çıktılarını dikkatlice okumak bir git statussonraki adımda ne yapacağınızı anlamak için yeterli. en yaygın durumlarda. Dolayısıyla, gerçekten: Bir şeyler ters giderse, durun, okuyun git status, düşünün.
kostix

4

Tüm yanıtlar doğru ancak tüm çakışma işaretlerini Otomatik Kaldırmak ve HEAD'i korumak için dosyaları otomatik olarak değiştirmek istiyorsanız, o zaman kendi bash betiğinizi şöyle oluşturabilirsiniz: -

Örnek Komut Dosyası:

# vim /usr/sbin/solve.git

(Aşağıdakileri Ekle)

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

& çözmek için GIT deponuzda / yolunuzda çalıştırın:

$ cd <path_to_repo>
$ solve.git

Uyarı: - Yukarıda belirtilen dosya uzantıları php, css, js, html, svg ve txt'dir.


0

Atom'da bazı dosyaların çözülen birleştirme çakışmalarını sürücüye kaydetmemesi sorunu yaşadım, bu yüzden manuel olarak "kaydet" e tıklamam gerekti. Anlamak epey zaman aldı.


0

Ben bu sorudan geliyorum . Dosyaları manuel olarak düzenlemek yerine ( diğer yanıtlarda önerildiği gibi, yapmakta pek rahat olmadığım ) yarı birleştirilmiş dosyaları birleştirmek için otomatik bir yöntem istedim . İşte netbeans aracılığıyla yaptığım şey şu, ancak komut satırı ile de yapılabilir.

Şimdi, aklınızda bulundurun, bu yalnızca merge->add->commit, hata yaptığınızı anlarsanız ve süreci tekrar gözden geçirmek istediğinizde işe yarar .

ADIM 1: Önceki bir işleme sıfırlayın.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

ADIM 2: Şubeyi Birleştirmeyi Yeniden Deneyin

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

Bu noktada, bir GUI kullanıyorsanız, birleştirme penceresi size sorulacaktır. ve daha sonra normal şekilde devam edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.