git merge명령어의 주요 책임은 개별 분기를 결합하여 충돌하는 편집 내용을 해결하는 것입니다.
![](https://blog.kakaocdn.net/dn/bPiemS/btrN3LVtOZ8/GvGKYCycF2xbsd19wahGK0/img.png)
병합(Merge) 충돌(conflict) 이해
Marge와 conflicts는 Git 익스피리언스의 공통적인 부분입니다.
SVN과 같은 다른 버전 제어 도구와의 충돌은 비용과 시간이 많이 소요될 수 있습니다.
Git은 매우 쉽게 병합할 수 있습니다.
대부분의 경우 Git은 새로운 변경 사항을 자동으로 통합하는 방법을 알아냅니다.
일반적으로 두 사람이 파일의 동일한 행을 변경하거나 다른 개발자가 파일을 수정하는 동안
한 개발자가 파일을 삭제했을 때 충돌이 발생합니다.
이 경우 Git은 자동으로 무엇이 옳은지 판단할 수 없습니다.
충돌은 병합을 수행하는 개발자에게만 영향을 미치며,
나머지 팀원들은 충돌에 대해 알지 못합니다.
Git은 파일을 충돌하는 것으로 표시하고 병합 프로세스를 중지합니다.
그러면 갈등을 해결하는 것은 개발자의 책임입니다.
병합(Merge) 충돌 유형
병합은 두 개의 개별 지점에서 충돌 상태가 될 수 있습니다.시작 시 및 병합 프로세스 중.
다음은 이러한 각 충돌 시나리오에 대처하는 방법에 대한 설명입니다.
Git Merge fail.
Git이 현재 프로젝트의 작업 디렉토리 또는 스테이징 영역에 변경이 있음을 알게 되면 병합이 시작되지 않습니다.
Git은 머지를 시작할 수 없습니다.
이는 이러한 보류 중인 변경사항이 머지 중인 커밋에 의해 덮어쓰기될 수 있기 때문입니다.
이 경우 다른 개발자와의 경합이 아니라 보류 중인 로컬 변경사항과의 경합이 발생합니다.
로컬 상태는 다음 방법으로 안정화해야 합니다.
git stash, git checkout, git commit 또는 git reset.
시작 시 병합 실패 시 다음 오류 메시지가 출력됩니다.
error: Entry '<fileName>' not uptodate. Cannot merge. (Changes in working directory)
병합 중 Git 실패
병합 중 오류는 현재 로컬 지점과 병합 중인 지점 간의 충돌을 나타냅니다.
이는 다른 개발자 코드와의 충돌을 나타냅니다.
Git은 파일을 Marge하기 위해 최선을 다하지만 충돌하는 파일에는 수동으로 해결할 수 있도록 남겨둡니다.
Mid Merge 장애는 다음 오류 메시지를 출력합니다.
error: Entry '<fileName>' would be overwritten by merge. Cannot merge. (Changes in staging area)
병합 충돌 생성
머지 경합을 실제로 이해하기 위해 다음 섹션에서는 경합을 시뮬레이션하여 나중에 검토하고 해결합니다.
이 예에서는 Unix와 유사한 명령줄 Git 인터페이스를 사용하여 시뮬레이션을 실행합니다.
$ mkdir git-merge-test
$ cd git-merge-test
$ git init .
$ echo "this is some content to mess with" > merge.txt
$ git add merge.txt
$ git commit -am"we are commiting the inital content"
[main (root-commit) d48e74c] we are commiting the inital content
1 file changed, 1 insertion(+)
create mode 100644 merge.txt
이 코드 예에서는 다음 작업을 수행하는 일련의 명령을 실행합니다.
- 다음 이름의 새 디렉토리 생성git-merge-test,해당 디렉토리로 변경하고 새로운 Git repo로 초기화합니다.
- 새 텍스트 파일 만들기merge.txt내용물이 들어있어요.
- 더하다merge.txt책임지고 커밋할 수 있습니다.
이제 지점 하나와 함께 새로운 리포(repo)를 갖게 되었습니다.
main및 파일 merge.txt 내용물이 들어있어요.
다음으로 경합하는 머지로 사용할 새로운 브런치를 만듭니다.
$ git checkout -b new_branch_to_merge_later
$ echo "totally different content to merge later" > merge.txt
$ git commit -am"edited the content of merge.txt to cause a conflict"
[new_branch_to_merge_later 6282319] edited the content of merge.txt to cause a conflict
1 file changed, 1 insertion(+), 1 deletion(-)
진행 중인 명령어시퀀스는 다음 작업을 수행합니다.
- 라는 이름의 새 지점을 만들고 체크아웃합니다.new_branch_to_merge_later
- 내용을 덮어쓰다merge.txt
- 새로운 콘텐츠를 커밋하다
이 새로운 브랜치에서는:new_branch_to_merge_later델은, 다음의 내용을 덮어쓰는 커밋을 작성했습니다.merge.txt
git checkout main
Switched to branch 'main'
echo "content to append" >> merge.txt
git commit -am"appended content to merge.txt"
[main 24fbe3c] appended content to merge.tx
1 file changed, 1 insertion(+)
이 일련의 명령어는 main브랜치, 콘텐츠 추가merge.txt 커밋합니다.
이것으로 예시는 2개의 새로운 커밋이 있는 상태가 되었습니다.
main브랜치 1개 new_branch_to_merge_later 분점.
현시점에서는, 다음과 같이 한다.
git merge new_branch_to_merge_later 무슨 일이 일어날지 지켜보자!
$ git merge new_branch_to_merge_later
Auto-merging merge.txt
CONFLICT (content): Merge conflict in merge.txt
Automatic merge failed; fix conflicts and then commit the result.
BOOM 💥 충돌이 나타납니다.
병합 충돌 식별 방법
진행 예에서 경험했듯이 Git은 CONFLCT가 발생했음을 알려주는 몇 가지 설명적인 출력을 생성합니다.
다음 명령을 실행하면 더 많은 정보를 얻을 수 있습니다. git status명령어
$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: merge.txt
git status에, 경합으로 인해 Marge되지 않은 패스가 있는 것을 나타냅니다.
그 merge.text파일이 수정된 상태로 표시됩니다.
파일을 살펴보고 수정된 내용을 살펴봅시다.
$ cat merge.txt
<<<<<<< HEAD
this is some content to mess with
content to append
=======
totally different content to merge later
>>>>>>> new_branch_to_merge_later
여기에서는,cat의 내용을 출력하기 위한 명령어merge.txt 파일입니다.
우리는 몇 가지 이상한 새로운 추가사항을 볼 수 있습니다.
- <<<<<<< HEAD
- =======
- >>>>>>> new_branch_to_merge_later
이 새로운 선을 "충돌 구분선"이라고 생각하십시오.
=======line은 컨플릭트의 "중심"입니다.
센터와 데이터 센터 사이의 모든 콘텐츠<<<<<<< HEADline은 현재 브랜치메인에 존재하는 콘텐츠입니다.
HEAD참조가 가리키고 있습니다.
또는 센터와 사이의 모든 콘텐츠>>>>>>> new_branch_to_merge_later합병 브랜치에 존재하는 콘텐츠입니다.
명령줄을 사용하여 병합 충돌을 해결하는 방법
병합 충돌을 해결하는 가장 직접적인 방법은 충돌 파일을 편집하는 것입니다.
merge.txt파일을 즐겨찾기 에디터에 저장합니다.
이 예에서는 모든 컨플릭트디바이더를 간단하게 삭제합니다.
수정한merge.txt내용은 다음과 같습니다.
this is some content to mess with
content to append
totally different content to merge later
파일을 편집한 후 다음을 사용합니다.
git add merge.txt새 병합된 콘텐츠를 준비합니다.
병합을 완료하려면 다음 작업을 수행하여 새 커밋을 만듭니다.
git commit -m "merged and resolved the conflict in merge.txt"
Git은 경합이 해결되었음을 확인하고 새로운 병합 커밋을 생성하여 병합을 완료합니다.
병합 충돌을 해결하는 데 도움이 되는 Git 명령어
일반 도구
git status
Status 명령어는 Git에서 작업할 때 자주 사용되며 Marge 중에 충돌하는 파일을 식별하는 데 도움이 됩니다.
git log --merge
통과:--merge에 대한 의론git log명령어는 병합 브랜치 간에 경합하는 커밋 목록을 포함하는 로그를 생성합니다.
git diff
diff는 저장소 또는 파일 상태 간의 차이를 찾는 데 도움이 됩니다.
이는 병합 충돌을 예측하고 방지하는 데 유용합니다.
![](https://blog.kakaocdn.net/dn/cgNkBi/btrN4P3IX9w/EKlpGrUiMYiYPEQyn7p30K/img.png)
git이 병합을 시작하지 못했을 때 사용하는 도구
git checkout
checkout파일 변경 취소 또는 분기 변경에 사용할 수 있습니다.
git reset --mixed
reset를 사용하여 작업 디렉토리 및 스테이징 영역에 대한 변경을 취소할 수 있습니다.
병합 중 git 충돌이 발생할 때 사용하는 도구
git merge --abort
실행 중git merge와 함께--abort옵션을 지정하면 머지 프로세스가 종료되고 브런치가 머지 시작 전 상태로 돌아갑니다.
git reset
Git reset머지 컨플릭트시에, 경합하는 파일을 정상적인 상태로 리셋 하기 위해서 사용할 수 있습니다.
요약
Marge conflicts는 위협적인 경험이 될 수 있습니다.
다행히도 Git은 충돌을 탐색하고 해결하는 데 도움이 되는 강력한 도구를 제공합니다.
Git은 자동 병합 기능으로 대부분의 병합을 혼자서 처리할 수 있습니다.
두 개의 분기가 파일의 동일한 행을 편집하거나 한 분기에서 파일을 삭제했지만
다른 분기에서 편집한 경우 충돌이 발생합니다.
팀 환경에서 작업할 때 충돌이 발생할 수 있습니다.
병합 충돌을 해결하는 데 도움이 되는 많은 도구가 있습니다.
Git에는 여기서 설명한 명령줄 툴이 많이 있습니다.
이러한 툴에 대한 자세한 내용은 다음 웹 사이트를 참조하십시오.
git log,git reset, git status,git checkout,
그리고.git reset 이외에도 많은 서드파티 툴이 효율적인 머지 컨플릭트 지원 기능을 제공합니다.
'고기 대신 SW 한점 > GIT' 카테고리의 다른 글
[git] Branch 브랜치 끝장내기 2 (0) | 2022.10.20 |
---|---|
[git] Branch 브랜치 끝장내기 1 (0) | 2022.10.20 |
[Git] 개념잡기 1 (시작하기) (1) | 2022.10.07 |
[Git]cherry-pick : 끝장내기 (0) | 2022.10.06 |
SW version 관리 (0) | 2022.09.28 |