2009-12-08 26 views
8

Tôi muốn thay đổi một tập tin trong repo của tôi, sau đó buộc git để tin rằng tập tin là chưa hợp nhất và hiển thị trong git status như vậy:Làm cách nào để buộc git nghĩ rằng một tệp chưa được nén?

# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add <file>..." to mark resolution) 
# 
#  both modified:  lib/delayed/recipes.rb 
# 

Đó là toàn bộ câu hỏi của tôi. Hãy đọc tiếp để giải thích tại sao, vì tôi biết đó là điều đầu tiên sẽ được hỏi.

Mục đích ở đây là một sửa lỗi cho Piston mà ngày nay để lại xung đột hợp nhất trong chỉ mục nơi chúng quá dễ bị bỏ qua.

Cách piston update làm việc với một repo Git là:

  • Clone repo từ xa vào một git tạm repo mới
  • Checkout tạm repo để cam kết cuối cùng chúng ta đã thấy (lưu trong .piston.yml)
  • Thanh toán repo địa phương của chúng tôi (một chi nhánh mới) với cam kết cuối cùng nơi .piston.yml đã được cập nhật
  • Sao chép file repo địa phương của chúng tôi vào repo tạm
  • cam kết tất cả những thay đổi trong nhiệt độ repo (đây là những thay đổi địa phương của chúng tôi tính đến thời điểm cuối cùng chúng tôi cập nhật dự án vendored này)
  • Run git merge master trong repo tạm thời để nhập các thay đổi địa phương của chúng tôi với những thay đổi repo từ xa
  • IGNORE xung đột nhập (!) và sao chép tất cả các tập tin từ repo tạm thời để repo địa phương của chúng tôi
  • Cam kết các tập tin (trong chi nhánh tạm thời mới của chúng tôi) để repo địa phương của chúng tôi
  • Thanh toán repo địa phương trở lại điểm xuất phát ban đầu của chúng tôi
  • Merge tạm chi nhánh vào repo địa phương (thêm bất kỳ những thay đổi khác mà chúng tôi đã thực hiện)

Tôi hy vọng sẽ khắc phục sự cố này bằng cách cho phép tệp có xung đột hợp nhất được đưa vào nhánh tạm thời, nhưng cuối cùng (sau khi nó chạy git merge --squash) Tôi muốn nói với git về các tệp có xung đột hợp nhất trong temp repo.

+0

Xem "Cách tạo lại trạng thái hợp nhất có chọn lọc?" trên danh sách gửi thư Git: http://thread.gmane.org/gmane.comp.version-control.git/135059 –

Trả lời

12

Trong tệp Git có xung đột hợp nhất có (thường) ba phiên bản trong chỉ mục và phiên bản trong khu vực làm việc với các điểm đánh dấu xung đột là diff3 -E/rcsmerge. Các phiên bản trong chỉ mục là giai đoạn 1 từ tổ tiên chung, giai đoạn 2 cho phiên bản "của chúng tôi" và giai đoạn 3 cho phiên bản "của họ". Đối với tệp chưa được nhấn chìm, không có phiên bản nào ở giai đoạn 0 (bạn có thể sử dụng git update-index --unresolve để khôi phục trạng thái chưa được xoá bằng cách xóa giai đoạn 0).

Bạn cần phải sử dụng git ls-files --stage hoặc git ls-tree <commit> để nhận mã nhận dạng sha-1 của các đốm màu (phiên bản tệp) bạn muốn đưa vào chỉ mục hoặc git hash-object -w <file> nếu bạn muốn tạo phiên bản của tệp từ đầu/phiên bản khu vực làm việc. Sau đó, bạn sử dụng git update-index --index-info để đặt các giai đoạn đặt hàng cao hơn vào tệp chỉ mục (và git update-index --unresolve sau này hoặc git update-index --force-remove trước khi nhồi các giai đoạn cao hơn để loại bỏ giai đoạn 0 khỏi chỉ mục). Bạn có thể tạo lại tệp với các điểm đánh dấu hợp nhất trong khu vực làm việc bằng cách sử dụng git checkout --conflict=merge -- <file>.

HTH (Hope Đó Giúp)


Xem thêm: "How to selectively recreate merge state?" thread trên mailing list Git.

+0

Hai phiên bản tệp có xung đột hợp nhất nằm trong một repo khác và có thể đã có phiên bản thứ ba được hợp nhất vào lúc này. Đó không phải là một vấn đề à? (Mặc dù tôi thú nhận tôi chưa hiểu câu trả lời của bạn hoàn toàn.) – ScottJ

+0

Tôi bắt đầu hiểu rõ hơn. Tôi nghĩ rằng tôi sẽ phải thiết lập nó để xuất hiện như một con bạch tuộc hợp nhất, phải không? Hợp nhất tổ tiên chung cộng với thay đổi nhà cung cấp cộng với thay đổi cục bộ. Đây là cách phức tạp hơn tôi dự đoán và tôi không nghĩ rằng tôi đang cho nó nữa. Cảm ơn vì câu trả lời. – ScottJ

+0

Không có bạch tuộc: các hợp nhất là các kết hợp 3 chiều trong Git, do đó cần ba phiên bản. Tôi sẽ cố gắng đưa ra một ví dụ sau. –

Các vấn đề liên quan