본문 바로가기

문과 코린이의, [Git] 기록

[문과 코린이의 IT 기록장] Git 심화 - 커밋 관리하기 (커밋하는 방법 (권장사항), 보다 세심하게 스테이징하고 커밋하기, 커밋하기 애매한 변화 치워두기, 커밋 수정하기, 과거의 커밋들을 수정,..

반응형

[문과 코린이의 IT 기록장] Git 심화 - 커밋 관리하기 (커밋하는 방법 (권장사항), 보다 세심하게 스테이징하고 커밋하기, 커밋하기 애매한 변화 치워두기, 커밋 수정하기, 과거의 커밋들을 수정, 삭제, 병합, 분할하기)

[문과 코린이의 IT 기록장] Git 심화 - 커밋 관리하기 (커밋하는 방법 (권장사항), 보다 세심하게 스테이징하고 커밋하기, 커밋하기 애매한 변화 치워두기, 커밋 수정하기, 과거의 커밋들을 수정, 삭제, 병합, 분할하기)

 


 

 

제대로 파는 Git & GitHub - by 얄코 - 인프런 | 강의

코알못도 따라올 수 있는 친절하고 쉬운 강좌! 현업 개발자는 Git 박사로 들어주는 끝판왕 강좌!, - 강의 소개 | 인프런...

www.inflearn.com

2022.04.04 - [문과 코린이의, [Git] 기록] - [문과 코린이의 IT 기록장] GitHub 사용하기 (GitHub란?, GitHub 사용하기, GitHub 가입하고 토큰 만들기, GitHub Repository 생성 방법, GitHub Repository 삭제방법, 원격 저장소 사용하기, Push와 Pull, 원격의 브랜..

 

[문과 코린이의 IT 기록장] GitHub 사용하기 (GitHub란?, GitHub 사용하기, GitHub 가입하고 토큰 만들기, G

[문과 코린이의 IT 기록장] GitHub 사용하기 (GitHub란?, GitHub 사용하기, GitHub 가입하고 토큰 만들기, GitHub Repository 생성 방법, GitHub Repository 삭제방법, 원격 저장소 사용하..

vansoft1215.tistory.com

2022.04.05 - [문과 코린이의, [Git] 기록] - [문과 코린이의 IT 기록장] Git 심화 (VCS vs Git, Git에서 파일들이 거치는 상태 (Git의 3가지 공간), HEAD, fetch vs pull)

 

[문과 코린이의 IT 기록장] Git 심화 (VCS vs Git, Git에서 파일들이 거치는 상태 (Git의 3가지 공간), HEAD

[문과 코린이의 IT 기록장] Git 심화 (VCS vs Git, Git에서 파일들이 거치는 상태 (Git의 3가지 공간), HEAD, fetch vs pull) 제대로 파는 Git & GitHub - by 얄코 - 인프런 | 강의 코알못도..

vansoft1215.tistory.com

2022.04.06 - [문과 코린이의, [Git] 기록] - [문과 코린이의 IT 기록장] Git 심화 (Help와 문서 활용하기, Git의 각종 설정 (Git config))

 

[문과 코린이의 IT 기록장] Git 심화 (Help와 문서 활용하기, Git의 각종 설정 (Git config))

[문과 코린이의 IT 기록장] Git 심화 (Help와 문서 활용하기, Git의 각종 설정 (Git config)) 제대로 파는 Git & GitHub - by 얄코 - 인프런 | 강의 코알못도 따라올 수 있는 친절하고 쉬운 강좌!..

vansoft1215.tistory.com

 


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 대신, 이모지를 활용하는 방식을 사용할 수도 있음.

 

gitmoji

:truck: Move or rename resources (e.g.: files, paths, routes).

gitmoji.dev

 

 


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을 한번에 할 수 있음)

맨 위에 커밋명을 입력하고 저장하면 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명령어를 사용하거나 혹은 소스트리 - 스태시에서 확인할 수 있다.

0번이 가장 최근에 저장된 것

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)

i로 입력, esc로 입력 X => :wq!로 저장하기
커밋 메시지 수정 화면에서 수정하기


ex 2 ) 커밋 삭제 : d(drop) / 커밋 항목들 합치기 : s(squash)

* 합쳐질 항목 중 뒤의 커밋에 s 작성하기

메시지 수정 후 저장 (첫번째 커밋 메시지에 지정 메시지 작성 + 두번째 커밋 메시지 삭제)


ex 3) 커밋 항목 나누기 : e(edit)

e로 수정 후 저장한 후, 아래의 명령어를 입력하기

$git reset HEAD^
# commit을 한 단계 돌아가되, 내용은 그대로 저장되어 있도록 mixed로 사용

add되기 전의 상태로 돌아감

이 상태에서 저장될 커밋 항목에 해당하는 파일끼리, add + commit 시켜주기

이후 git rebase--continue를 통해 마무리해주면 완료된다.

HEAD가 있었던 것이 사라지면서 마무리된다.

 

# git은 모든 commit 내역들이 순차적으로 저장된다. 따라서 어떤 특정 시점의 과거 내역이 변경되면, 그 다음에 이뤄지는 변경사항들은 이전과 같은 것이 아니게 된다.

# 따라서 git에서 과거의 어떤 내역을 수정하기 위해서는, 특정 시점부터 이후까지 전부 다 내역을 변경해 작성하는 새로운 branch를 만든 후, rebase로 가져다 붙이는 식으로 바꾸는 방식을 사용해야 한다.


[ rebase 되돌리기 방법 ]

git reflog로 해당 번호 가져오기

gi reset --hard 번호

git rebase --quit

git switch main

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형