2010-01-18 3 views
13

my_branch에 바이너리 파일이 있는데,이 파일을 변경해야 할 때, 물론 병합하지 않습니다.어떻게 바이너리 파일을 병합합니까?

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 

그러나 쉬운 방법이있다 :

그래서 내가 지금 할 것은?

+0

http : // stackoverflow도 참조하십시오.com/questions/1910444/git-merge-s-theirs-needed-but-i-know-itnt-exist/1910479 # 1910479 – VonC

답변

17

나는 당신의 테스트 케이스가 무엇을 몰고 가고 있는지 잘 모르겠습니다. 당신은 gui.bin을 방해하지 않고 원래대로 되돌려 놓는 것처럼 보입니다 ...

종종 바이너리 파일을 병합 할 필요가 없으며 하나의 최종 버전을 선택하기를 원할 것입니다 장소 또는 다른. 진정으로 병합해야하는 곳에서는 사용자 지정 병합 도구가 필요하거나 일종의 편집기와 많은 수동 개입이 필요합니다.

예를 들어 commit -a을 사용합니다. 불필요한 충돌을 피하기위한 첫 번째 단계는 커밋하고 싶지 않으면 부수적으로 건드릴 수있는 바이너리를 커밋하지 않는 것입니다. 단지 git add라면 커밋하고 커밋해야 할 파일이 -a이 아니면 도움이됩니다. 또는 커밋하고 싶지 않은 파일이 하나 뿐인 경우 add -u을 입력하고 커밋하기 전에 다시 설정할 수 있습니다.

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

두 바이너리가 모두 변경된 분기를 병합 할 때 한 버전 만 유지하고 다른 버전은 유지하지 않을 수 있습니다. 자식이 바이너리에 충돌 당신은 당신이 등에 있던 지점에있는 버전을 사용하는 자식을 알 수가 있습니다 있음을 알려줍니다 병합 후 :

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

또는이 같은에서 병합 된 지점에서

:

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

이제이 모양이 정말 좋습니다. 그래서 명확히하기 위해서. 내가 "자식 체크 아웃 마스터"를 완료했다면. 그런 다음 마지막 코드 블록을 "theirs"와 함께 사용하고 병합해야합니까? – Louise

+0

질문이 100 % 명확하지 않습니다. 'master' (성공적인 체크 아웃 후)이고'git merge otherbranch'이라면, 이것이'binary.dat'에서 충돌을 일으키면 마지막 두 명령은'otherbranch'에서 버전을 선택할 것입니다. 충돌을 해결 된 것으로 표시합니다. 해결 된 충돌을 저지르기 위해'git commit'을 할 수 있습니다. –

+0

우수. 감사합니다 =) – Louise

10

당신이 사용할 수있는 내장 binary 병합 드라이버 :

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. 

예를 줄 .gitattributes :

는, 라인 엔딩을 추가하지 diff를하지 않도록하고, 계속 자식을 알려줍니다

*.bin -crlf -diff merge=binary 
로컬 버전

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

그 단지 당신의 작업 복사본 ...

또 다른 방법은 사용자 정의 병합 드라이버를 사용하는이 보존 : 항상 로컬 버전 덮어 쓰기해야하는 파일의 목록에 대해 충돌하는 파일을 확인할 수 있습니다

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

.

*.bin -crlf -diff merge=binmerge 

binmerge.s을 ..

은과 같이,이 .gitattributes에서에 사용해야 어떤 경로 지정 후, 병합 드라이버를 사용하는 설정에서 정의하는 h는 병합 처리를 위해 호출됩니다. 그것은 본질적으로 단지 다음과 같이 할 수 있습니다 :

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

그래, git 용 드라이버는 완전히 새로운 것이다. 내가 .git config 파일에 넣은 것입니까? – Louise

+1

예, ~/.gitconfig 또는 .git/config에 들어갑니다. – jspcal

+0

매우 흥미 롭습니다. 그래서 나는 단지 driver = gui.bin을 변경해야합니까? – Louise

관련 문제