Git 커밋 변경 사항을 잃지 않고 되돌리는 방법

GitBeginner
지금 연습하기

소개

Git 은 개발자가 코드베이스를 효과적으로 관리할 수 있게 해주는 강력한 버전 관리 시스템입니다. 일반적인 작업 중 하나는 변경 사항을 되돌리는 것입니다. git reset과 같은 명령은 커밋 기록을 변경할 수 있지만, git revert는 특히 협업 프로젝트에서 커밋을 되돌리는 더 안전하고 비파괴적인 방법을 제공합니다. 이 실습에서는 git revert를 사용하여 커밋을 되돌리는 방법과 옵션을 사용하여 추가 수정을 위해 변경 사항을 보존하는 방법을 안내합니다.

커밋 기록 검사

변경을 가하기 전에 프로젝트의 현재 상태를 이해하는 것이 중요합니다. 실습 환경은 story.txt라는 파일과 몇 개의 커밋을 포함하는 Git 저장소로 사전 구성되었습니다. 커밋 기록을 검사해 보겠습니다.

먼저 git log 명령에 --oneline 옵션을 사용하여 커밋 기록을 간결하게 볼 수 있습니다. 이 명령은 각 커밋을 한 줄에 표시하며, 커밋 해시와 커밋 메시지를 보여줍니다.

git log --oneline

이와 유사한 출력을 볼 수 있습니다. 커밋 해시는 다를 수 있습니다.

c7a3e69 (HEAD -> master) Add a second, unwanted line
a9b2d5f Add the first line to the story
f3e1c8a Initial commit: Add story.txt

이 로그는 세 개의 커밋을 보여줍니다. 맨 위에 있는 가장 최근 커밋은 "Add a second, unwanted line"이라는 메시지를 가지고 있습니다. 이 커밋이 우리가 되돌려야 할 오류를 도입했다고 가정해 보겠습니다.

또한 story.txt 파일의 현재 내용을 살펴보겠습니다.

cat story.txt

출력은 다음과 같습니다.

Once upon a time, in a land of code.
The hero of our story was a brave developer.
Suddenly, a wild bug appeared!

우리의 목표는 가장 최근 커밋에서 추가된 마지막 줄인 "Suddenly, a wild bug appeared!"를 제거하는 것입니다.

안전한 되돌리기를 위한 git revert 사용

git revert 명령은 이전 커밋의 변경 사항을 되돌리는 새 커밋을 만드는 데 사용됩니다. 이 방법은 프로젝트의 기록을 변경하지 않기 때문에 변경 사항을 되돌리는 안전한 방법입니다.

먼저 되돌리려는 커밋의 커밋 해시를 복사합니다. 이전 단계의 출력에서 "Add a second, unwanted line"이라는 메시지를 가진 커밋이 해당 커밋입니다.

이제 해당 해시와 함께 git revert 명령을 실행합니다.

<your-commit-hash>를 터미널의 실제 해시로 바꿔주세요.

git revert <your-commit-hash>

이 명령을 실행한 후 Git 은 기본 텍스트 편집기 (nano) 를 열어 이 새 되돌리기 커밋의 커밋 메시지를 편집할 수 있도록 합니다. 기본 메시지로도 충분합니다.

nano 에서 저장하고 종료하려면:

  1. Ctrl+O (Write Out) 를 누른 다음 Enter를 눌러 파일 이름을 확인합니다.
  2. Ctrl+X를 눌러 종료합니다.

이제 커밋 기록을 다시 확인해 보겠습니다.

git log --oneline

맨 위에 새 커밋이 표시됩니다.

e0d5f1b (HEAD -> master) Revert "Add a second, unwanted line"
c7a3e69 Add a second, unwanted line
a9b2d5f Add the first line to the story
f3e1c8a Initial commit: Add story.txt

원래의 "원치 않는" 커밋은 기록에 그대로 남아 있지만, 새로운 "Revert" 커밋이 추가된 것을 알 수 있습니다. 이 새 커밋은 원치 않는 커밋이 만든 변경 사항을 되돌립니다.

마지막으로 story.txt의 내용을 확인하여 변경 사항이 되돌려졌는지 확인합니다.

cat story.txt

이제 출력은 다음과 같아야 합니다.

Once upon a time, in a land of code.
The hero of our story was a brave developer.

원치 않는 줄이 성공적으로 제거되었습니다.

--no-commit을 사용하여 변경 사항을 유지하며 되돌리기

때로는 커밋의 변경 사항을 되돌리고 싶지만, 이를 수정하기 위해 작업 디렉토리에 그대로 유지하고 싶을 때가 있습니다. 예를 들어, 커밋을 완전히 폐기하는 대신 실수를 수정하고 싶을 수 있습니다. --no-commit (또는 -n) 옵션이 이를 위해 완벽합니다.

먼저, 다른 접근 방식을 시도하기 위해 마지막 되돌리기 이전 상태로 저장소를 재설정하겠습니다. 이를 위해 git reset을 사용할 것입니다. 이 명령은 HEAD 포인터를 이동시키고, --hard는 작업 디렉토리의 파일을 일치하도록 업데이트합니다.

git reset --hard HEAD~1

이 명령은 방금 만든 "Revert" 커밋을 제거합니다. git log --oneline을 실행하여 이를 확인할 수 있습니다.

이제 "--no-commit" 옵션을 사용하여 "Add a second, unwanted line" 커밋의 해시로 다시 되돌리기를 실행해 보겠습니다.

<your-commit-hash>를 터미널의 실제 해시로 바꿔주세요.

git revert --no-commit <your-commit-hash>

이번에는 편집기가 나타나지 않습니다. 되돌리기가 준비되었지만 커밋되지는 않았습니다. 저장소의 상태를 확인해 보세요.

git status

출력은 story.txt가 커밋을 위해 스테이징되었음을 보여줍니다.

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   story.txt

되돌려진 커밋의 변경 사항이 이제 스테이징 영역에 있습니다. 이제 이를 수정할 수 있습니다. 원치 않는 줄을 더 나은 줄로 바꿔봅시다. nanostory.txt를 엽니다.

nano story.txt

파일은 2 단계에서 되돌리기 후와 같이 보일 것입니다. 파일 끝에 새롭고 더 나은 줄을 추가합니다.

And they lived happily ever after.

nano 를 저장하고 종료합니다 (Ctrl+O, Enter, Ctrl+X).

이제 변경 사항을 스테이징 영역에 추가하고 새롭고 설명적인 메시지로 커밋합니다.

git add story.txt
git commit -m "Replace unwanted line with a proper conclusion"

마지막으로 로그와 파일 내용을 확인하여 결과를 확인합니다.

git log --oneline
cat story.txt

로그는 새 커밋을 보여주고, story.txt에는 수정된 내용이 있습니다. 변경 사항을 보존하고 수정하면서 커밋을 성공적으로 되돌렸습니다.

요약

이 실습에서는 작업 내용을 잃지 않고 Git 커밋을 안전하게 되돌리는 방법을 배웠습니다. git log를 사용하여 커밋 기록을 검사하고, 이전 변경 사항을 되돌리는 새 커밋을 생성하는 표준 git revert를 수행하고, git revert --no-commit 옵션을 사용하여 스테이징 영역의 변경 사항을 되돌려 새 커밋을 생성하기 전에 수정할 수 있도록 하는 방법을 연습했습니다. 이러한 기술은 특히 팀 환경에서 프로젝트 기록을 깔끔하고 안전하게 관리하는 데 필수적입니다.