Intro
Git을 사용하다 보면 의도와 다르게 커밋을 하거나, 잘못된 브랜치에서 커밋을 진행하는 실수를 할 때가 있다. 이렇게 한 번 커밋을 하고 나면 --amend
옵션으로 이미 커밋한 내용을 수정하고, force push로 덮을 수 있지만 때로는 커밋 자체를 완전히 취소해야 할 경우도 있다.
이 글에서는 실수로 커밋한 내용을 되돌리기 위한 방법들을 예시와 함께 살펴보고, 각 상황에서 주의할 점에 대해 정리한다.
실습
커밋을 취소해야 하는 상황
커밋 취소가 필요한 상황은 다양하다. 다음과 같은 경우가 대표적이다.
- 커밋을 했으나 수정할 내용이 있다: 커밋 메시지나 커밋된 내용에 빠진 부분이 있다면
--amend
옵션을 사용하여 커밋을 수정할 수 있다. - 잘못된 브랜치에서 커밋을 한 경우: 작업 브랜치가 아닌 다른 브랜치에 커밋한 경우, 해당 커밋을 되돌리거나 다른 브랜치로 옮겨야 할 수 있다.
- 의도하지 않은 커밋: 작업 중 실수로 의도하지 않은 커밋을 했거나, 원격 저장소에 푸시하기 전에 취소하고 싶을 때, 커밋을 완전히 삭제할 필요가 있다.
각 경우에 대한 해결 방법과 실제 예시를 통해 어떻게 커밋을 취소할 수 있는지 살펴보자.
1. 최근 커밋 수정하기 - git commit --amend
이미 커밋을 했지만, 누락된 파일을 추가하거나 커밋 메시지를 수정하고 싶다면 --amend
옵션을 사용할 수 있다.
git add 추가할_파일
git commit --amend
이렇게 실행하면 수정된 파일이 기존 커밋에 포함되고, 커밋 메시지도 재입력할 수 있는 화면이 열린다.
예시
# 예시 파일 추가 및 커밋
git add example.txt
git commit -m "Add example file"
# 다른 파일 추가 후, 기존 커밋에 포함시키기
git add another_example.txt
git commit --amend
이 경우, another_example.txt
파일은 기존 커밋에 포함되며, 두 개의 파일이 함께 커밋된 것처럼 보이게 된다.
주의: 이 방법은 아직 원격 저장소에 푸시하지 않은 경우에만 사용하는 것이 좋다. 이미 푸시한 커밋을 수정할 경우 협업 중인 다른 개발자에게 혼란을 줄 수 있다. amend 후엔 보통
git push -f
로 원격 커밋을 덮어쓴다.
2. 최근 커밋 되돌리기 - git reset
잘못된 브랜치에 커밋했거나, 해당 커밋이 아예 필요 없는 경우 git reset
명령어를 사용해 커밋을 되돌릴 수 있다. 이때 여러 옵션을 통해 소스 코드와 스테이징 상태를 다르게 되돌릴 수 있다.
소스 코드만 되돌리기:
--soft
옵션을 사용하면 커밋만 제거하고, 소스 코드와 스테이징 상태는 유지할 수 있다.# 커밋만 취소하고 소스 코드는 유지하려면 soft 옵션 사용 git reset --soft HEAD~1
스테이징을 해제하고 소스 코드는 유지: 옵션을 지정하지 않으면 기본적으로
--mixed
가 적용된다. 이 경우 커밋만 취소되고, 파일들은Unstaged
상태로 돌아간다.# 기본 옵션인 mixed를 사용하여 커밋 취소 + 스테이징 해제 git reset HEAD~1
소스 코드와 함께 되돌리기:
--hard
옵션을 사용하면 커밋과 소스 코드 모두 이전 상태로 되돌아간다. 작업내용이 사라지니 주의해서 사용해야 한다.# 모든 변경 사항을 이전 상태로 되돌리려면 hard 옵션 사용 git reset --hard HEAD~1
옵션 없이
git reset HEAD~1
를 실행하면--mixed
가 기본값으로 적용된다. 이는 커밋을 취소하면서 스테이징된 파일을Unstaged
상태로 되돌리며, 소스 코드는 워킹 디렉토리에 그대로 남겨둔다.
3. 커밋을 취소하고 새로운 브랜치로 옮기기 - git stash
잘못된 브랜치에서 작업을 하던 중 커밋까지 진행해 버렸다면, 해당 커밋을 취소하고 원하는 브랜치로 옮기는 방법이 있다.
먼저, 현재 브랜치에서의 변경 사항을 임시로 저장한다.
git stash
이후 원하는 브랜치로 이동한 후,
stash
에 저장된 변경 사항을 가져온다.git checkout 원하는_브랜치 git stash pop
마지막으로, 해당 브랜치에서 변경 사항을 커밋하면 된다.
git add . git commit -m "정확한 커밋 메시지"
팁:
git stash pop
을 사용하면, stash에 임시로 저장한 변경 사항을 바로 현재 브랜치로 복구할 수 있다.
4. 원격 저장소에 푸시된 커밋 되돌리기
원격 저장소에 이미 푸시한 커밋을 취소해야 하는 경우에는 주의가 필요하다. 이 때문에 개인적으로는 작업하는 branch 는 완전 분리하는걸 선호한다.
푸시된 커밋을 수정할 경우:
--force
옵션을 사용해 푸시한 커밋을 덮어쓸 수 있다. 하지만 다른 개발자가 푸시한 이후에는 사용하지 말 것.git reset --soft HEAD~1 git push origin 브랜치명 --force
revert 커밋 생성하기: 원격 저장소에 푸시된 커밋을 취소할 수 있는 또 다른 방법은 되돌리기 커밋을 만드는 것이다. 이 방법은 협업에 영향을 주지 않으면서 안전하게 커밋을 되돌리는 방법이다. 다만 기존 커밋 내역이 유지되어 revert 커밋 까지 총 2개의 커밋이 발생한다.
git revert HEAD git push origin 브랜치명
주의: 협업 프로젝트에서
--force
옵션을 사용하는 것은 권장하지 않는다. 개인적으는 협업하는 branch에서는 어쩔 수 없이 revert 커밋을 사용한다.
결론
Git에서 커밋을 되돌리는 방법은 상황에 따라 다양하다. 커밋 취소가 필요할 때는 해당 작업이 원격 저장소에 반영된 상태인지, 현재 작업 중인 브랜치에서 안전하게 되돌릴 수 있는지 등을 먼저 고려해야 한다.
커밋을 잘못한 경우 가장 안전한 방법은 git revert
로 되돌리기 커밋을 만드는 것이며, 원격에 푸시되지 않은 커밋이라면 reset 명령어를 활용해 깔끔하게 되돌릴 수 있다.
끝
'Development > Git' 카테고리의 다른 글
Git Submodule 최신 커밋으로 업데이트 (0) | 2024.11.25 |
---|---|
[Git] 특정 코드 변경 사항 검색하기 (0) | 2022.09.15 |
[Git] lightweight 태그와 annotated Tags (0) | 2022.06.27 |
Git) 서브모듈 추가 및 제거 (0) | 2022.05.31 |
Git) 여러개의 Git 저장소 한번에 fetch / pull (0) | 2022.05.27 |