Git menggabungkan tanda HEAD kiri di file saya

102

Saya mencoba menggabungkan file di baris perintah menggunakan Git, ketika pesan kesalahan muncul yang memberi tahu saya bahwa penggabungan dibatalkan.

Saya pikir itu akhirnya, tetapi kemudian saya menyadari ada gitmark di file saya. Seperti:

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

File telah diedit bukan oleh saya dan menunjukkan baris yang disisipkan dengan:

  • KEPALA setelah kurang dari tanda ( <<<<<<< HEAD)
  • baris kode yang diubah
  • serangkaian tanda sama dengan ( =======)
  • versi baru kode
  • baris lain dimulai dengan tanda lebih besar dari dan nama cabang ( >>>>>>> gh-pages)

Yang lebih buruk adalah konten file tidak lagi teratur. Adakah yang tahu bagaimana saya mengembalikan file-file itu ke normal, dan perubahan yang saya buat di gh-branch digabungkan ke dalam cabang master?

kunci bawah
sumber

Jawaban:

96

Itu adalah penanda konflik . Anda masih dalam proses penggabungan, tetapi ada beberapa bagian yang tidak dapat digabungkan oleh Git secara otomatis. Anda harus mengedit sendiri bagian-bagian itu sesuai keinginan Anda dan kemudian mengkomit hasilnya.


Misalnya, dalam kasus khusus Anda, Anda mungkin ingin menyelesaikannya seperti ini (catatan - panah / teks di sebelah kanan hanyalah catatan saya, bukan sesuatu yang Anda ketik ke dalam file):

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

dan dengan demikian Anda akan menyimpan file sebagai ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
Amber
sumber
4
@lowerkey Persis seperti yang Anda inginkan dari hasil gabungan akhir. Dugaan saya adalah Anda benar-benar hanya menginginkan bagian dalam gh-pagesversi, jadi Anda hanya akan menghapus barang dari <<<<<<to ======dan juga menghapus satu >>>>>>baris, meninggalkan dua baris kode aktual di antara =======dan >>>>>>.
Amber
Terima kasih, saya pikir saya sudah menguasainya. Hapus semuanya mulai dari head hingga ====== lalu hapus HEADmarks yang tersisa.
lowerkey
1
Ya benar. (Tidak ada "istirahat" yang harus diurus - Anda hanya melakukan hasil penggabungan, yang biasanya dilakukan Git secara otomatis jika tidak ada konflik.)
Amber
2
@lowerkey, harap pertimbangkan juga untuk membaca buku tentang topik tersebut. Saya akan merekomendasikan untuk membaca buku itu secara keseluruhan karena Anda tampaknya tidak memiliki pengetahuan dasar tertentu tentang cara kerja VCSes dan lebih baik Anda mempersiapkan diri untuk kemungkinan masalah di masa depan.
kostix
1
Betapa lucunya itu. Anda menunjuk ke jawaban dari pertanyaan yang sedang ditandai sebagai duplikat dari pertanyaan ini meskipun jawaban untuk pertanyaan ini dapat ditemukan di pertanyaan lain.
t3chb0t
22

Mulailah dengan 'status git' untuk melihat apa yang Anda miliki. Jika Anda membatalkan penggabungan (atau penggabungan dibatalkan) dan Anda memiliki file yang konflik di direktori kerja, maka ada yang tidak beres. Status Git akan memberi tahu Anda di mana Anda berada. Setelah itu, Anda memiliki sejumlah opsi. Anda harus menyelesaikan komit penggabungan baik dengan tangan, yang bisa jadi menantang, atau menggunakan alat sebagai:

git mergetool

Alat penggabung akan berfungsi jika file Anda terdaftar sebagai membutuhkan penggabungan.

Anda juga dapat melakukan salah satu dari:

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

Anda dapat melihat versi yang berbeda menggunakan sintaks: 1: namafile. Lihat di sini untuk penjelasannya. Tetapi semua hal di atas mengasumsikan bahwa 'status git' menunjukkan file yang membutuhkan penggabungan.

Terakhir, Anda selalu memiliki opsi untuk:

git reset --hard   # sounds like --hard is what you need but check other options
GoZoner
sumber
6
Saya benar-benar ingin kedua saran "mulai dengan git statusmelihat apa yang Anda punya": di beberapa kalangan mungkin menyalahkan Git atas kompleksitas imajinernya, tetapi sebenarnya membaca dengan cermat keluaran git statussudah cukup untuk memahami apa yang harus dilakukan selanjutnya dalam situasi yang paling umum. Oleh karena itu, sungguh: jika terjadi kesalahan, berhenti, baca git status, pikirkan.
kostix
4

Semua jawaban benar tetapi jika Anda ingin menghapus otomatis semua tanda konflik & ingin mengubah file secara otomatis untuk menyimpan HEAD, maka Anda dapat membuat skrip bash Anda sendiri seperti: -

Contoh Script:

# vim /usr/sbin/solve.git

(Tambahkan Mengikuti)

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

& jalankan saja di repo / jalur GIT Anda untuk menyelesaikan:

$ cd <path_to_repo>
$ solve.git

Perhatian: - Ekstensi file yang disebutkan di atas adalah php, css, js, html, svg & txt.

Tuan Pundir
sumber
0

Di Atom saya memiliki masalah bahwa beberapa file tidak menyimpan konflik gabungan yang telah diselesaikan ke drive, jadi saya harus mengklik "simpan" secara manual. Butuh waktu cukup lama bagiku untuk mencari tahu.

Timar Ivo Batis
sumber
0

Saya datang dari pertanyaan ini . Dan saya menginginkan beberapa metode otomatis untuk menggabungkan setengah file yang digabungkan, daripada mengedit file secara manual ( seperti yang disarankan dalam jawaban lain, yang saya tidak terlalu nyaman melakukannya ). Jadi, inilah yang akhirnya saya lakukan melalui netbeans, tetapi juga dapat dilakukan melalui baris perintah.

Sekarang, ingatlah, ini hanya berfungsi jika segera setelah itu merge->add->commit, Anda menyadari bahwa Anda mengacau, dan ingin mengulangi prosesnya.

LANGKAH 1: Reset ke komit sebelumnya.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

LANGKAH 2: Coba Menggabungkan kembali cabang

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

Pada titik ini Anda akan diminta dengan jendela penggabungan jika Anda menggunakan GUI. dan Anda dapat melanjutkan seperti biasa.

Mohd Abdul Mujib
sumber