[문과 코린이의 IT 기록장] Git 심화 - 커밋 관리하기 (커밋하는 방법 (권장사항), 보다 세심하게 스테이징하고 커밋하기, 커밋하기 애매한 변화 치워두기, 커밋 수정하기, 과거의 커밋들을 수정, 삭제, 병합, 분할하기)
2022.04.06 - [문과 코린이의, [Git] 기록] - [문과 코린이의 IT 기록장] Git 심화 (Help와 문서 활용하기, Git의 각종 설정 (Git config))
1. 커밋하는 방법 (권장사항)
1) 하나의 커밋에는 한 단위의 작업을 넣도록 한다.
* 즉, 한 작업을 여러 버전에 걸쳐 커밋하지 않으며, 여러 작업을 한 버전에 커밋하지 않는 것이 필요하다.
2) 커밋 메시지는 어떤 작업이 이뤄졌는지 알아볼 수 있도록 작성한다.
[ 커밋 메시지 컨벤션 ]
* 컨벤션 : 개발 팀원들끼리, 어떤 것을 작성하는 방식을 합의해 놓는 것 (정해진 답은 없으며, 업무에 적합하게 자율적으로 설정한다)
- 널리 사용되는 커밋 메시지 작성방식
type : subject
body (optional)
...
...
...
footer (optional)
# 예시 )
# 일반적으로는, type과 subject 이외에는 작성하지 않는다.
feat : 압축파일 미리보기 기능 추가
사용자의 편의를 위해 압축을 풀기 전에 다음과 같이 압축파일 미리보기를 할 수 있도록 함.
- 마우스 오른쪽 클릭
- 윈도우 탐색기 또는 맥 파인더의 미리보기 창
Closes #125
a. type
: 각 커밋 작업이 대략 어느 분야에 속하는지 알 수 있도록 작성하는 부분이다.
타입 | 설명 |
feat | 새로운 기능 추가 |
fix | 버그 수정 |
docs | 문서 수정 |
style | 공백, 세미콜론 등 스타일 수정 |
refactor | 코드 리팩토링 |
perf | 성능 개선 |
test | 테스트 추가 |
chore | 빌드 과정 또는 보조 기능 (문서 생성기능 등) 수정 |
b. subject
: 이 커밋에서 무엇을 한 것인지를 간략히 적는 부분이다.
c. body, footer
: 일반적으로는 type과 subject만 작성하며, 추가적으로 더 설명할 것이 많을 경우 사용한다.
: 한 줄 비운 후, 상세내용을 적어놓는다.
: body는 커밋의 작업 내용을 길게 설명할 필요가 있을 시 사용된다.
: footer는 중요한 변경지점(Breaking Point)이 있을 시, 혹은 특정 이슈에 대한 해결 커밋일 시 해당 이슈번호를 적는 방식으로 사용된다.
[ Gitmoji ]
- type 대신, 이모지를 활용하는 방식을 사용할 수도 있음.
2. 보다 세심하게 스테이징하고 커밋하기
일반적인 git commit 과정 a. git add . (모든 변화를 file로 add하기) => git commit / git commit -m '커밋명' 진행 b. git commit -am '커밋명' 진행 |
그러나, 조금더 세부적으로 변화를 다루고 add 및 commit을 하는 방법도 존재함.
* 한 파일 내에서도 변경사항을 add 및 commit할 부분과 하지 않을 부분을 나눌 수 있음.
=> hunk별로 다루기
* hunk : 수정된 부분의 묶음 (수정되지 않은 부분이 있다면 그를 기준으로 나뉨)
아래의 명령어로, hunk별 스테이징을 진행 할 수 있음.
$git add -p
# 옵션 설명을 보려면 ? 입력 후 엔터 누르기
# y(yes) 또는 n(no)로 각 hunk add 여부 선택 => 이를 통해 파일 내 수정사항 일부만 add 가능
$git status
# 한 파일에도 add가 된 부분과, 되지 않은 부분이 나눠지게 되면, 하단과 같이 한 파일이어도 add된 부분과 되지 않은 부분이 나뉠 수 있음
git log를 통해 커밋 완료 내역을 확인한다.
또한 아래의 명령어로, 변경사항을 확인 및 커밋(diff + commit)하는 것이 가능하다.
$git commit -v
# j, k로 스크롤하며 내용 확인
# 이를 통해, 변화한 수정 부분을 자세히 보면서 커밋할 수 있음 (즉, diff와 commit을 한번에 할 수 있음)
cf ) git reset --soft HEAD~ * --soft : repository에서 staging area로 이동 * HEAD~ : 한 단계 전 커밋으로 되돌아가기 cf) git diff --staged : staging area와 repository HEAD 커밋 사이의 변경사항을 확인하기 위해 사용되는 명령어이다. |
3. 커밋하기 애매한 변화 치워두기
* 현업에서 한창 작업 중, 급하게 수정해야하는 다른 사항들이 생길 경우, 지금까지 작업하고 있던 내역들을 커밋하는 것이 아닌 git의 스태시라는 다른 공간에 잠시 저장해둘 수 있다.
1) stsah 사용 방법
$git add .
$git stash
git stash를 사용하면, commit 후 현재까지 수정되었던 add 내용들이 사라지게 된다. => 스태시 공간으로 이동된 것
해당 스태시 내역은, git stash list명령어를 사용하거나 혹은 소스트리 - 스태시에서 확인할 수 있다.
stash를 다시 가져와서 적용하기 위해서는 아래의 명령어를 사용하면 된다.
$git stash apply
2) 원하는 것만 stash 해보기
stash 또한 내가 원하는 것만 옮겨둘 수 있도록 할 수 있다.
$git stash -p
commit 처럼 stash도 어떤 것을 옮겨둔 것인지 알 수 있도록, -m을 통해 간단한 메시지를 작성할 수 있다.
$git stash -m 'Stash3';
3) Stash 삭제 방법
$git stash drop
# 마지막 stash 삭제
$git stash drop (리스트상 번호)
# ex. git stash drop stash@{1}
4) Stash 적용 + 삭제
- 해당 Stash를 apply로 적용한 후, 삭제하는 것을 한 번에 할 수 있도록 하려면 아래의 명령어를 사용하면 된다.
$git stash pop
# 끝에 번호를 추가함으로써 항목을 지정할 수 있다.
5) 새 브랜치를 생성하여 stash pop 진행
- 새 브랜치를 생성하여 pop을 진행할 수 있으며, 이는 main브랜치에서 또 다른 작업을 하고 있는 경우 pop을 통해 충돌이 발생할 수 있는 가능성을 막기 위해 주로 사용한다.
[ 정리 ]
명령어 | 설명 | 비고 |
git stash | 현 작업들 치워두기 | 끝에 save 생략됨. |
git stash apply | 치워둔 마지막 항목(번호 없을 시) 적용 | 끝에 번호로 항목 지정 가능 |
git stash drop | 치워둔 마지막 항목(번호 없을 시) 삭제 | 끝에 번호로 항목 지정 가능 |
git stash pop | 치워둔 마지막 항목(번호 없을 시) 적용 및 삭제 | apply + drop 한번에 작동 |
git stash branch (브랜치명) | 새 브랜치를 생성하여 pop | 충돌사항이 있는 상황 등에 유용 |
git stash clear | 치워둔 모든 항목들 비우기 |
4. 커밋 수정하기
1) 과거 커밋 메시지 변경 방법
$git commit --amend
2) 과거 커밋에 변화 추가
- 지난 커밋에 하나를 추가해서 변화시키고 싶을 경우
$git add .
$git commit --amend # 아무 이름으로나 일단 저장
$git commit --amend -m '과거 커밋 메시지'
- 아래의 방법으로도 가능하다.
$git commit --amend -m "과거 커밋 메시지"
5. 과거의 커밋들을 수정, 삭제, 병합, 분할하기
$git rebase -i 대상 바로 이전 커밋
git rebase -i (대상 바로 이전 커밋) 을 통해, 과거 커밋 내역들을 다양한 방법으로 수정할 수 있다.
명령어 | 설명 |
p, pick | 커밋 그대로 두기 |
r, reword | 커밋 메시지 변경 |
e, edit | 수정을 위해 정지 |
d, drop | 커밋 삭제 |
s, squash | 이전 커밋에 합치기 |
* pick을 어떻게 수정하고 저장하느냐에 따라서, 각 커밋에 대해 무엇을 할 지 지정 가능하다.
ex 1) 커밋 메시지 변경 : r(reword)
ex 2 ) 커밋 삭제 : d(drop) / 커밋 항목들 합치기 : s(squash)
* 합쳐질 항목 중 뒤의 커밋에 s 작성하기
ex 3) 커밋 항목 나누기 : e(edit)
e로 수정 후 저장한 후, 아래의 명령어를 입력하기
$git reset HEAD^
# commit을 한 단계 돌아가되, 내용은 그대로 저장되어 있도록 mixed로 사용
이 상태에서 저장될 커밋 항목에 해당하는 파일끼리, add + commit 시켜주기
이후 git rebase--continue를 통해 마무리해주면 완료된다.
# git은 모든 commit 내역들이 순차적으로 저장된다. 따라서 어떤 특정 시점의 과거 내역이 변경되면, 그 다음에 이뤄지는 변경사항들은 이전과 같은 것이 아니게 된다.
# 따라서 git에서 과거의 어떤 내역을 수정하기 위해서는, 특정 시점부터 이후까지 전부 다 내역을 변경해 작성하는 새로운 branch를 만든 후, rebase로 가져다 붙이는 식으로 바꾸는 방식을 사용해야 한다.
[ rebase 되돌리기 방법 ]
git reflog로 해당 번호 가져오기
gi reset --hard 번호
git rebase --quit
git switch main
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |