source

이진 파일과의 Git 충돌 해결

ittop 2023. 6. 1. 22:55
반응형

이진 파일과의 Git 충돌 해결

Git on Windows(msysgit)를 사용하여 제가 수행하고 있는 일부 설계 작업에 대한 변경 사항을 추적하고 있습니다.

은 다른 한 PC(Remote repo를 사용한 PC) brian그리고 오늘 편집한 내용을 노트북의 일반 로컬 버전으로 다시 통합하려고 합니다.

내 노트북에서, 나는 사용했습니다.git pull brian master내 로컬 버전에 변경 사항을 적용할 수 있습니다.InDesign의 주요 문서를 제외하고는 문제가 없었습니다.

에 있는 (PC버전의(버)brian는 제가 에게 이 는 제가 보관하고 싶은 최신 것이지만 어떤 명령이 레포에게 이 명령을 사용하도록 지시하는지 모르겠습니다.

저는 노트북에 파일을 직접 복사하려고 했지만 이것이 전체 병합 과정을 방해하는 것 같습니다.

누가 나에게 올바른 방향을 가르쳐 줄 수 있습니까?

git checkout을 받아들입니다.--ours또는--theirs이런 경우에 대한 옵션.따라서 병합 충돌이 발생하고 병합할 분기의 파일만 원하는 경우 다음 작업을 수행할 수 있습니다.

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

파일의 해당 버전을 사용합니다.마찬가지로, 병합 중인 버전이 아닌 버전을 원하는 경우 사용할 수 있습니다.

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

충돌을 수동으로 해결한 다음(파일을 복사했는지 로컬 버전을 사용했는지 여부에 관계없이) 다음과 같이 파일을 커밋해야 합니다.

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

Git는 일반적으로 병합 후 자동 커밋되지만 자체적으로 해결할 수 없는 충돌을 감지하면 확인한 모든 패치를 적용하고 나머지는 사용자가 수동으로 해결하고 커밋할 수 있도록 남겨 둡니다.Git Merge Man 페이지, Git-SVN Crash Course 또는 이 블로그 항목을 통해 어떻게 작동해야 하는지 알아볼 수 있습니다.

편집: 아래 게시물을 참조하십시오. 실제로 파일을 복사할 필요는 없지만 사용할 수 있습니다.

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

원하는 파일 버전을 선택합니다.두 버전을 함께 사용하려는 경우에만 파일을 복사/편집해야 합니다.

미파디스 답변을 올바른 답변으로 표시해주시기 바랍니다.

당신은 또한 이 문제를 극복할 수 있습니다.

git mergetool

은 그원은을 유발합니다.git충돌하는 이진의 로컬 복사본을 만들고 기본 편집기를 생성합니다.

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

텍스트 편집기에서 이진 파일을 유용하게 편집할 수 없습니다.대신에 당신은 새로운 것을 복사합니다.{conflicted}.REMOTE줄을 지어 넘기다{conflicted}편집기를 닫지 않고.때 그런다편를닫으면기집음▁then면.git에서는 장식되지 않은 작업 복사본이 변경되고 병합 충돌이 일반적인 방법으로 해결되는 것을 확인할 수 있습니다.

현재 분기에 버전을 유지하고 병합 중인 분기에서 버전을 무시하여 해결하려면 파일을 추가하고 커밋하기만 하면 됩니다.

git commit -a

현재 분기의 버전을 병합 중인 분기의 버전으로 덮어쓰려면 먼저 해당 버전을 작업 디렉터리로 검색한 다음 추가/커밋해야 합니다.

git checkout otherbranch theconflictedfile
git commit -a

보다 상세하게 설명됨

미파디의 대답은 저에게 별로 효과가 없었습니다. 저는 이것을 해야 했습니다.

git checkout -- 우리의 경로/file.bin

또는 병합 중인 버전을 유지하는 방법:

git checkout --path/to/file.bin을 검색합니다.

그리고나서

git 경로/file.bin 추가

그리고 나서 저는 "git merge tool"을 다시 할 수 있었고 다음 갈등을 계속할 수 있었습니다.

문서에서

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

--ours
--theirs
때 stage 2stage #2)ours) 또는 #3(theirs병합되지 않은 경로의 경우.

이전에 병합에 실패했기 때문에 인덱스에 병합되지 않은 항목이 포함되어 있을 수 있습니다.기본적으로 인덱스에서 이러한 항목을 체크아웃하려고 하면 체크아웃 작업이 실패하고 아무것도 체크아웃되지 않습니다.용사를 합니다.-f병합되지 않은 항목은 무시됩니다.은 다음을사여병특측정 내 인 있 수 에 체 서 니 다 습 할 웃 아 크 스 덱 을 용 용 하 의 합 ▁by ▁using 니 ▁the 다 ▁index ▁be 있 습 ▁can ▁out ▁of ▁the ▁side ▁of ▁contents ▁from ▁checked ▁specific ▁merge--ours또는--theirs.와 함께-m작업 트리 파일의 변경 내용을 삭제하여 원래의 충돌된 병합 결과를 다시 만들 수 있습니다.

비슷한 문제(통합 시 충돌을 유발하는 일부 이진 파일이 포함된 커밋을 풀려고 함)가 발생했지만 Git를 사용하여 완전히 수행할 수 있는 다른 솔루션을 발견했습니다(즉, 수동으로 파일을 복사할 필요가 없음).최소한 다음에 필요할 때 기억할 수 있도록 여기에 포함하기로 했습니다. :) 단계는 다음과 같습니다.

% git fetch

원격 리포지토리에서 최신 커밋을 가져오지만(설정에 따라 원격 분기 이름을 지정해야 할 수도 있음) 병합은 시도하지 않습니다.FETCH_HEAD에 커밋을 기록합니다.

% git checkout FETCH_HEAD stuff/to/update

이렇게 하면 원하는 이진 파일의 복사본을 가져와 원격 분기에서 가져온 버전으로 작업 트리에 있는 내용을 덮어씁니다. git는 병합을 시도하지 않으므로 원격 분기에서 이진 파일의 정확한 복사본만 남게 됩니다.작업이 완료되면 일반적인 경우와 마찬가지로 새 복사본을 추가/커밋할 수 있습니다.

이 절차는 Github에 꺼내기 요청을 제출한 후 이진 파일 충돌을 해결하기 위한 것입니다.

  1. Github에서 풀 요청이 이진 파일에서 충돌한다는 것을 발견했습니다.
  2. 이제 로컬 컴퓨터의 동일한 Git 분기로 돌아갑니다.
  3. (a) 이 이진 파일을 다시 만들거나 다시 빌드하고 (b) 결과 이진 파일을 이 동일한 Git 분기에 커밋합니다.
  4. 그런 다음 같은 깃가지를 깃허브에 다시 밀어 넣습니다.

Github에서, 당신의 요청에 따라, 충돌은 사라질 것입니다.

Git on window를 사용하여 이진 파일의 diff/merge를 관리하는 두 가지 전략을 발견했습니다.

  1. Tortoise git을 사용하면 파일 확장명을 기반으로 다양한 파일 형식에 대한 diff/merge 도구를 구성할 수 있습니다.제2.35.4.3항 참조.Diff/Merge 고급 설정 http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html .물론 이 전략은 사용 가능한 적절한 diff/merge 도구에 의존합니다.

  2. git 속성을 사용하여 이진 파일을 텍스트로 변환하는 도구/명령을 지정한 다음 기본 diff/merge 도구가 수행하도록 할 수 있습니다.http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes 을 참조하십시오.이 기사는 메타데이터를 사용하여 이미지를 분산시키는 예도 제공합니다.

저는 소프트웨어 모델의 바이너리 파일로 작업하는 두 가지 전략을 모두 얻었지만, 구성이 쉬웠기 때문에 거북이 깃을 사용했습니다.

바이너리가 dll 이상이거나 이미지 또는 혼합 파일처럼 직접 편집할 수 있는 이라면(파일 하나를 휴지통에 버리거나 선택할 필요가 없음) 실제 병합은 다음과 같습니다.

예를 들어 이미지 파일에 대한 일부 무료 파일이 있습니다. 예를 들어, 당신의 이진 파일이 무엇인지에 대한 diff 도구를 검색하는 것이 좋습니다.

  • npm install - https://github.com/uber/image-diff 의 gimage diff IIRC
  • 또는 python https://github.com/kaikuehne/mirror.git
  • 다른 사람들이 있습니다.

그것들을 비교해 보세요.

파일을 비교할 수 있는 diff 도구가 없다면, bin 파일의 원본 생성기가 있다면(즉, 편집기가 있습니다...)블렌더 3d처럼 수동으로 해당 파일을 검사하고 로그를 확인한 후 다른 사람에게 무엇을 포함해야 하는지 물어볼 수 있습니다.) 그리고 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

저는 Git Workflow for Excel - https://www.xltrail.com/blog/git-workflow-for-excel 응용 프로그램을 사용하여 바이너리 파일과 관련된 병합 문제를 대부분 해결합니다.이 오픈 소스 앱을 사용하면 많은 시간을 들이지 않고 문제를 생산적으로 해결할 수 있으며 혼란 없이 올바른 버전의 파일을 선택할 수 있습니다.

내 케이스는 벌레 같아요.git 2.21.0 사용

내가 잡아당긴 건...바이너리 파일에 대해 불평했습니다.

warning: Cannot merge binary files: <path>
Auto-merging <path>
CONFLICT (content): Merge conflict in <path>
Automatic merge failed; fix conflicts and then commit the result.

그리고 여기에 있는 어떤 대답도 어떤 결과도 의미있는 결과를 낳지 못했습니다.

제가 지금 가지고 있는 파일을 보면...제가 편집한 거예요.다음 중 하나를 수행할 경우:

git checkout --theirs -- <path>
git checkout --ours -- <path>

출력이 표시됩니다.

Updated 0 paths from the index

제 버전의 파일을 아직 가지고 있습니다.확인하고 체크아웃하면 1로 표시되지만 파일 버전이 표시됩니다.

기트머제툴이 말합니다.

No files need merging

그리고 git 상태는 말합니다.

    All conflicts fixed but you are still merging.
    (use "git commit" to conclude merge)

가지 방법은 커밋을 취소하는 것입니다...하지만 저는 운이 나빴고 많은 죄를 지었습니다. 그리고 이 나쁜 죄가 첫 번째였습니다.저는 그것을 반복하는 데 시간을 낭비하고 싶지 않습니다.

그래서 이 광기를 해결하기 위해:

방금 뛰었습니다

git commit

그러면 원격 버전이 손실되고 추가 이진 파일을 저장하는 공간이 낭비될 수 있습니다.그리고나서

git checkout <commit where the remote version exists> <path>

원격 버전을 돌려받을 수 있습니다.

그리고 나서 파일을 다시 편집했습니다...그런 다음 커밋하고 푸시합니다. 이는 다시 바이너리 파일의 다른 복사본으로 공간을 낭비하는 것을 의미합니다.

언급URL : https://stackoverflow.com/questions/278081/resolving-a-git-conflict-with-binary-files

반응형