해당 글에서는 add, commit, push를 제외하고 자주 사용하는 git 명령어를 정리해보려고 한다.
늘 필요할 때마다 검색 했었는데, 매번 찾는데 시간을 사용하는 것보다 자주 사용하는 것들만 모아서 보면 좋을 거 같아 한 번 정리해보았다.
✅ 커밋 해시 확인 방법
일부 Git 명령어는 특정 커밋을 지정할 때 커밋 해시(commit hash) 를 필요로 한다.
커밋 해시는 다음과 같은 방법으로 확인할 수 있다.
🔍 간단한 커밋 목록 보기
git log --oneline
위 명령어를 실행하면 각 커밋의 해시와 메시지가 한 줄씩 표시된다.
🔍 자세한 커밋 내역 보기
git log
각 커밋의 해시, 작성자, 날짜, 메시지를 포함한 자세한 정보가 출력된다.
1. 임시 저장이 필요해 : git stash
작업 도중 변경 사항을 임시로 저장해야 하는 상황이 종종 있다.
주로 이 때 사용하는 것이 git stash다.
📌 기본 사용법
git stash
현재 변경된 파일들이 임시 저장(stash)되며, git status를 통해 변경사항이 사라진 것을 볼 수 있다.
1️⃣ 특정 파일만 stash 하고 싶을 때
git stash push -m "임시 저장" -- <파일명>
예시는 다음과 같다.
git stash push -m "config 변경 중" -- config.json
이렇게 하면 “config 변경 중”이라는 메시지와 함께 config.json 파일만 stash에 저장된다.
나머지 변경 사항은 로컬에 그대로 남아 있다.
2️⃣ 특정 stash 적용하기
git stash list
git stash apply stash@{1}
stash list로 stash 했던 목록들을 확인할 수 있다.
stash@{번호} 를 통해 특정 stash만 현재 작업 파일에 적용할 수 있다.
3️⃣ stash를 삭제하고 싶을 때
git stash drop stash@{0}
특정 stash를 삭제할 수 있다.
만약 전체 삭제를 원한다면 git stash clear를 사용하면 된다.
4️⃣ stash pop, stash apply 차이
git stash apply는 stash를 적용하지만, stash 목록에서 제거하지 않는다.
git stash pop은 stash를 적용한 후 목록에서 해당 stash를 제거한다.
git stash apply stash@{0} # stash를 적용하지만 남아 있음
git stash pop stash@{0} # stash를 적용하고 목록에서 삭제
5️⃣ 여러 개의 stash 적용하기
stash를 여러 번 적용하려면 stash apply를 반복해서 실행하면 된다.
git stash apply stash@{2}
git stash apply stash@{1}
여러 개를 순차적으로 적용할 때는 apply를 사용하는 것이 좋다. (pop은 적용한 stash를 제거하기 때문)
2. 커밋을 되돌리고 싶어 : git reset, git revert
커밋을 되돌리는 방법으로는 git reset, git revert 이렇게 2가지가 있다.
📌 기본 사용법
1️⃣ git reset
이전 커밋으로 되돌리고 변경 사항을 유지하고 싶다면?
git reset --soft HEAD~1
soft 옵션을 통해 마지막 커밋을 취소하고, 변경된 파일들은 그대로 유지할 수 있다.
변경된 파일들은 스테이징 상태로 남아있게 된다.
이전 커밋으로 되돌리고 변경 사항을 삭제하고 싶다면?
git reset --hard HEAD~1
hard 옵션을 통해 마지막 커밋을 취소하고, 변경 사항도 모두 삭제되니 주의해야 한다.
특정 커밋까지만 되돌리고 싶다면?
git reset --hard <커밋 해시>
커밋 해시를 이용하면 되고, 마찬가지로 soft 옵션도 사용할 수 있다.
2️⃣ git revert
마지막 커밋을 되돌리고 싶다면?
git revert HEAD
마지막 커밋을 되돌리는 새로운 커밋이 생성된다.
특정 커밋을 되돌리고 싶은 경우, 커밋 해시를 사용하면 된다.
3️⃣ git revert로 되돌린 커밋을 다시 되돌리고 싶을 때는?
revert 했던 커밋이 남아있기에, revert 했던 커밋의 커밋 해시로 git revert를 하면 된다.
예를 들어 a1b23c 커밋을 revert 해서 생긴 커밋의 커밋 해시가 d4e5f6 라고 한다면…
→ git revert d4e5f6(revert 했던 커밋 해시) 로 복구하면 된다.
🤔 그래서 어떤 것을 사용하면 되는지?
git reset의 경우, 기존 커밋을 완전히 삭제하기에 여러 명과 함께 작업을 한다면 사용하지 않는 것이 좋다.
특히 원격 저장소(origin)에 push된 커밋을 되돌리는 작업을 할 때 git reset을 사용하면 로컬 commit history가 origin에 덮어질 수 있다.
코드가 어떻게 될지 모르기에… 다른 사람들과 함께 작업 중이라면 지양하는 게 좋다.
요약 : 이전으로 되돌리는 이력을 남기는 git revert 를 사용하자!
3. 특정 커밋만 다른 브랜치에 적용하고 싶어 : git cherry-pick
cherry-pick은 특정 커밋만 집어서 현재 HEAD가 가리키는 branch에 추가할 수 있다.
다른 branch로 옮기는 것이 아닌 새로운 커밋이 추가되는 작업이다.
📌 기본 사용법
git cherry-pick <커밋 해시>
예시는 다음과 같다.
git checkout main
git cherry-pick a1b2c3d
여러 개를 가져오고 싶으면 커밋 해시 값을 여러 개 나열하면 된다.
또는 가져오고 싶은 커밋 범위의 첫 번째와 마지막 커밋 해시 값을 “..” 문자로 이어주면
둘 사이에 있는 모든 커밋들을 가져와서 현재 브랜치에 반영할 수 있다.
git cherry-pick a1b2c3d..z10y9x8w
단, 첫 번째 입력한 커밋은 반영이 되지 않고, 그 다음 커밋부터 마지막 커밋까지 범위가 반영된다.
1️⃣ cherry-pick 중 충돌이 발생했을 때
충돌 파일을 확인하고 수정한 뒤, 스테이징에 올린다. (git add <수정된 파일>)
그 다음 git cherry-pick --continue 을 통해 cherry-pick을 계속 진행할 수 있다.
또는 충돌을 해결하지 않고 취소하고 싶으면 git cherry-pick --abort 를 사용하면 된다.
🤔 언제 사용하면 좋을까?
cherry-pick의 경우 커밋을 복사해서 새 커밋을 만드는 작업이기에 히스토리가 깨끗하게 유지되지 않을 수도 있고, 같은 변경 사항이 중복될 수 있다.
주로 다음과 같은 상황에서 사용한다.
- 긴급 버그 픽스(hotfix)를 적용해야 할 때
- feature 브랜치에서 일부 커밋만 먼저 배포해야 할 때
- 다른 브랜치에서 특정 커밋만 가져오고 싶을 때
커밋을 잘게 잘 쪼개 두면 유용하게 사용할 수 있을 거 같다.
4. 변경된 코드를 비교하고 싶어 : git diff
git diff 로는 특정 커밋, 브랜치, 또는 다른 파일 간의 차이를 확인하는 데 사용할 수 있다.
📌 기본 사용법
git diff
스테이지 영역에 등록되지 않은(git add 하지 않은) 워킹 디렉토리의 변경사항을 모두 나열한다.
git diff HEAD를 입력하면 작업 디렉토리 전체와 마지막 커밋의 차이를 확인할 수 있다.
git add를 한 파일이든 안 한 파일이든 모든 변경 사항을 확인할 때 사용한다.
스테이징된 변경사항이랑 마지막 커밋을 비교하기 위해서는 뒤에 --staged를 붙이면 된다. → git diff --staged
곧 커밋될 변경 사항을 확인할 때 사용한다.
1️⃣ 특정 파일의 변경 사항 확인
해당 파일의 변경 사항만 확인하려면 뒤에 파일명을 붙이면 된다.
git diff <파일명>
스테이징된 상태도 마찬가지로 뒤에 파일명을 붙이면 된다.
2️⃣ 브랜치 및 커밋 간 비교
git diff main feature-branch
두 브랜치를 비교하기 위해서는 비교하고 싶은 브랜치들을 나란히 나열한다.
특정 커밋 또한 마찬가지로 나란히 나열한다. (커밋 해시 사용)
참고할 자료 : https://ride-dev.tistory.com/122
6. 최근 커밋을 수정하고 싶어 : git commit --amend
가장 최근 커밋을 수정하고 싶을 때 사용할 수 있다.
특히 push 전(원격에 올리기 전) 커밋 메시지를 수정하고 싶을 때 사용한다.
📌 기본 사용법
커밋 메시지 수정
git commit --amend
기본 에디터가 열리며 메시지를 변경할 수 있다.
수정하고 저장하면 기존 커밋이 새로운 메시지로 변경된다.
메시지를 변경하는 거지만 커밋 해시는 그대로 유지 되지 않고, 새로운 해시 값을 할당 받는다.
최근 커밋 메시지를 한 줄로 수정할 수 있는데, git commit --amend -m “수정할 커밋 메시지” 를 사용하면 에디터를 열지 않고 변경할 수 있다.
1️⃣ 최근 커밋에 새로운 변경 사항 추가
git add <파일명>
git commit --amend
실수로 파일을 빼먹고 커밋을 했을 때 유용하다.
git add를 통해 새로운 변경 사항을 기존 커밋에 추가할 수 있다.
⚠️ git commit --amend 주의할 점
이미 push한(원격 저장소에 올라간) 커밋을 --amend 하게 되면 강제로 push를 해야 한다.
이 경우에는 --amend로 인해 커밋 해시가 변경되었기에 다른 누군가가 이미 pull한 상태라면 충돌이 발생할 수 있다.
따라서 혼자 작업하는 로컬 브랜치에서 사용하는 것이 안전하다.
여기까지 자주 찾아봤던 명령어들을 정리해봤다.
앞으로도 실무에서 자주 사용하는 git 명령어들을 계속 정리하면서, 더 효율적으로 활용할 수 있도록 해봐야겠다.
혹시 추가로 정리할 만한 유용한 명령어가 있다면 업데이트 하려고 한다 ㅎ