Git hợp nhất các dấu HEAD bên trái trong tệp của tôi


101

Tôi đã cố gắng hợp nhất một tệp trong dòng lệnh bằng Git, khi một thông báo lỗi xuất hiện cho tôi biết việc hợp nhất đã bị hủy bỏ.

Tôi nghĩ rằng đó là kết thúc của nó, nhưng sau đó tôi nhận ra có gitmark trong các tệp của tôi. Như vậy:

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

Các tệp không phải do tôi chỉnh sửa và hiển thị các dòng được chèn bằng:

  • HEAD sau dấu hiệu nhỏ hơn ( <<<<<<< HEAD)
  • dòng mã đã thay đổi
  • một chuỗi các dấu bằng ( =======)
  • phiên bản mới của mã
  • một dòng khác bắt đầu bằng dấu lớn hơn và tên của nhánh ( >>>>>>> gh-pages)

Điều tồi tệ hơn là nội dung tệp không còn theo thứ tự. Có ai biết tôi làm cách nào để đưa các tệp đó trở lại bình thường và những thay đổi mà tôi đã thực hiện trong nhánh gh được hợp nhất vào nhánh chính không?

Câu trả lời:


96

Đó là những dấu hiệu xung đột . Bạn vẫn đang trong quá trình hợp nhất, nhưng có một số phần mà Git không thể hợp nhất tự động. Bạn sẽ cần phải chỉnh sửa thủ công những phần đó theo những gì bạn muốn và sau đó cam kết kết quả.


Ví dụ: trong trường hợp cụ thể của bạn, bạn có thể muốn giải quyết nó như thế này (lưu ý - các mũi tên / văn bản ở bên phải chỉ là ghi chú của tôi, không phải thứ bạn nhập vào tệp):

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

và do đó bạn sẽ lưu tệp dưới dạng ...

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

4
@lowerkey Chính xác là bạn muốn kết quả hợp nhất cuối cùng trông như thế nào. Tôi đoán là bạn thực sự chỉ muốn một phần trong gh-pagesphiên bản, vì vậy bạn chỉ cần xóa nội dung từ <<<<<<đến ======và cũng xóa >>>>>>dòng đơn , để lại hai dòng mã thực giữa =======>>>>>>.
Amber

Cảm ơn, tôi nghĩ rằng tôi đang hiểu nó. Xóa mọi thứ từ đầu đến ====== và sau đó xóa các HEADmarks còn sót lại.
lowkey

1
Đúng, đúng vậy. (Không có "phần còn lại" thực sự để chăm sóc - bạn chỉ cam kết kết quả của việc hợp nhất, điều mà Git thường sẽ tự động thực hiện nếu không có xung đột.)
Amber

2
@lowerkey, vui lòng xem xét việc đọc một cuốn sách về chủ đề này. Tôi khuyên bạn nên đọc toàn bộ cuốn sách đó vì bạn dường như thiếu một số kiến ​​thức cơ bản nhất định về cách hoạt động của VCS và tốt hơn là bạn nên chuẩn bị cho mình cho những vấn đề có thể xảy ra trong tương lai.
kostix

1
Điều đó thật buồn cười làm sao. Bạn chỉ vào một câu trả lời của câu hỏi đang được đánh dấu là bản sao của câu này mặc dù câu trả lời cho câu hỏi này có thể được tìm thấy trong câu hỏi kia.
t3chb0t

22

Tuyệt đối bắt đầu với 'trạng thái git' để xem bạn có những gì. Nếu bạn hủy hợp nhất (hoặc hủy hợp nhất) và bạn có các tệp xung đột trong thư mục làm việc thì đã xảy ra lỗi. Trạng thái Git sẽ cho bạn biết bạn đang ở đâu. Sau đó, bạn có một số tùy chọn. Bạn nên giải quyết cam kết hợp nhất bằng tay, có thể khó khăn hoặc sử dụng một công cụ như:

git mergetool

Công cụ hợp nhất sẽ hoạt động nếu tệp của bạn được liệt kê là cần hợp nhất.

Bạn cũng có thể thực hiện một trong số:

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

Bạn có thể xem các phiên bản khác nhau bằng cú pháp: 1: filename. Xem ở đây để được giải thích. Nhưng tất cả những điều trên đều giả định rằng 'trạng thái git' cho thấy các tệp cần hợp nhất.

Cuối cùng, bạn luôn có tùy chọn:

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

6
Tôi hoàn toàn muốn thứ hai git statuslời khuyên "bắt đầu với để xem bạn có gì": trong một số vòng kết nối, có thể dễ dàng đổ lỗi cho Git vì sự phức tạp tưởng tượng của nó, nhưng trên thực tế, đọc kỹ kết quả git statuslà đủ để hiểu phải làm gì tiếp theo trong hầu hết các tình huống thông thường. Do đó, thực sự: nếu có vấn đề gì xảy ra, hãy dừng lại, đọc git statusvà suy nghĩ.
kostix

4

Tất cả các câu trả lời đều đúng nhưng nếu bạn muốn Tự động xóa tất cả các dấu xung đột & muốn tự động thay đổi tệp để giữ HEAD, thì Bạn có thể tạo tập lệnh bash của riêng mình như: -

Tập lệnh mẫu:

# vim /usr/sbin/solve.git

(Nối sau)

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

& chỉ cần chạy nó trong repo / đường dẫn GIT của bạn để giải quyết:

$ cd <path_to_repo>
$ solve.git

Lưu ý: - Các phần mở rộng tệp được đề cập ở trên là php, css, js, html, svg & txt.


0

Trong Atom, tôi gặp sự cố là một số tệp không lưu được các xung đột hợp nhất đã giải quyết vào ổ đĩa, vì vậy tôi phải nhấp vào "lưu" theo cách thủ công. Tôi đã mất khá nhiều thời gian để tìm hiểu.


0

Tôi đến từ câu hỏi này . Và tôi muốn một số phương pháp tự động hợp nhất các tệp đã hợp nhất một nửa, thay vì chỉnh sửa các tệp theo cách thủ công ( như được đề xuất trong các câu trả lời khác, điều mà tôi thực sự không thoải mái khi làm ). Vì vậy, đây là những gì tôi đã làm qua netbeans, nhưng cũng có thể được thực hiện qua dòng lệnh.

Bây giờ, hãy nhớ rằng, điều này chỉ hoạt động nếu ngay sau đó merge->add->commit, bạn nhận ra rằng mình đã làm sai và muốn thực hiện lại quá trình.

BƯỚC 1: Đặt lại về cam kết trước đó.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

BƯỚC 2: Thử lại hợp nhất chi nhánh

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

Tại thời điểm này, bạn sẽ được nhắc với cửa sổ hợp nhất nếu bạn đang sử dụng GUI. và sau đó bạn có thể tiếp tục như bình thường.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.