Git 에서 파일에 충돌이 있는지 확인하는 방법

GitBeginner
지금 연습하기

소개

이 랩에서는 Git 에서 병합 충돌을 식별하고 이해하는 방법을 배우게 됩니다. 서로 다른 브랜치에서 동일한 파일에 충돌하는 변경 사항을 적용한 다음 병합을 시도하여 충돌 시나리오를 시뮬레이션합니다.

git status 명령을 사용하여 충돌의 존재를 감지한 다음, 충돌된 파일을 검사하여 Git 이 삽입한 충돌 마커를 확인합니다. 마지막으로, 충돌이 없는 파일이 해당 파일로 표시되지 않는지 확인합니다.

git status 실행하여 충돌 감지

이 단계에서는 git status 명령을 사용하여 Git 저장소에서 충돌을 감지하는 방법을 배우겠습니다. 충돌은 파일의 동일한 부분에 서로 다른 두 가지 변경 사항이 적용되었을 때 발생하며, Git 은 어떤 변경 사항을 유지해야 할지 알 수 없습니다.

먼저, 프로젝트 디렉토리에 있는지 확인해 보겠습니다. 터미널을 열고 my-time-machine 디렉토리로 이동합니다.

cd ~/project/my-time-machine

이제 충돌을 시뮬레이션해 보겠습니다. 당신과 협력자가 모두 message.txt 파일에 동시에 변경 사항을 적용했지만 서로 다른 브랜치에서 변경했다고 가정해 봅시다. 이 랩에서는 충돌을 유발하는 시나리오를 수동으로 생성합니다.

먼저, 새로운 브랜치를 생성하고 변경 사항을 적용해 보겠습니다.

git branch feature/greeting
git checkout feature/greeting
echo "Hope you are doing well!" >> message.txt
git add message.txt
git commit -m "Add a greeting"

이제 master 브랜치로 다시 전환하여 동일한 파일에 다른 변경 사항을 적용해 보겠습니다.

git checkout master
echo "This is an important message." >> message.txt
git add message.txt
git commit -m "Add an important message"

이제 서로 다른 두 브랜치에 message.txt에 대한 두 가지 다른 변경 사항이 있습니다. 이러한 브랜치를 병합하려고 하면 Git 이 충돌을 감지합니다.

feature/greeting 브랜치를 master에 병합해 보겠습니다.

git merge feature/greeting

충돌을 나타내는 출력을 볼 수 있습니다.

Auto-merging message.txt
CONFLICT (content): Merge conflict in message.txt
Automatic merge failed; fix conflicts and then commit the result.

이 출력은 message.txt 파일에 병합 충돌이 있음을 알려줍니다. Git 은 변경 사항이 겹쳐서 자동으로 병합할 수 없었습니다.

이제 git status를 실행하여 Git 이 충돌을 어떻게 보고하는지 확인해 보겠습니다.

git status

출력은 다음과 유사합니다.

On branch master
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 resolve merge conflicts)
        both modified:   message.txt

no changes added to commit (use "git add" and/or "git commit -a)")

git status 출력은 "On branch master"이고 "unmerged paths"가 있음을 명확하게 보여줍니다. 또한 "Unmerged paths" 아래에 message.txt를 나열하고 "both modified"라고 표시합니다. 이것이 git status가 병합 충돌이 있는 파일을 식별하는 방식입니다.

git status를 사용하여 충돌을 감지하는 방법을 이해하는 것은 충돌을 해결하는 첫 번째 단계입니다. 다음 단계에서는 충돌된 파일을 검사하고 충돌을 해결하는 방법을 배우겠습니다.

파일에서 충돌 마커 확인

이전 단계에서 git statusmessage.txt에서 충돌을 보고하는 것을 확인했습니다. 이제 Git 이 충돌하는 섹션을 어떻게 표시하는지 확인하기 위해 파일 자체를 검사해 보겠습니다.

여전히 ~/project/my-time-machine 디렉토리에 있는지 확인하십시오.

cat 명령을 사용하여 파일의 내용을 볼 수 있습니다.

cat message.txt

출력은 다음과 유사합니다.

Hello, Future Me
<<<<<<< HEAD
This is an important message.
=======
Hope you are doing well!
>>>>>>> feature/greeting

Git 이 파일에 추가한 특수 마커에 주목하십시오.

  • <<<<<<< HEAD: 현재 브랜치 (이 경우 HEAD, master를 가리킴) 의 변경 사항 시작을 표시합니다.
  • =======: 두 브랜치의 변경 사항 사이의 구분 기호입니다.
  • >>>>>>> feature/greeting: 병합하려는 브랜치 (feature/greeting) 의 변경 사항 끝을 표시합니다.

이러한 마커는 충돌이 정확히 어디에서 발생했는지, 그리고 충돌하는 줄의 서로 다른 버전이 무엇인지 보여줍니다. <<<<<<< HEAD======= 사이의 줄은 현재 브랜치 (master) 의 변경 사항이고, =======>>>>>>> feature/greeting 사이의 줄은 병합하려는 브랜치 (feature/greeting) 의 변경 사항입니다.

이제 이 파일을 수동으로 편집하고 어떤 변경 사항을 유지할지 결정해야 합니다. 충돌 마커와 유지하지 않으려는 줄을 제거하여 최종 원하는 내용만 남겨야 합니다.

예를 들어, 두 메시지를 모두 유지하려면 파일을 다음과 같이 편집합니다.

Hello, Future Me
This is an important message.
Hope you are doing well!

또는 master 브랜치의 메시지만 유지하려면 파일을 다음과 같이 편집합니다.

Hello, Future Me
This is an important message.

nano 편집기를 사용하여 message.txt 파일을 열고 편집합니다.

nano message.txt

충돌 마커를 제거하고 유지하려는 내용을 선택하여 파일을 편집하여 충돌을 해결합니다. 이 랩에서는 두 메시지를 모두 유지해 보겠습니다.

편집 후 파일 내용은 다음과 같아야 합니다.

Hello, Future Me
This is an important message.
Hope you are doing well!

Ctrl + X를 눌러 nano 를 종료한 다음 Y를 눌러 변경 사항을 저장하고 마지막으로 Enter를 눌러 파일 이름을 확인합니다.

파일을 수동으로 편집하고 충돌 마커를 제거하면 Git 에 충돌하는 변경 사항을 결합하는 방법을 알려주는 것입니다. 이것은 병합 충돌을 해결하는 데 중요한 단계입니다.

충돌 없는 파일 테스트

이전 단계에서 병합 충돌이 있는 파일 (message.txt) 을 식별하고 검사했습니다. 그러나 병합하는 동안 두 브랜치 모두에서 변경되었지만 충돌이 없는 파일도 있을 수 있습니다. Git 은 이러한 파일을 자동으로 병합합니다.

이 단계에서는 브랜치 중 하나에 새 파일을 만들고 Git 이 병합 프로세스 중에 이를 어떻게 처리하는지 살펴보겠습니다. 이를 통해 충돌은 동일한 파일에서 변경 사항이 겹칠 때만 발생한다는 것을 이해하는 데 도움이 됩니다.

여전히 ~/project/my-time-machine 디렉토리에 있고 master 브랜치 (병합 충돌이 발생한 곳) 에 있는지 확인하십시오.

master 브랜치에서 notes.txt라는 새 파일을 만들어 보겠습니다.

echo "Important notes for the project." > notes.txt
git add notes.txt
git commit -m "Add project notes"

이제 feature/greeting 브랜치로 다시 전환해 보겠습니다.

git checkout feature/greeting

이 브랜치에는 notes.txt 파일이 아직 존재하지 않습니다. 여기에서 다른 파일, 예를 들어 todo.txt를 만들어 보겠습니다.

echo "Things to do: finish the lab." > todo.txt
git add todo.txt
git commit -m "Add a todo list"

이제 master 브랜치로 다시 전환하고 병합을 다시 시도해 보겠습니다. 이미 message.txt의 충돌을 해결했지만 병합 프로세스를 완료해야 합니다.

git checkout master
git merge feature/greeting

이번에는 message.txt의 충돌을 이미 해결하고 스테이징 영역에 추가했으므로 (편집 후 해당 단계를 명시적으로 표시하지 않았지만, Git 은 수동 충돌 해결 후 종종 파일을 스테이징합니다), Git 이 병합을 완료할 수 있어야 합니다. 병합이 완료되었음을 나타내는 출력을 볼 수 있습니다.

상태를 다시 확인해 보겠습니다.

git status

이제 출력은 "On branch master"이고 작업 트리가 깨끗하다는 것을 보여야 합니다. 즉, 보류 중인 변경 사항이나 병합되지 않은 경로가 없습니다.

On branch master
nothing to commit, working tree clean

이제 두 브랜치의 파일이 모두 master 브랜치에 있는지 확인해 보겠습니다.

ls

message.txt, notes.txt(master 브랜치에서), todo.txt(feature/greeting 브랜치에서) 가 모두 나열된 것을 볼 수 있습니다.

message.txt  notes.txt  todo.txt

이것은 todo.txtmaster 브랜치에 존재하지 않았기 때문에 Git 이 새 todo.txt 파일을 포함하여 feature/greeting의 변경 사항을 충돌 없이 성공적으로 병합했음을 보여줍니다. 충돌은 병합되는 브랜치에서 동일한 파일에 겹치는 변경 사항이 있을 때만 발생합니다.

병합 중에 Git 이 충돌된 파일과 충돌하지 않은 파일을 모두 처리하는 방식을 이해하는 것은 프로젝트의 기록을 효과적으로 관리하는 데 필수적입니다.

요약

이 랩에서는 git status 명령을 사용하여 Git 에서 충돌을 감지하는 방법을 배웠습니다. 별도의 브랜치에서 동일한 파일에 서로 다른 변경 사항을 적용한 다음 병합을 시도하여 충돌을 시뮬레이션했습니다. git status 출력은 병합되지 않은 경로와 충돌이 있는 특정 파일을 명확하게 나타냈습니다.

또한 Git 이 충돌 섹션을 강조 표시하기 위해 삽입하는 충돌 마커를 충돌 파일 자체 내에서 식별하는 방법도 살펴보았습니다. 마지막으로, 충돌이 없는 파일은 이러한 특수 문자로 표시되지 않음을 확인하여 Git 이 병합 문제를 표시하는 방식에 대한 이해를 강화했습니다.