programing

git merge: 다른 파일로 이동한 코드에 변경 사항 적용

topblog 2023. 6. 22. 21:24
반응형

git merge: 다른 파일로 이동한 코드에 변경 사항 적용

나는 지금 꽤 힘든 Git merge 작전을 시도하고 있습니다.제가 직면한 한 가지 문제는 제 지점에서 일부 코드를 변경했는데 제 동료가 그 코드를 지점의 새 파일로 옮겼다는 것입니다.그래서 내가 했을 때git merge my_branch his_branch새하다는 것을 못했기 이 없습니다.git새 파 일 의 코 드 가 파 따 동 내 변 사 은 항 경 없 습 니 다 라 서 고 못 했 다 는 하 는 일 것 과 을 일 알 차 리 지 아 이 전 ▁g 없 g it 습 다 니 ▁are 은 ▁of ▁changes ▁there ▁was 사 ▁in ▁that it 항 ▁and

변경 사항을 새 파일의 코드에 다시 적용하는 가장 쉬운 방법은 무엇입니까?적용해야 데 큰git log --stat하지만 제가 알기로는 변경 사항을 새 파일에 다시 적용할 수 있는 git을 얻을 수 있는 방법이 없습니다.제가 지금 보고 있는 가장 쉬운 방법은 수동으로 변경사항을 다시 적용하는 것인데, 이는 좋은 생각 같지 않습니다.

나는 Git이 파일이 아닌 블롭을 인식한다는 것을 알고 있기 때문에, 확실히 "이 커밋에서 이 정확한 코드 변경을 적용하라, 이 새 파일의 위치가 아닌 현재 위치를 제외하고."라고 말할 수 있는 방법이 있어야 합니다.

저도 비슷한 문제가 있었는데, 대상 파일 구성에 맞게 작업을 다시 기초하여 해결했습니다.Git가 파일 내용을 추적하기 때문에 이 기능이 작동합니다. 따라서 이름 변경 위에 재배치함으로써 필요에 따라 변경사항이 적용됩니다.

좀 더 정확하게 말하자면, 당신이 수정했다고 가정해 봅시다.original.txtlocal 브랜치, 브랜치), 그나에마터스 브랜치는original.txt예를 들어, 다른 것으로 복사되었습니다.copy.txt가 커밋이라고 되었습니다.CP.

변경사항을 모두 하려면 커밋합니다.A그리고.B 아래, 그은들것에 .original.txt 파일로copy.txt.

 ---- X -----CP------ (master)
       \ 
        `--A---B--- (local)
 

분기 move변화의 시작점에서git branch move X다시 말해서, 그것을 넣으시오.moveX병합할 커밋 앞에 있는 커밋. 대부분의 경우 변경사항을 구현하기 위해 분기한 커밋입니다.@digorydoo 사용자가 아래에 썼듯이, 당신은 할 수 있습니다.git merge-base master local찾기 위해서.X.

 ---- X (move)-----CP----- (master)
       \ 
        `--A---B--- (local)
 

이 분기에서 다음 이름 바꾸기 명령을 실행합니다.

git mv original.txt copy.txt

파일 이름이 바뀝니다.:copy.txt이 시점에서 트리에 아직 없습니다.
사항을 커밋합니다(이 커밋의 은 "commit"("commit").MV).

        ,--MV (move)
       /
 ---- X -----CP----- (master)
       \ 
        `--A---B--- (local)
 

이제 작업의 기본을 변경할 수 있습니다.move:

git rebase move local

없이 이고, 은 이은문이작것고이할당변, 적것입다니다용될음에은항사경것신의제에 적용됩니다.copy.txt당신의 지역 지점에서.

        ,--MV (move)---A'---B'--- (local)
       /
 ---- X -----CP----- (master)
 

은 반드시 커밋을 가 없습니다.MV이동 작업이 커밋 시 복사 작업과 충돌할 수 있기 때문에 주요 지점의 기록에서CP본점에서

다음과 같이 이동 작업을 취소하고 작업의 기본을 다시 설정하기만 하면 됩니다.

git rebase move local --onto CP

서...어디에CP는 의커입다니밋이 있는 입니다.copy.txt다른 분기에 도입되었습니다. 하면 모변경내기합니다로반으용을든▁▁the▁changes다▁this합니▁rebases모copy.txt을 제외하고CP저지르다.자, 당신의local 수정한 것과 .copy.txt그리고 아닌original.txt그리고 다른 사람들과 병합을 계속할 수 있습니다.

                ,--A''---B''-- (local)
               /
 -----X-------CP----- (master)
 

은 변경사적것중요다니합이는용하을항▁on다▁▁it▁important▁the▁is 중요합니다.CP 않으면 지렇않면으그.copy.txt 변경 은 존하지않사다적용됩다니시이항변경에 다시 됩니다.original.txt.

이것이 확실하기를 바랍니다.이 답변은 늦게 오지만 다른 사람에게 유용할 수 있습니다.

언제든지 사용할 수 있습니다.git diff(또는)git format-patch하고 를 사용하여 합니다.git apply(또는)git am).

이를 제외하고는 Git의 이름 바꾸기 탐지 기능이 이전 파일과 새 파일이 동일한지 확인할 수 있는 경우에만 자동으로 작동합니다. 이는 해당 파일이 실제로는 해당 파일의 일부가 아닌 것처럼 들립니다.Git가 파일이 아닌 블롭을 사용하는 것은 사실이지만, 블롭은 파일 이름과 메타데이터가 첨부되지 않은 전체 파일의 내용일 뿐입니다.따라서 두 개의 파일 사이에 코드 덩어리가 이동된 경우, 그것들은 실제로 동일한 블롭이 아닙니다. 나머지 블롭의 내용은 서로 다르며, 단지 공통적인 블롭일 뿐입니다.

다음은 이름 변경 및 편집을 통해 병합 충돌이 발생하고 올바른 병합 원본 파일 3개를 인식하는 병합 도구로 해결하는 병합 솔루션입니다.

  • '삭제된 파일'로 인해 병합이 실패한 후 이름이 변경되고 편집되었습니다.
  1. 병합을 중단합니다.
  2. 분기에서 이름이 변경된 파일을 커밋합니다.
  3. 그리고 다시 합쳐집니다.

검토:

파일을 만듭니다.txt:

$ git init
Initialized empty Git repository in /tmp/git-rename-and-modify-test/.git/

$ echo "A file." > file.txt
$ git add file.txt
$ git commit -am "file.txt added."
 [master (root-commit) 401b10d] file.txt added.
 1 file changed, 1 insertion(+)
 create mode 100644 file.txt

나중에 편집할 분기를 만듭니다.

$ git branch branch-with-edits
 Branch branch-with-edits set up to track local branch master. 

마스터에서 이름 변경 및 편집:

$ git mv file.txt renamed-and-edited.txt
$ echo "edits on master" >> renamed-and-edited.txt 
$ git commit -am "file.txt + edits -> renamed-and-edited.txt."
 [master def790f] file.txt + edits -> renamed-and-edited.txt.
 2 files changed, 2 insertions(+), 1 deletion(-)
 delete mode 100644 file.txt
 create mode 100644 renamed-and-edited.txt

분기로 스왑하고, 분기에서도 편집합니다.

$ git checkout branch-with-edits 
 Switched to branch 'branch-with-edits'
 Your branch is behind 'master' by 1 commit, and can be fast-forwarded.
 (use "git pull" to update your local branch)
$ 
$ echo "edits on branch" >> file.txt 
$ git commit -am "file.txt edited on branch."
 [branch-with-edits 2c4760e] file.txt edited on branch.
 1 file changed, 1 insertion(+) 

마스터 병합 시도:

$ git merge master
 CONFLICT (modify/delete): file.txt deleted in master and modified in HEAD. Version HEAD of file.txt left in tree.
 Automatic merge failed; fix conflicts and then commit the result. 

충돌을 해결하기 어렵고 파일 이름이 변경되었습니다.중단, 이름 바꾸기 흉내내기:

$ git merge --abort
$ git mv file.txt renamed-and-edited.txt
$ git commit -am "Preparing for merge; Human noticed renames files were edited."
 [branch-with-edits ca506da] Preparing for merge; Human noticed renames files were edited.
 1 file changed, 0 insertions(+), 0 deletions(-)
rename file.txt => renamed-and-edited.txt (100%) 

병합 다시 시도:

$ git merge master
 Auto-merging renamed-and-edited.txt
 CONFLICT (add/add): Merge conflict in renamed-and-edited.txt
 Recorded preimage for 'renamed-and-edited.txt'
 Automatic merge failed; fix conflicts and then commit the result. 

좋습니다! 병합하면 병합 도구로 해결할 수 있는 '정상' 충돌이 발생합니다.

$ git mergetool
 Merging:
 renamed-and-edited.txt

 Normal merge conflict for 'renamed-and-edited.txt':
 {local}: created file
 {remote}: created file
$ git commit 
 Recorded resolution for 'renamed-and-edited.txt'.
 [branch-with-edits 2264483] Merge branch 'master' into branch-with-edits 

이 문제에 대한 저의 빠른 해결책은 다음과 같습니다(나의 경우 단일 파일이 아니라 전체 디렉터리 구조였습니다).

  • "my_message"에 있는 파일을 "his_message"에 있는 위치로 이동합니다(gitrm / git add).
  • git commit -m "moved to original location for merging"
  • git merge his_branch(이번에는 충돌 없음!)
  • 원하는 위치로 파일 이동(gitrm / git add)
  • git commit -m "moved back to final location after merge"

기록에 두 개의 추가 커밋이 있습니다.

에, 지만하파일이추이적때기문에하을동의,때▁but에문,▁g▁the▁files▁since기it추.git blame,git log파일을 이동한 커밋이 변경하지 않았기 때문에 등은 이러한 파일에서 계속 작동합니다.그래서 저는 이 방법에 어떤 단점이 있다고 생각하지 않으며 이해하기가 매우 간단합니다.

언급URL : https://stackoverflow.com/questions/3491270/git-merge-apply-changes-to-code-that-moved-to-a-different-file

반응형