고기 대신 SW 한점/GIT

[Git]Conflict(충돌) 해결하기

지식한점 2022. 10. 7. 20:26
반응형

git merge명령어의 주요 책임은 개별 분기를 결합하여 충돌하는 편집 내용을 해결하는 것입니다.

 

병합(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는 저장소 또는 파일 상태 간의 차이를 찾는 데 도움이 됩니다.
이는 병합 충돌을 예측하고 방지하는 데 유용합니다.

 

 

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