2010-01-18 66 views
13

Tôi có một tệp nhị phân trong my_branch và khi tôi cần thực hiện thay đổi, git dĩ nhiên sẽ không hợp nhất nó.Làm cách nào để hợp nhất tệp nhị phân?

Vì vậy, những gì tôi làm bây giờ là:

git checkout my_branch 
# make a change to gui.bin 
mv gui.bin ~/ 
git commit -a 
mv ~/gui.bin . 
git commit -a 
# git rebase to 1 commit 
git checkout master 
git merge my_branch 

Nhưng có một cách dễ dàng hơn?

+0

Xem thêm http: // stackoverflow.com/questions/1910444/git-merge-s-họ-cần-nhưng-i-know-it-không-tồn tại/1910479 # 1910479 – VonC

Trả lời

17

Tôi không chắc chắn trường hợp kiểm tra của bạn đang lái xe. Bạn dường như đang di chuyển gui.bin ra khỏi con đường và sau đó đưa nó trở lại theo cách của nó ...

Thông thường, các tệp nhị phân không cần phải hợp nhất, bạn chỉ muốn chọn một phiên bản chính xác từ một nơi này hay cách khác. Nơi mà họ thực sự phải được sáp nhập, bạn cần một công cụ hợp nhất tùy chỉnh, hoặc sử dụng một số loại trình soạn thảo và rất nhiều sự can thiệp thủ công.

Tôi nhận thấy rằng bạn sử dụng commit -a trong ví dụ của mình. Một bước đầu tiên để tránh xung đột không cần thiết là không cam kết bất kỳ tệp nhị phân nào có thể được chạm vào một cách ngẫu nhiên trừ khi bạn muốn cam kết chúng. Nếu bạn chỉ cần git add các tệp bạn cần cam kết và cam kết không có -a thì điều này sẽ giúp ích. Ngoài ra, nếu chỉ có một tệp mà bạn không muốn cam kết, bạn có thể add -u và đặt lại tệp đó trước khi thực hiện cam kết.

git add -u 
git reset -- dontcommit.dat 
git commit 

Khi bạn hợp nhất các chi nhánh có cả thay đổi nhị phân, bạn có thể muốn giữ một phiên bản chứ không phải phiên bản kia. Sau một merge nơi git nói với bạn rằng họ là những xung đột trong hệ nhị phân của bạn, bạn có thể nói cho git để sử dụng phiên bản tại các chi nhánh mà bạn đã như thế này:

git checkout --ours binary.dat 
git add binary.dat 

hoặc từ chi nhánh mà bạn đang sáp nhập trong như thế này :

git checkout --theirs binary.dat 
git add binary.dat 
+0

Bây giờ giao diện này thực sự tốt. Vì vậy, chỉ cần làm rõ. Nếu tôi đã thực hiện "git checkout master". Sau đó, tôi nên sử dụng khối mã cuối cùng với "của họ" và sau đó hợp nhất? – Louise

+0

Câu hỏi của bạn không rõ ràng đối với tôi. Nếu bạn đang ở trên 'master' (sau khi thanh toán thành công), và bạn' git merge otherbranch', nếu điều này tạo ra xung đột chỉ trong 'binary.dat' thì hai lệnh cuối cùng trong câu trả lời của tôi sẽ chọn phiên bản từ' otherbranch' và đánh dấu xung đột là đã giải quyết. Sau đó, bạn có thể 'git commit' cam kết xung đột được giải quyết. –

+0

Tuyệt vời. Thanks =) – Louise

10

bạn có thể sử dụng tích hợp trong trình điều khiển binary merge:

binary: Keep the version from your branch in the work tree, but 
leave the path in the conflicted state for the user to sort out. 

dụ .gitattributes dòng:

*.bin -crlf -diff merge=binary 

nói git không thêm dòng cuối, không để diff, và để giữ phiên bản địa phương

http://git-scm.com/docs/gitattributes

rằng chỉ giữ gìn bản sao làm việc của bạn ...

một cách khác là sử dụng một trình điều khiển tùy chỉnh hợp nhất:

[merge "binmerge"] 
    name = my binary merge script 
    driver = binmerge.sh %O %A %B 

Điều đó có thể kiểm tra các tập tin mâu thuẫn với một danh sách các tập tin mà phải luôn luôn được ghi đè bởi phiên bản địa phương của bạn. ..

sử dụng một trình điều khiển hợp nhất, định nghĩa nó trong cấu hình, sau đó xác định những gì con đường nó phải được sử dụng trên trong .gitattributes, như vậy:

*.bin -crlf -diff merge=binmerge 

binmerge.s h sẽ được gọi để xử lý hợp nhất. về cơ bản, chỉ cần thực hiện một số việc như:

#!/bin/sh 
echo "Performing merge of binary object ($1, $2, $3)" 
touch $2 
exit 0 
+0

Được rồi, trình điều khiển cho git hoàn toàn mới đối với tôi. Có phải cái gì tôi đưa vào tập tin cấu hình .git? – Louise

+1

yep, sẽ nằm trong ~/.gitconfig hoặc .git/config – jspcal

+0

Rất thú vị. Vậy tôi có nên thay đổi driver = gui.bin không? – Louise

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