git merge : 보관하고 싶은 파일 제거!
브랜치에서 필요한 파일을 유지하면서 git에서 두 브랜치를 어떻게 병합 할 수 있습니까?
두 브랜치를 병합 할 때 파일이 다른 브랜치가 아닌 한 브랜치에서 삭제 된 경우 파일이 최종적으로 삭제됩니다.
예를 들면 :
- 새 분기를 만들 때 마스터에 파일이 있습니다.
- 필요하지 않기 때문에 마스터에서 파일을 제거합니다 (아직)
- 기존 파일에 의존 하는 기능을 추가하기 위해 분기를 변경 합니다.
- 마스터에서 버그 수정을 수행 합니다 (삭제할 수 없음).
- 당신은 언젠가 병합하고 파일이 사라졌습니다!
재현 방법 :
하나의 파일로 git 저장소를 만듭니다.
git init echo "test" > test.txt git add . git commit -m "initial commit"
브랜치 생성
git branch branchA
마스터에서 파일 삭제
git rm test.txt git commit -m "removed file from master"
삭제 된 파일을 건드리지 않는 branchA를 변경하십시오 (충돌을 피하기 위해 변경되지 않아야 함)
git checkout branchA touch something.txt git add . git commit -m "some branch changes"
여기에서이 두 가지를 병합하는 방법을 발견하면 test.txt 파일이 삭제됩니다. 에 대한 파일 에 의존 한다고 가정하면 branchA
이것은 큰 문제입니다.
실패한 예 :
병합 1
git checkout branchA
git merge master
ls test.txt
2 병합
git checkout master
git merge branchA
ls test.txt
리베이스 1
git checkout branchA
git rebase master
ls test.txt
이것은 흥미로운 문제입니다. 당신이 후 파일을 삭제하기 때문에 BranchA
생성 한 다음 병합하는 master
에 BranchA
, 나는 확실하지 망할 놈의 충돌이 실감 할 수있을 것입니다 방법입니다.
잘못된 병합 후에는 실행을 취소 한 다음 다시 병합 할 수 있지만 파일을 다시 추가합니다.
git checkout HEAD@{1} .
git merge --no-commit master
git checkout master test.txt
git add test.txt
git commit
이 경우 빠른 수정을 위해 파일을 삭제 한 커밋을 "git revert"합니다.
When this situation comes up in the future, the better way to handle it is to ensure that the creation of the new file happens on the branch. Then it gets added on master when you merge, but you don't have the file lying around in master in the meantime.
Casey's example didn't work for my case - I couldn't checkout test.txt
from master
, because it was no longer in that branch:
$ git checkout master test.txt
error: pathspec 'test.txt' did not match any file(s) known to git.
Happily I could pull the file out of branchA
's own HEAD
:
$ git checkout branchA
$ git merge --no-commit master
$ git checkout HEAD test.txt
$ git add test.txt
$ git commit
You need to modify the file in the branch, so that there's a merge conflict with the delete in the trunk.
The exact same thing will happen if you, for example, delete a declaration for something in a headerfile in the trunk (because nothing needs it), and add a dependency on that declaration to some non-header file(s) in the branch. When you merge, since the branch doesn't touch (that part of) the header, it will just delete the declaration and things will break.
Whenever you have stuff in multiple places that is interdependent and needs to be kept in sync, its very easy for a merge to silently introduce problems. Its just one of the things you have to know about and check when merging. Ideally, you use compile-time asserts or other build time checks that will make any failures immediately apparent.
My solution to this was to simply modify the files I needed to keep (added a comment which was needed anyway) and commit those changes on the target branch, thus generating a merge conflict which could easily be resolved with a git add
and a normal commit.
My history went something like this. Branch names have been changed to protect the innocent.
- create and commit files for a new feature to master
- realize this addition going to be more involved than originally planned, thus, branched to feature_branch
- Removed files from master so as not to disrupt normal workflow with RBs and such
- Time passes, more commits on master, none on feature_branch
- Resume work on the feature,
git merge master
on feature_branch causes original files to be removed (of course),git reset --hard
to before the merge - Applied the solution described above
ReferenceURL : https://stackoverflow.com/questions/1407638/git-merge-removing-files-i-want-to-keep
'development' 카테고리의 다른 글
람다는 정적 멤버 함수를 호출하기 위해 'this'를 캡처해야합니까? (0) | 2021.01.08 |
---|---|
생성자 참조-제네릭 배열이 생성 될 때 경고 없음 (0) | 2021.01.08 |
여러 javascript / css 파일 : 모범 사례? (0) | 2021.01.08 |
봄 보안 AuthenticationManager 대 AuthenticationProvider? (0) | 2021.01.08 |
원시 포인터에서 shared_ptr 만들기 (0) | 2021.01.08 |