2008-11-10 36 views
341

Tôi đã sử dụng Git trên Windows (msysgit) để theo dõi các thay đổi đối với một số công việc thiết kế mà tôi đã thực hiện.Giải quyết xung đột Git bằng các tệp nhị phân

Hôm nay tôi đã làm việc trên một máy tính khác (với repo từ xa brian) và tôi hiện đang cố gắng hợp nhất các chỉnh sửa được thực hiện hôm nay trở lại phiên bản cục bộ thông thường trên máy tính xách tay của mình.

Trên máy tính xách tay của mình, tôi đã sử dụng git pull brian master để kéo các thay đổi vào phiên bản cục bộ của mình. Mọi thứ đều tốt đẹp ngoài tài liệu InDesign chính - điều này cho thấy là một xung đột.

Phiên bản trên PC (brian) là phiên bản mới nhất mà tôi muốn giữ nhưng tôi không biết lệnh nào yêu cầu repo sử dụng mã này.

Tôi đã thử trực tiếp sao chép tệp qua máy tính xách tay của tôi nhưng điều này dường như phá vỡ toàn bộ quá trình hợp nhất.

Có ai có thể chỉ cho tôi đúng hướng không?

Trả lời

666

git checkout chấp nhận tùy chọn --ours hoặc --theirs cho các trường hợp như thế này. Vì vậy, nếu bạn có xung đột hợp nhất và bạn biết bạn chỉ muốn tệp từ chi nhánh bạn đang hợp nhất, bạn có thể làm:

$ git checkout --theirs -- path/to/conflicted-file.txt 

để sử dụng phiên bản tệp đó. Tương tự như vậy, nếu bạn biết bạn muốn phiên bản của bạn (không phải là người được sáp nhập vào), bạn có thể sử dụng

$ git checkout --ours -- path/to/conflicted-file.txt 
+24

Tôi phải chạy 'git reset HEAD path/to/conflicted-file.txt' trên tệp trước khi sử dụng --ours, nếu không nó dường như không có hiệu lực. – Zitrax

+5

@Zitrax Bạn có phân biệt tệp sau khi chạy 'git checkout --ours' không? Trang người đàn ông gợi ý (IMHO) rằng thanh toán --ours/- họ sẽ xóa thay đổi khỏi danh sách "cả hai đã sửa đổi, cần hợp nhất" và thêm nó vào chỉ mục và tôi nghĩ điều đó không chính xác. Tôi tin rằng bạn sẽ cần phải chạy 'git add' sau khi thanh toán. –

+9

Lưu ý: bạn vẫn muốn thực hiện "git add * conflicted-file.txt *" và "git commit". Một cách dễ dàng, khi tôi thử nó, thông điệp cam kết đã được phổ biến trước với một lưu ý về cuộc xung đột. –

136

Bạn cần phải giải quyết mâu thuẫn bằng tay (sao chép các tập tin trên) và sau đó cam kết các tập tin (không có vấn đề nếu bạn đã sao chép nó trên hoặc sử dụng phiên bản địa phương) như

git commit -a -m "Fix merge conflict in test.foo" 

Git này thường autocommits sau khi sáp nhập , nhưng khi phát hiện xung đột, nó không thể tự giải quyết được, nó áp dụng tất cả các bản vá lỗi mà nó đã tìm ra và để phần còn lại cho bạn giải quyết và cam kết thủ công. Git Merge Man Page, mục nhập blog Git-SVN Crash Course hoặc this có thể làm sáng tỏ cách hoạt động của blog.

Edit: Xem bài viết dưới đây, bạn không thực sự phải sao chép các tập tin bản thân, nhưng có thể sử dụng

git checkout --ours -- path/to/file.txt 
git checkout --theirs -- path/to/file.txt 

để chọn phiên bản của tập tin mà bạn muốn. Việc sao chép/chỉnh sửa tệp sẽ chỉ cần thiết nếu bạn muốn kết hợp cả hai phiên bản.

Vui lòng đánh dấu câu trả lời mipadis là câu trả lời đúng.

+1

Cảm ơn vì điều đó. Tôi đã không chắc chắn nếu có một số loại xây dựng trong cách để đánh dấu một tập tin như là một 'chính xác'. Giải thích lý do tại sao tôi không thể tìm thấy lệnh không tồn tại! –

+0

Vâng, đó là một chút không trực quan - một cái gì đó giống như git giải quyết sẽ được tốt đẹp, nhưng cũng sẽ là một bước thêm ... – VolkA

3

Tôi đã gặp một vấn đề tương tự (muốn kéo một cam kết bao gồm một số tệp nhị phân gây ra xung đột khi hợp nhất), nhưng đi qua một giải pháp khác có thể được thực hiện hoàn toàn bằng git (tức là không phải sao chép tệp theo cách thủ công). Tôi nghĩ rằng tôi sẽ bao gồm nó ở đây vì vậy ít nhất tôi có thể nhớ nó trong thời gian tới tôi cần nó. :) Các bước như sau:

% git fetch 

này fetches mới nhất cam kết (s) từ kho lưu trữ từ xa (có thể bạn cần phải xác định một tên chi nhánh từ xa, tùy thuộc vào thiết lập của bạn), nhưng không cố gắng hợp nhất chúng. Nó ghi lại các cam kết trong FETCH_HEAD

% git checkout FETCH_HEAD stuff/to/update 

này có các bản sao của các tập tin nhị phân Tôi muốn ghi đè và những gì trong cây làm việc với các phiên bản lấy từ các chi nhánh từ xa. git không cố gắng thực hiện bất kỳ việc hợp nhất nào, vì vậy bạn chỉ cần sao chép chính xác tệp nhị phân từ nhánh từ xa. Khi đã xong, bạn có thể thêm/cam kết bản sao mới giống như bình thường.

92

Bạn cũng có thể khắc phục vấn đề này với

git mergetool 

gây git để tạo ra bản sao cục bộ của nhị phân mâu thuẫn và đẻ trứng biên tập mặc định của bạn về họ:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

Rõ ràng bạn không thể chỉnh sửa các tệp nhị phân một cách hữu ích trong trình soạn thảo văn bản. Thay vào đó, bạn sao chép tệp {conflicted}.REMOTE mới trên {conflicted} mà không đóng trình chỉnh sửa. Sau đó, khi bạn đóng trình chỉnh sửa git sẽ thấy rằng bản sao làm việc chưa được thay đổi đã được thay đổi và xung đột hợp nhất của bạn được giải quyết theo cách thông thường.

+13

Câu trả lời này hoàn toàn xứng đáng hơn upvotes. – Chetan

+5

Nếu các tệp lớn hoặc bạn không muốn rủi ro khi mở nhị phân trong trình soạn thảo văn bản, bạn có thể nhấn ctrl + c tại dấu nhắc mergetool ("' Quay trở lại để bắt đầu công cụ giải quyết hợp nhất ") và git sẽ rời khỏi các tập tin bổ sung tại chỗ. Sau đó, bạn có thể sửa đổi chúng hoặc hợp nhất chúng trong một công cụ bên ngoài (hữu ích cho các định dạng tài liệu nhị phân như LibreOffice/OpenOffice/MSWord) và lưu kết quả trở lại tên tệp ban đầu. Để thông báo cho git rằng xung đột đã được giải quyết, 'git add' tên tệp gốc, và sau đó bạn có thể hoàn thành cam kết hợp nhất. – Felix

13

Để giải quyết bằng cách giữ cho các phiên bản trong ngành hiện tại của bạn (bỏ qua các phiên bản từ chi nhánh bạn đang sáp nhập trong), chỉ cần thêm và cam kết tập tin:

git commit -a 

Để giải quyết bằng cách ghi đè phiên bản trong hiện tại của bạn chi nhánh với các phiên bản từ chi nhánh bạn đang sáp nhập, bạn cần phải lấy đó phiên bản vào thư mục làm việc của bạn đầu tiên, và sau đó thêm/cam kết nó:

git checkout otherbranch theconflictedfile 
git commit -a 

Explained in more detail

5

Từ git checkout docs

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
các --theirs
Khi kiểm tra đường dẫn từ chỉ mục, hãy xem giai đoạn số 2 (ours) hoặC# 3 (theirs) cho đường dẫn chưa được nhấn.

Chỉ mục có thể chứa các mục nhập chưa được nhấn do một lần hợp nhất không thành công trước đó. Theo mặc định, nếu bạn cố gắng kiểm tra một mục nhập từ chỉ mục, hoạt động thanh toán sẽ không thành công và sẽ không có nội dung nào được kiểm tra. Sử dụng -f sẽ bỏ qua các mục nhập chưa được nhấn này. Các nội dung từ một bên cụ thể của hợp nhất có thể được kiểm tra ra khỏi chỉ mục bằng cách sử dụng --ours hoặc --theirs. Với -m, các thay đổi được thực hiện đối với tệp cây đang hoạt động có thể bị loại bỏ để tạo lại kết quả hợp nhất gốc bị xung đột.câu trả lời

6

mipadi đã làm không hoàn toàn làm việc cho tôi, tôi cần phải làm điều này:

git checkout --ours path/to/file.bin

hay, để giữ phiên bản được sáp nhập vào:

git checkout --theirs path/to/file.bin

sau đó

git add path/to/file.bin

Và sau đó tôi đã có thể làm "git mergetool" một lần nữa và tiếp tục vào cuộc xung đột tiếp theo.

+1

Nó phải là câu trả lời được chấp nhận. Cảm ơn bạn. – JCarlos

1

Tôi đã xem xét hai chiến lược để quản lý sự khác biệt/hợp nhất các tệp nhị phân với Git trên cửa sổ.

  1. Rùa git cho phép bạn định cấu hình các công cụ khác biệt/hợp nhất cho các loại tệp khác nhau dựa trên đuôi tệp của chúng. Xem 2.35.4.3. Khác biệt/Hợp nhất Cài đặt Nâng cao http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html. Chiến lược này tất nhiên dựa trên các công cụ khác biệt/hợp nhất phù hợp có sẵn.

  2. Sử dụng thuộc tính git, bạn có thể chỉ định công cụ/lệnh để chuyển đổi tệp nhị phân thành văn bản và sau đó để công cụ khác biệt/hợp nhất mặc định của bạn thực hiện. Xem http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes. Bài báo thậm chí còn đưa ra một ví dụ về việc sử dụng dữ liệu meta cho các hình ảnh khác.

Tôi có cả hai chiến lược để làm việc với các tệp nhị phân của mô hình phần mềm, nhưng chúng tôi đã đi với git rùa vì cấu hình dễ dàng.

0

Nếu nhị phân là một cái gì đó hơn một dll hoặc cái gì đó có thể được chỉnh sửa trực tiếp giống như một hình ảnh, hoặc một tập tin pha trộn (và bạn không cần phải vào thùng rác/chọn một tập tin này hay cách khác) một thực merge sẽ có một số như:

tôi đề nghị tìm kiếm một công cụ diff định hướng cho bạn file nhị phân gì, ví dụ có một số những người Việt cho các tập tin hình ảnh ví dụ

và so sánh chúng.

Nếu không có công cụ diff ngoài kia để so sánh tập tin của bạn, sau đó nếu bạn có phát ban của file bin (có nghĩa là, có tồn tại một biên tập viên cho nó ...như máy xay sinh tố 3d, bạn có thể sau đó tự kiểm tra các tập tin, cũng có thể xem các bản ghi, và yêu cầu người khác những gì bạn nên bao gồm) và làm một sản phẩm của các tập tin với https://git-scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend

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