Close

커밋 및 변경 취소하기

이 섹션에서는 사용 가능한 '실행 취소' Git 전략과 명령에 대해 알아보겠습니다. 먼저 Git에는 워드 프로세싱 애플리케이션에서 볼 수 있는 것과 같은 기존의 '실행 취소' 시스템이 없다는 점에 유의해야 합니다. Git 작업을 기존의 '실행 취소' 멘탈 모델에 매핑하지 않는 것이 좋습니다. 또한 Git에는 '실행 취소' 작업에 대한 자체 명칭이 있으므로 이 명칭을 토론에서 활용하는 것이 가장 좋습니다. 이 명칭에는 재설정, 되돌리기, 체크아웃, 정리 등과 같은 용어가 포함됩니다.

재미있는 비유를 떠올리자면 Git을 타임라인 관리 유틸리티로 생각하는 것입니다. 커밋은 프로젝트 기록의 타임라인에 있는 특정 시점 또는 관심 지점의 스냅샷입니다. 또한 브랜치를 사용하여 여러 타임라인을 관리할 수 있습니다. Git에서 '실행 취소'하면 보통 시간을 거슬러 올라가거나 실수가 발생하지 않은 다른 타임라인으로 이동합니다.

이 자습서는 소프트웨어 프로젝트의 이전 버전으로 작업하는 데 필요한 모든 기술을 제공합니다. 먼저 이전 커밋을 탐색하는 방법을 살펴보고, 프로젝트 기록의 공개 커밋을 되돌리는 것과 로컬 시스템에서 게시되지 않은 변경 사항을 재설정하는 것의 차이점을 설명합니다.


잃어버린 항목 찾기: 이전 커밋 검토


버전 제어 시스템의 목표는 "안전한" 프로젝트 복사본을 저장하여 코드 기반이 복구할 수 없을 정도로 손상되는 일을 방지하는 것입니다. 프로젝트 커밋 기록을 만든 후에는 기록에 있는 모든 커밋을 검토하고 다시 방문할 수 있습니다. git log 명령은 Git 리포지토리 기록 검토 시 가장 유용한 기능 중 하나입니다. 아래는 git log를 사용하여 인기 있는 오픈소스 그래픽 라이브러리에 대한 최근 커밋 목록을 불러온 예입니다.

git log --oneline
e2f9a78fe Replaced FlyControls with OrbitControls
d35ce0178 Editor: Shortcuts panel Safari support.
9dbe8d0cf Editor: Sidebar.Controls to Sidebar.Settings.Shortcuts. Clean up.
05c5288fc Merge pull request #12612 from TyLindberg/editor-controls-panel
0d8b6e74b Merge pull request #12805 from harto/patch-1
23b20c22e Merge pull request #12801 from gam0022/improve-raymarching-example-v2
fe78029f1 Fix typo in documentation
7ce43c448 Merge pull request #12794 from WestLangley/dev-x
17452bb93 Merge pull request #12778 from OndrejSpanel/unitTestFixes
b5c1b5c70 Merge pull request #12799 from dhritzkiv/patch-21
1b48ff4d2 Updated builds.
88adbcdf6 WebVRManager: Clean up.
2720fbb08 Merge pull request #12803 from dmarcos/parentPoseObject
9ed629301 Check parent of poseObject instead of camera
219f3eb13 Update GLTFLoader.js
15f13bb3c Update GLTFLoader.js
6d9c22a3b Update uniforms only when onWindowResize
881b25b58 Update ProjectionMatrix on change aspect
Git 로고
관련 자료

Git 치트 시트

Bitbucket 로고
솔루션 보기

Bitbucket Cloud에서 Git에 대해 알아보기

각 커밋에는 고유한 SHA-1 식별 해시가 있습니다. 이 ID는 커밋된 타임라인을 살펴보고 커밋을 다시 방문하는 데 사용됩니다. 기본값으로 git log는 현재 선택한 브랜치에 대한 커밋만 보여줍니다. 찾고 있는 커밋이 다른 브랜치에 있을 가능성도 충분히 있습니다. git log -branches=*를 실행하면 모든 브랜치의 모든 커밋을 볼 수 있습니다. git branch 명령은 다른 브랜치를 보고 방문하는 데 사용됩니다. git branch -a 명령을 호출하면 알려진 모든 브랜치 이름 목록을 반환합니다. 그러면 git log을 사용하여 이 브랜치 이름 중 하나를 로그할 수 있습니다.

방문하려는 기록 지점에 대한 커밋 참조를 찾으면 git checkout 명령을 사용하여 해당 커밋을 방문할 수 있습니다. Git checkout은 저장된 스냅샷을 개발 시스템에 “로드”하는 쉬운 방법입니다. 일반적인 개발 과정에서 HEAD는 보통 main 또는 다른 로컬 브랜치를 가리키지만 이전 커밋을 체크아웃하는 경우 HEAD는 더 이상 브랜치를 가리키지 않고 커밋을 직접 가리킵니다. 이는 “분리된 HEAD” 상태라고 하며 다음과 같이 시각화할 수 있습니다.

이전 커밋 체크아웃

이전 파일을 체크아웃해도 HEAD 포인터는 이동하지 않으며, 같은 브랜치와 커밋에 남아 'head 분리' 상태를 방지합니다. 그런 다음 파일의 이전 버전과 다른 변경 사항을 새로운 스냅샷에 커밋할 수 있습니다. 따라서 파일에서 git checkout을 사용하면 각 파일의 이전 버전으로 돌아갈 수 있습니다. 이 두 모드에 대해 자세히 알아보려면 git checkout 페이지를 방문하세요.

이전 수정 내역 보기


이 예시에서는 비정상적인 실험을 개발하기 시작했지만 계속할지 여부를 확신할 수 없다고 가정합니다. 결정을 돕기 위해 실험을 시작하기 전에 프로젝트 상태를 살펴보려고 합니다. 먼저 보고 싶은 수정본의 ID를 찾아야 합니다.

git log --oneline

프로젝트 기록이 다음과 비슷하다고 가정해 봅시다.

b7119f2 Continue doing crazy things
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

git checkout을 사용하여 “Make some import changes to hello.txt”를 볼 수 있습니다. 다음과 같이 커밋합니다.

git checkout a1e8fb5

이렇게 하면 작업 디렉터리가 a1e8fb5 커밋의 상태와 정확히 일치하게 됩니다. 프로젝트의 현재 상태를 잃어버릴 걱정 없이 파일을 보고, 프로젝트를 모으고, 테스트를 실행하고, 파일을 편집할 수도 있습니다. 여기에서 수행하는 모든 작업은 리포지토리에 저장되지 않습니다. 개발을 계속하려면 프로젝트의 “현재” 상태로 돌아가야 합니다.

git checkout main

그러면 기본 main 브랜치에서 개발하는 것으로 간주됩니다. main 브랜치로 돌아온 후 git revert 또는 git reset을 사용하여 원하지 않는 변경 사항을 실행 취소할 수 있습니다.

커밋된 스냅샷 실행 취소


몇 가지 기술 전략을 통해 커밋을 '취소'할 수 있습니다. 아래 예에서는 다음과 같은 커밋 내역을 가정합니다.

git log --oneline
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

872fa7e Try something crazy 커밋의 실행을 취소하는 데 중점을 두겠습니다. 상황이 너무 심해진 것 같습니다.

git checkout으로 커밋을 실행 취소하는 방법


git checkout 명령을 사용하면 이전 커밋인 a1e8fb5를 체크 아웃하여 비정상적인 커밋이 발생하기 전의 상태로 저장소를 되돌릴 수 있습니다. 특정 커밋을 체크 아웃하면 저장소가 'HEAD 분리' 상태가 됩니다. 따라서 어느 브랜치에서도 작업을 수행할 수 없습니다. 분리된 상태에서는 브랜치를 기존 브랜치로 되돌리면 모든 새로운 커밋이 고립됩니다. 고립된 커밋은 Git의 가비지 컬렉터의 삭제 대상이 됩니다. 가비지 컬렉터는 설정된 주기를 실행하고 고립된 커밋을 영구적으로 폐기합니다. 고립된 커밋이 가비지로 수집되지 않게 하려면 브랜치에 연결되어야 합니다.

분리된 HEAD 상태에서 git checkout -b new_branch_without_crazy_commit을 실행할 수 있습니다. 그러면 new_branch_without_crazy_commit이라는 새 브랜치가 만들어지고 해당 상태로 전환됩니다. 리포지토리가 이제 872fa7e 커밋이 더 이상 존재하지 않는 새로운 기록 타임라인에 있습니다. 872fa7e 커밋이 더 이상 존재하지 않는 이 새 브랜치에 대한 작업을 계속하고 '실행 취소'라고 간주할 수 있습니다. 필요한 이전 브랜치가 안타깝게도 main 브랜치였다면 이 실행 취소 전략은 적절하지 않습니다. 다른 '실행 취소' 전략을 살펴보겠습니다. 자세한 내용과 예시를 보려면 git checkout 심층 토론을 검토하세요.

git revert로 공개 커밋을 실행 취소하는 방법


원래 커밋 내역 예시로 돌아가봅시다. 이 내역에는 872fa7e 커밋이 포함되어 있습니다. 이번에는 '취소' 되돌리기를 시도해보겠습니다. git revert HEAD를 실행하면 Git에서 마지막 커밋의 반전에 해당하는 새로운 커밋을 생성합니다. 이로 인해 현재 브랜치 내역에 새로운 커밋이 추가되며, 다음과 같이 변경됩니다.

git log --oneline
e2f9a78 Revert "Try something crazy"
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

이 시점에서 우리는 872fa7e 커밋을 다시 '실행 취소'했습니다. 872fa7e는 여전히 기록에 존재하지만, 새로운 e2f9a78 커밋은 872fa7e의 변경 사항에 대한 반전입니다. 이전 체크아웃 전략과는 다르게 계속해서 같은 브랜치를 사용할 수 있습니다. 이 솔루션은 만족스러운 실행 취소입니다. 공개 공유 리포지토리로 작업하는 데 이상적인 '실행 취소' 방법입니다. 선별된 최소한의 Git 기록을 유지해야 한다는 요구 사항이 있다면 이 전략이 만족스럽지 않을 수도 있습니다.

git reset으로 커밋을 실행 취소하는 방법


이 실행 취소 전략을 사용하여 작업 예시를 계속 진행해 보겠습니다. git reset 은 다양한 기능을 포함하는 광범위한 명령으로 여러 용도로 사용됩니다. git reset --hard a1e8fb5를 호출하면 커밋 기록이 해당 커밋으로 재설정됩니다. git log를 이용하여 커밋 기록을 살펴보면 다음과 같이 표시됩니다.

git log --oneline
a1e8fb5 Make some important changes to hello.txt
435b61d Create hello.txt
9773e52 Initial import

로그 출력은 e2f9a78872fa7e 커밋이 커밋 기록에 더 이상 존재하지 않는다는 것을 보여줍니다. 이제 '비정상적인' 커밋이 처음부터 아예 없었던 것처럼 계속 작업하면서 새 커밋을 만들 수 있습니다. 이 변경 사항을 실행 취소하는 방법이 기록에 가장 깨끗한 영향을 미칩니다. 로컬 변경 사항의 경우 재설정하는 것이 좋지만 공유 원격 리포지토리로 작업할 때는 복잡합니다. 872fa7e 커밋이 푸시된 공유 원격 리포지토리가 있고 기록을 재설정한 브랜치를 git push하려고 하면 Git이 이를 찾아내고 오류를 표시합니다. Git은 푸시되는 브랜치가 커밋이 없으므로 최신 상태가 아니라고 가정합니다. 이러한 시나리오에서 선호되는 실행 취소 방법은 git revert입니다.

마지막 커밋 실행 취소


이전 섹션에서는 커밋을 실행 취소하기 위한 여러 가지 전략을 살펴봤습니다. 이러한 전략은 모두 가장 최근 커밋에도 적용할 수 있습니다. 하지만 마지막 커밋을 제거하거나 재설정할 필요가 없는 경우도 있습니다. 어쩌면 너무 일찍 만든 것일지도 모릅니다. 이 경우 가장 최근의 커밋을 수정할 수 있습니다. 작업 디렉터리에서 더 많은 변경 사항을 적용하고 git add를 사용하여 커밋을 위해 스테이징한 후에는 git commit --amend를 실행할 수 있습니다. 이렇게 하면 Git이 구성된 시스템 편집기를 열고 마지막 커밋 메시지를 수정할 수 있습니다. 새로운 변경 사항은 수정된 커밋에 추가됩니다.

커밋하지 않은 변경 사항 실행 취소


변경 사항은 리포지토리 기록에 커밋되기 전까지 스테이징 색인과 작업 디렉터리에 있습니다. 이 두 영역 안에서 변경 사항을 실행 취소해야 할 수도 있습니다. 스테이징 색인 및 작업 디렉터리는 내부 Git 상태 관리 메커니즘입니다. 이 두 가지 메커니즘이 어떻게 작동하는지 자세히 알아보려면 git reset 페이지를 방문하세요.

작업 디렉터리


작업 디렉터리는 보통 로컬 파일 시스템과 동기화됩니다. 작업 디렉터리에서 변경 사항을 실행 취소하려면 평소 자주 사용하는 편집기를 사용하는 것처럼 파일을 편집하면 됩니다. Git에는 작업 디렉토리를 관리하는 데 도움이 되는 몇 가지 유틸리티가 있습니다. 작업 디렉터리에 대한 변경 사항을 실행 취소하는 편리한 유틸리티인 git clean 명령이 있습니다. 또한 --mixed 또는 --hard 옵션으로 git reset을 호출하고 작업 디렉터리에 재설정을 적용할 수 있습니다.

스테이징 색인


git add 명령은 스테이징 색인에 변경 사항을 추가하는 데 사용됩니다. Git reset은 주로 스테이징 색인 변경 사항을 실행 취소하는 데 사용됩니다. --mixed 재설정은 스테이징 색인에서 보류 중인 변경 사항을 작업 디렉터리로 다시 이동시킵니다.

공개 변경 사항 실행 취소


원격 리포지토리가 있는 팀에서 작업할 때는 변경 사항을 실행 취소할 때 특별히 신경 써야 합니다. Git reset은 일반적으로 '로컬' 실행 취소 방법으로 간주해야 합니다. 비공개 브랜치에 대한 변경 사항을 실행 취소할 때는 재설정을 사용해야 합니다. 이렇게 하면 다른 개발자가 사용 중인 다른 브랜치에서 커밋이 제거되는 것을 안전하게 분리할 수 있습니다. 공유 브랜치에서 재설정을 실행한 다음 그 브랜치를 git push로 원격으로 푸시하면 문제가 발생합니다. 이 시나리오에서 Git은 푸시되는 브랜치가 커밋이 없으므로 원격 브랜치에서 최신이 아니라고 불평하며 푸시를 차단합니다.

git revert는 공유 내역을 취소하는 기본적 방법입니다. 되돌리기는 공유 내역에서 커밋을 삭제하지 않으므로 재설정보다 안전합니다. 되돌리기를 실행하면 취소하려는 커밋을 유지하면서 원하지 않는 커밋을 반전하는 새로운 커밋을 생성할 수 있습니다. 되돌리기를 사용하면 원격 개발자가 브랜치를 불러와 원하지 않는 커밋을 취소하는 새로운 되돌리기 커밋을 수신할 수 있으므로 공유 원격 협업에 더욱 안전합니다.

요약


지금까지 Git에서 실행 취소하는 수준 높은 전략을 많이 다뤘습니다. Git 프로젝트에서 '실행 취소'하는 방법은 여러 가지가 있음을 기억하는 것이 중요합니다. 이 페이지의 토론 대부분은 심층적인 주제를 다루며, 관련 Git 명령과 관련된 페이지에 더 자세히 설명되어 있습니다. 가장 일반적으로 사용되는 '실행 취소' 도구는 git checkout, git revert, git reset입니다. 기억해야 할 몇 가지 핵심 사항은 다음과 같습니다.

  • 변경 사항을 커밋하면 영구적으로 유지됩니다.
  • git checkout을 사용하여 이동하고 커밋 내역을 검토할 수 있습니다.
  • git revert는 공유된 공개 변경 사항을 실행 취소하는 데 가장 적합한 도구입니다
  • git reset은 로컬 개인 변경 사항을 실행 취소하는 데 가장 적합합니다

기본 실행 취소 명령 외에도 손실된 커밋을 찾을 수 있는 git log, 커밋되지 않는 변경 사항을 실행 취소할 수 있는 git clean, 스테이징 색인을 수정하는 git add와 같은 Git 유틸리티를 살펴보았습니다.

이러한 각 명령에는 고유한 상세 설명서가 있습니다. 여기에 언급된 특정 명령에 대해 자세히 알아보려면 해당 링크를 방문하세요.


이 문서 공유
다음 토픽

여러분께 도움을 드릴 자료를 추천합니다.

이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.

도구로 가득한 벽을 사용하여 협업하는 사람들

Bitbucket 블로그

DevOps 일러스트레이션

DevOps 학습 경로

Atlassian 전문가와 함께 하는 Demo Den 기능 데모

Bitbucket Cloud가 Atlassian Open DevOps와 작동하는 방법

DevOps 뉴스레터 신청

Thank you for signing up