Apidog

올인원 협업 API 개발 플랫폼

API 설계

API 문서

API 디버깅

API 모킹

API 자동화 테스트

리베이스 명령어를 사용하여 Git 커밋 취소하기

Young-jae

Young-jae

Updated on March 28, 2025

Git은 소프트웨어 개발에서 가장 널리 사용되는 버전 관리 시스템 중 하나입니다. 프로젝트에서 작업하면서 나중에 취소하거나 수정하거나 완전히 제거하고 싶은 커밋을 만들게 됩니다. 이 튜토리얼은 강력한 선택권을 제공하는 리베이스(rebase) 명령을 사용하여 Git 커밋을 취소하는 방법에 초점을 맞춥니다.

민감한 정보를 실수로 커밋했거나, 망가진 코드를 포함했거나, 단순히 커밋 기록을 정리하고 싶다면, Git 커밋을 취소하는 방법을 이해하는 것은 모든 개발자에게 필수적인 기술입니다.

Apidog로 API 개발 간소화하기

버튼

효과적으로 Git 커밋을 관리하는 것은 버전 관리를 위해 매우 중요하지만, API 개발 및 테스트를 위한 올바른 도구를 갖추는 것도 똑같이 중요합니다. 현재 시장에서 최고의 Postman 대안인 Apidog로 전환하는 것을 고려하세요.

Apidog는 API 문서화, 디자인, 모의(mock), 테스트 및 협업을 단일 플랫폼에서 결합하여 여러 도구 간의 전환 필요성을 없앱니다.

직관적인 인터페이스, 자동 동기화 기능 및 포괄적인 기능을 갖춘 Apidog는 생산성을 향상시키고 전체 API 개발 생애주기를 간소화합니다.

Git 리베이스 기술에 대해 깊이 파고들면서, Apidog와 같은 효율적인 도구를 채택하면 개발 워크플로우를 더욱 최적화할 수 있습니다.

버튼

Git 커밋 구조 이해하기

취소 기술에 들어가기 전에 Git이 커밋 정보를 어떻게 저장하는지 검토해 보겠습니다. 모든 Git 커밋:

  1. 고유한 해시 식별자를 가집니다
  2. 부모 커밋을 가리킵니다
  3. 메타데이터(저자, 날짜, 커밋 메시지)를 포함합니다
  4. 해당 시점의 코드 스냅샷을 저장합니다

Git 커밋을 취소해야 할 때, 본질적으로 이 커밋 체인을 어떤 방식으로든 수정하고자 하는 것입니다. 특정 요구 사항에 따라 여러 접근 방식을 취할 수 있습니다.

Git Revert vs. Git Reset vs. Git Rebase: 적절한 Git 도구 선택하기

Git 커밋을 취소하는 주된 방법은 세 가지입니다:

1. Git Revert

git revert HEAD

이 명령은 이전 커밋의 변경 사항을 되돌리는 새로운 커밋을 생성합니다. 원래의 커밋은 기록에 남아 있지만, 그 변경 사항은 역전됩니다.

가장 적합한 경우: 커밋이 발생했다는 기록을 남기면서 그 효과를 되돌리고 싶을 때. 이는 공유 리포지토리에서 작업할 때 가장 안전한 옵션입니다.

2. Git Reset

git reset --soft HEAD^

이 명령은 브랜치 포인터를 이전 커밋으로 이동합니다. --soft 플래그는 변경 사항을 스테이징 상태로 유지하며, --hard는 이를 완전히 폐기합니다.

가장 적합한 경우: 최근 커밋을 기록에서 완전히 제거하고 아직 작업을 공유하지 않았을 때.

3. Git Rebase

git rebase -i HEAD~n  # 여기서 n은 표시할 커밋 수입니다.

이 명령은 커밋 기록을 여러 가지 방식으로 조작할 수 있게 해주며, 커밋을 완전히 삭제하는 것도 가능합니다.

가장 적합한 경우: 커밋 기록에 대해 정밀한 제어를 원하는 고급 Git 사용자.

Git Rebase 명령: 강력한 역사 조작 도구

리베이스 명령은 Git의 가장 강력한 기능 중 하나입니다. 변경 사항을 통합하기 위해 새로운 커밋을 생성하는 병합(merge)과 달리, 리베이스는 다른 기본 커밋 위에 커밋을 적용하여 커밋 기록을 다시 작성합니다.

인터랙티브 리베이스(-i 플래그)는 커밋을 취소하는 데 특히 유용하며, 이를 통해:

  • 커밋 삭제
  • 여러 커밋 합치기
  • 커밋 순서 변경
  • 커밋 메시지 수정
  • 커밋 나누기

강력하지만, 리베이스는 Git 기록을 다시 작성하므로 주의해서 사용해야 합니다. 이는 협업 환경에서 문제가 생길 수 있습니다.

Git Rebase를 사용하여 Git 커밋 취소하기

리베이스 명령을 사용하여 Git 커밋을 취소하는 과정을 살펴보겠습니다:

1단계: 인터랙티브 Git 리베이스 세션 시작하기

먼저, 기록에서 얼마나 멀리 돌아가야 하는지 확인하세요. 마지막 세 개의 커밋을 취소하려면 다음을 사용합니다:

git rebase -i HEAD~3

이 명령은 가장 최근의 커밋이 아래쪽에 나열된 커밋 목록과 함께 기본 텍스트 편집기를 엽니다:

pick f2a9770 기능 X 추가
pick c69a283 기능 X의 버그 수정
pick 7c6b236 문서 업데이트

2단계: Git 커밋 삭제하기

커밋을 취소하려면, 제거할 커밋에 대해 "pick" 단어를 "d"(또는 "drop")로 변경합니다:

pick f2a9770 기능 X 추가
d c69a283 기능 X의 버그 수정
pick 7c6b236 문서 업데이트

이 예제에서는 "기능 X의 버그 수정" 커밋을 제거하고 나머지 두 개는 유지합니다.

3단계: 저장하고 종료하기

파일을 저장하고 편집기를 닫습니다. Git은 당신의 지시를 처리하고 변경 사항을 적용합니다.

4단계: Git 충돌 해결하기

커밋을 제거한 후에 커밋 간에 충돌이 발생하면, Git은 리베이스 프로세스를 일시 중지하고 이를 해결하라고 요청합니다. 충돌을 해결한 후:

git add .
git rebase --continue

5단계: 필요시 강제 푸시하기

이미 커밋을 푸시한 상태에서 취소했다면, 원격 브랜치를 업데이트하기 위해 강제 푸시해야 합니다:

git push --force-with-lease

경고: 강제 푸시는 원격 리포지토리의 기록을 다시 작성하므로, 이전 기록을 가져온 다른 개발자에게 문제를 일으킬 수 있습니다. 다른 사람의 작업을 방해하지 않을 것이라고 확신할 때만 강제 푸시를 사용하세요.

커밋 관리를 위한 고급 Git 리베이스 기술

단순히 커밋을 취소하는 것을 넘어서는 인터랙티브 리베이스는 여러 다른 옵션도 제공합니다:

커밋 합치기

여러 커밋을 하나로 병합할 수 있습니다:

pick f2a9770 기능 X 추가
squash c69a283 기능 X의 버그 수정
pick 7c6b236 문서 업데이트

이렇게 하면 "기능 X의 버그 수정" 커밋이 "기능 X 추가" 커밋에 병합됩니다.

커밋 순서 변경

리베이스 편집기에서 줄의 순서를 변경하기만 하면 됩니다:

pick 7c6b236 문서 업데이트
pick f2a9770 기능 X 추가

커밋 수정

pick 대신 edit를 사용하여 특정 커밋에서 리베이스를 일시 중지할 수 있습니다:

pick f2a9770 기능 X 추가
edit c69a283 기능 X의 버그 수정
pick 7c6b236 문서 업데이트

리베이스가 이 커밋에 도달하면, Git은 중지하고 계속하기 전에 커밋을 수정할 수 있게 해줍니다.

Git 리베이스의 위험과 모범 사례

Git 리베이스 사용 시 위험

  1. 수정할 수 없는 변경 사항: 병합과 달리, 리베이스는 커밋 기록을 다시 작성하므로 실수에서 복구하기 어렵습니다.
  2. 강제 푸시 필요: 푸시된 커밋을 리베이스한 후에는 강제 푸시가 필요하며, 이는 다른 사람의 변경 사항을 덮어쓸 수 있습니다.
  3. 커밋 변경: 리베이스는 커밋 해시를 변경하므로 원래 커밋이 새로운 것으로 대체됩니다.
  4. 충돌: 복잡한 리베이스는 여러 충돌 해결 단계를 초래할 수 있습니다.

Git 리베이스 모범 사례

백업 브랜치 생성: 복잡한 리베이스 작업을 시도하기 전에 백업 브랜치를 생성하세요.

git branch backup-before-rebase

푸시되지 않은 커밋만 리베이스: 일반 규칙으로, 공유 리포지토리에 푸시된 커밋은 리베이스하지 마세요.

-force-with-lease 사용하기: 이를 통해 다른 사람의 변경 사항을 덮어쓰지 않도록 안전 장치를 제공합니다.

git push --force-with-lease

샌드박스 리포지토리에서 연습: 리베이스에 익숙하지 않은 경우, 중요한 프로젝트에서 사용하기 전에 테스트 리포지토리에서 연습하세요.

자신의 기능 브랜치만 리베이스: 여러 개발자가 작업하고 있는 브랜치는 리베이스하지 마세요.

각 Git 취소 방법 사용 시기

  • Git 리버트 사용: 다음의 경우에 사용하세요:
  • 변경 사항을 되돌려야 하지만 원래 커밋 기록을 유지해야 할 때
  • main/master와 같은 공유 브랜치에서 작업할 때
  • 가장 안전한 옵션을 원할 때
  • Git 리셋 사용: 다음의 경우에 사용하세요:
  • 최근 커밋을 완전히 제거하고자 할 때
  • 아직 다른 사람과 커밋을 공유하지 않았을 때
  • 로컬 기능 브랜치에서 작업할 때
  • Git 리베이스 사용: 다음의 경우에 사용하세요:
  • 커밋 기록에 대한 세밀한 제어를 원할 때
  • 공유하기 전에 커밋 기록을 정리해야 할 때
  • 고급 Git 작업에 익숙할 때

Git 리베이스 vs. Git 병합: 차이 이해하기

커밋을 취소하는 것과 직접적으로 관련되지는 않지만, 리베이스와 병합의 차이를 이해하는 것은 리베이스가 역사 조작에 강력한 이유를 명확히 해줍니다:

  • 병합은 서로 다른 브랜치의 변경 사항을 결합한 새로운 커밋을 생성하여 두 브랜치의 전체 기록을 보존합니다.
  • 리베이스는 커밋을 한 브랜치에서 다른 브랜치로 이동시켜 히스토리를 재작성하여 분기된 것이 아니라 선형 기록을 만듭니다.

이 차이는 리베이스를 사용하여 커밋을 취소할 수 있는 이유의 핵심입니다. 새로운 커밋을 추가하는 것이 아니라, 기록을 재작성합니다.

결론

Git 리베이스 명령은 커밋을 취소하고 깔끔하고 의미 있는 커밋 기록을 유지하는 강력한 도구입니다. 올바르게 사용하려면 주의와 관심이 필요하지만, 리베이스를 마스터하면 Git 기록을 정밀하게 제어할 수 있습니다.

가장 안전한 접근 방식은 여러분의 특정 상황에 따라 다르다는 것을 기억하세요:

  • 작업을 공유했다면 git revert 사용을 고려하세요.
  • 로컬에서 작업하고 있다면 git reset 또는 git rebase가 적합할 수 있습니다.
  • 복잡한 Git 작업을 시도하기 전에 항상 백업 브랜치를 생성하세요.

다양한 Git 커밋 취소 방법을 이해함으로써 실수를 처리하고 깔끔한 리포지토리 기록을 유지하는 데 더욱 잘 준비될 것입니다. 이러한 기법을 안전한 환경에서 연습하여 실제 프로젝트에 적용하는 데 익숙해지세요.