Câu hỏi Làm cách nào để tôi có thể hủy các thay đổi từ xa và đánh dấu tệp là "đã giải quyết"?


Tôi có một số tập tin địa phương, tôi kéo từ chi nhánh từ xa và có xung đột. Tôi biết rằng tôi muốn giữ các thay đổi cục bộ của mình và bỏ qua các thay đổi từ xa gây xung đột. Có một lệnh tôi có thể sử dụng để có hiệu lực nói "đánh dấu tất cả các xung đột như được giải quyết, sử dụng địa phương"?


175
2018-01-15 18:28


gốc


Câu trả lời dưới đây đã được siêu chiếu sáng với tôi. Có một vài điểm tinh tế làm cho những điều thực sự rõ ràng đối với tôi, tôi khuyên mọi người dùng GIT không phải chuyên gia phải đọc tất cả các nhận xét bên dưới bài đăng bên dưới và cảm ơn Brian! - BoomTownTech


Các câu trả lời:


git checkout có --ours tùy chọn để kiểm tra phiên bản của tệp mà bạn đã có cục bộ (thay vì --theirs, là phiên bản bạn đã kéo vào). Bạn có thể vượt qua . đến git checkout để nói với nó để kiểm tra tất cả mọi thứ trong cây. Sau đó, bạn cần đánh dấu xung đột là đã giải quyết, bạn có thể làm gì với git addvà cam kết công việc của bạn sau khi hoàn thành:

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

Lưu ý . bên trong git checkout chỉ huy. Điều đó rất quan trọng và dễ bỏ lỡ. git checkout có hai chế độ; một trong đó nó chuyển đổi chi nhánh, và một trong đó nó kiểm tra các tập tin ra khỏi chỉ mục vào bản sao làm việc (đôi khi kéo chúng vào chỉ mục từ một phiên bản đầu tiên). Cách nó phân biệt là cho dù bạn đã thông qua một tên tập tin trong; nếu bạn không truyền tên tệp, nó sẽ cố chuyển nhánh (mặc dù nếu bạn không chuyển vào nhánh, nó sẽ thử kiểm tra nhánh hiện tại một lần nữa), nhưng nó từ chối làm như vậy nếu có các tệp đã sửa đổi điều đó sẽ có hiệu lực. Vì vậy, nếu bạn muốn một hành vi sẽ ghi đè lên các tập tin hiện có, bạn cần phải vượt qua . hoặc tên tệp để nhận được hành vi thứ hai từ git checkout.

Nó cũng là một thói quen tốt để có, khi đi qua trong một tên tập tin, để bù đắp nó với --, nhu la git checkout --ours -- <filename>. Nếu bạn không thực hiện việc này và tên tệp xảy ra khớp với tên của một chi nhánh hoặc thẻ, Git sẽ nghĩ rằng bạn muốn kiểm tra bản sửa đổi đó, thay vì kiểm tra tên tệp đó, và vì vậy hãy sử dụng biểu mẫu đầu tiên của checkout chỉ huy.

Tôi sẽ mở rộng một chút về cách xung đột và hợp nhất Làm việc đó. Khi bạn nhập vào mã của người khác (điều này cũng xảy ra trong một lần kéo; kéo về cơ bản là một lần tìm nạp tiếp theo là một sự hợp nhất), có một vài tình huống có thể xảy ra.

Đơn giản nhất là bạn đang ở trên cùng một bản sửa đổi. Trong trường hợp này, bạn "đã được cập nhật" và không có gì xảy ra.

Một khả năng khác là bản sửa đổi của họ chỉ đơn giản là một hậu duệ của bạn, trong trường hợp đó bạn sẽ theo mặc định có một "hợp nhất nhanh về phía trước", trong đó HEAD chỉ được cập nhật cho cam kết của họ, không xảy ra sự hợp nhất (điều này có thể bị tắt nếu bạn thực sự muốn ghi lại hợp nhất, sử dụng --no-ff).

Sau đó, bạn nhận được vào các tình huống mà bạn thực sự cần phải kết hợp hai phiên bản. Trong trường hợp này, có hai kết quả có thể xảy ra. Một là việc hợp nhất xảy ra một cách sạch sẽ; tất cả các thay đổi nằm trong các tệp khác nhau hoặc nằm trong cùng một tệp nhưng đủ xa nhau mà cả hai tập hợp thay đổi đều có thể được áp dụng mà không có sự cố. Theo mặc định, khi hợp nhất sạch sẽ xảy ra, nó sẽ tự động được cam kết, mặc dù bạn có thể tắt tính năng này với --no-commit nếu bạn cần chỉnh sửa trước (ví dụ, nếu bạn đổi tên hàm foo đến barvà một người khác thêm mã mới mà các cuộc gọi foo, nó sẽ hợp nhất sạch sẽ, nhưng tạo ra một cây bị hỏng, vì vậy bạn có thể muốn làm sạch nó như là một phần của cam kết hợp nhất để tránh có bất kỳ cam kết bị hỏng).

Khả năng cuối cùng là có một sự hợp nhất thực sự, và có những xung đột. Trong trường hợp này, Git sẽ thực hiện nhiều việc hợp nhất nhất có thể và tạo ra các tệp có các dấu xung đột (<<<<<<<, =======>>>>>>>) trong bản sao làm việc của bạn. Trong chỉ mục (còn được gọi là "khu vực dàn dựng"; nơi lưu trữ tệp git add trước khi cam kết), bạn sẽ có 3 phiên bản của mỗi tệp có xung đột; có phiên bản gốc của tệp từ tổ tiên của hai nhánh bạn đang hợp nhất, phiên bản từ HEAD (bên của bạn hợp nhất) và phiên bản từ nhánh từ xa.

Để giải quyết xung đột, bạn có thể chỉnh sửa tệp trong bản sao làm việc của mình, xóa các điểm đánh dấu xung đột và sửa mã để nó hoạt động. Hoặc, bạn có thể kiểm tra phiên bản từ một hoặc các mặt khác của quá trình hợp nhất, sử dụng git checkout --ours hoặc là git checkout --theirs. Khi bạn đã đặt tệp vào trạng thái bạn muốn, bạn chỉ ra rằng bạn đã hoàn tất việc hợp nhất tệp và nó đã sẵn sàng để cam kết sử dụng git addvà sau đó bạn có thể cam kết hợp nhất với git commit.


295
2018-01-15 18:29



Có lẽ bạn nên lưu ý rằng git add --all thêm tất cả các tệp vào kho lưu trữ để điều này có thể thêm nhiều tệp hơn dự định trừ khi .gitignore các mẫu đang ở trạng thái hoàn hảo. git add -u có lẽ phù hợp hơn cho tình huống này, bạn ít có khả năng chỉnh sửa các tệp được theo dõi mà bạn không muốn thêm trong khi giải quyết hợp nhất. - CB Bailey
Ối xin lỗi. Đó là điều tôi muốn nói. Đã sửa nó ngay bây giờ. - Brian Campbell
cảm ơn câu trả lời chi tiết của bạn. Tôi thực sự đã thử git checkout --ours và nhận được một thông báo lỗi (mà tôi không nhớ bây giờ). Các tệp được đề cập là dll (chúng tôi có một số thứ mà chúng tôi lưu trữ, tham chiếu của bên thứ ba chủ yếu) và tôi muốn nói 'ok bản sao của tôi là bản sao tôi muốn nhưng lỗi giống như' không thể kiểm tra trong khi hợp nhất ' ..... Tôi sẽ giữ cho bài viết này như là một tài liệu tham khảo và lần sau nó sẽ xảy ra thử lại và xem nó hoạt động hay nếu tôi có thể gửi tin nhắn đó. Cảm ơn một lần nữa - BoomTownTech
nhưng lời giải thích của bạn rõ ràng rất nhiều cho tôi về quá trình, cảm ơn một lần nữa ... Theo dõi câu hỏi: Bất kỳ cách nào để có được git để xóa các tập tin .orig một khi tôi đã hợp nhất xóa? - BoomTownTech
Bạn cần phải làm git checkout --ours .. Các . là quan trọng; chuyển tên tệp (trong trường hợp này, toàn bộ thư mục) chọn giữa hai chế độ hoạt động khác nhau của checkout, một trong đó chuyển đổi các chi nhánh và một trong đó di chuyển các tập tin từ chỉ mục vào bản sao làm việc. Tôi đồng ý, nó rất khó hiểu. Bạn cũng có thể làm git checkout --ours -- <filename> để xem từng tệp riêng lẻ. - Brian Campbell


Đảm bảo nguồn gốc xung đột: nếu đó là kết quả của git merge, xem Brian Campbell'S câu trả lời.

Nhưng nếu là kết quả của một git rebase, để hủy xa (của họ) thay đổi và sử dụng địa phương thay đổi, bạn sẽ phải thực hiện:

git checkout --theirs -- .

Xem "Tại sao ý nghĩa của “ours”Và“theirs"Đảo ngược"" Để xem làm thế nào ours và theirs được đổi chỗ trong quá trình rebase (vì Thượng nguồn chi nhánh được kiểm tra).


16
2017-09-21 05:48