Nice programing

git에서 서로 다른 디렉토리 계층을 가진 두 가지 분기를 병합하는 방법은 무엇입니까?

nicepro 2020. 11. 29. 12:16
반응형

git에서 서로 다른 디렉토리 계층을 가진 두 가지 분기를 병합하는 방법은 무엇입니까?


웹 애플리케이션 프로젝트와 함께 Maven을 사용하기 시작했기 때문에 디렉토리 계층이 변경되었습니다. Maven 통합을위한 새 분기를 만들었습니다. 이제 두 개의 분기가 이전 디렉토리 계층 구조와 Maven 디렉토리 계층 구조를 가진 분기가 있습니다. 두 가지 모두 새로운 커밋 (버그 수정 및 새로운 기능)이 있습니다.

이전 분기를 제거하고 Maven 분기의 변경 사항을 병합하고 싶습니다. Git 병합은 해결할 수없는 것처럼 느껴지는 수많은 충돌을 제공합니다. 파일 경로가 변경 되었기 때문이라고 생각합니다.

이 병합에 접근하는 가장 좋은 방법은 무엇입니까?


merge.renameLimit이 병합을 위해 높게 설정하십시오 . git은 이름 변경을 감지하려고 시도하지만 O (n ^ 2) 처리 시간이 필요하기 때문에 파일 수가이 제한 미만인 경우에만 :

git config merge.renameLimit 999999

그런 다음 완료되면 :

git config --unset merge.renameLimit

블로그 게시물 " Confluence, git, rename, merge oh my… "는 Robie답변 을 설명하는 흥미로운 정보를 추가합니다 (upvoted) :

이름 바꾸기를 감지하려고 할 때 git은 다음을 사용하여 정확한 이름과 부정확 한 이름구분합니다 .

  • 전자는 파일의 내용을 변경하지 않고 이름을 변경하고
  • 후자는 파일 내용에 대한 변경을 포함 할 수있는 이름 바꾸기 (예 : Java 클래스 이름 변경 / 이동)입니다.

정확한 이름 변경을 감지하는 알고리즘은 선형이고 정확하지 않은 이름 변경 감지 알고리즘이 2 차 ( O(n^2))이고 변경된 파일 수가 특정 임계 값 (1000 x 1000)을 초과하는 경우 git은이를 수행하지 않기 때문에 이러한 구별이 중요 합니다. 기본).

명시 적으로 설정되지 않은 경우 merge.renameLimit기본값은 1000 개 파일로 설정되거나 diff.renameLimit설정된 경우 값을 사용합니다 .
(가) diff.renameLimit에 영향을 git diff, git show그리고 git log동안은 merge.renameLimit병합 시도에 적용 ( git merge, git cherry-pick) 만.

git이 출력을 보는 것과 같은 일반적인 작업 중에 이름 바꾸기를 찾지 않도록 merge.renameLimit변경하는 대신를 변경하는 것이 좋습니다 .diff.renameLimitgit diff

이름 바꾸기를 표시하려면 이름 바꾸기 감지를 켜는 옵션 과 함께 git show또는 같은 명령을 git log사용할 수 있습니다 -M.

Linus는 다음과 같이 언급합니다 .

예, 커널의 경우

    [diff]
            renamelimit=0

기본 제한이 실제로 매우 낮기 때문에 제한을 완전히 비활성화합니다. 힘내는 이름 바꾸기 감지에 아주 능숙합니다.

그러나 기본값이 낮은 이유는 충분하지 않기 때문이 아니라 메모리를 많이 사용하게 될 수 있기 때문입니다 (메모리가 부족한 경우 스와핑은 "매우 깔끔함"에서 "당밀처럼 느리다"-그러나 여전히 CPU 제한이 없으며 미친 듯이 페이징입니다.)

참고 URL : https://stackoverflow.com/questions/4722423/how-to-merge-two-branches-with-different-directory-hierarchies-in-git

반응형