Git commit // Git(3) / 노션이동완료

2022. 2. 25. 20:02
  • 얄코님의 git강의 중 commit에 관한 부분
  • 단순하게 'add > commit > push'을 넘어서 조금 더 세세한 부분들에 대하여 다룸
  • 세부내용은 다음과 같음
    • (협업을 위해)커밋시 권장사항
    • hunk를 활용한 세심한 스테이징
    • stash 활용 : 커밋하기 애매한 변화 치워두기
    • 마지막 커밋 수정 : amend
    • 이전 커밋 수정 : rebase -i

 

 

 


 

1. (협업을 위해)커밋시 권장사항

  • 하나의 커밋에는 한단위의 작업을 넣는다!
    • 한 작업의 여러버전을 커밋하지 않는다!
    • 여러 작업을 한 버전에 커밋하지 않는다!
  • 커밋 메시지는 어떤 작업이 이뤄졌는지 알 수 있도록 한다
    • 널리 사용되는 커밋 메시지 방식(컨벤션 방식)을 사용하는 것을 추천
    • 컨벤션 방식은 Type(커밋의 타입) / Subject(커밋의 작업 내용) / Body(필요시 상세내용) / footer(브레이킹 포인트 및 특정 이슈에 대한 작업일 때 선택적으로 사용)으로 구성
    • 예시
##형식##
type: subject
(한줄 띄우고)
body (optional)
...
...
...
(한줄 띄우고)
footer (optional)



##예시##
feat: 압축파일 미리보기 기능 추가

사용자의 편의를 위해 압축을 풀기 전에
다음과 같이 압축파일 미리보기를 할 수 있도록 함
 - 마우스 오른쪽 클릭
 - 윈도우 탐색기 또는 맥 파인더의 미리보기 창

Closes #125 << 어떤 문제에 대한 해결책인지

 

2. hunk를 활용한 세심한 스테이징

  • 파일이 아니라 파일 내부의 덩어리(hunk)별로 스테이징이 가능함
  • 즉, 같은 파일 이라도 어떤 부분은 스테이징을 하고, 어떤 부분은 스테이징을 하지 않을 수 있음
  • 다음을 입력하고, 각 헝크별로 y/n을 입력해서 스테이징이 가능. 더 많은 옵션을 보고싶으면 ?를 입력하면 됨
#헝크별로 스테이징
git add -p

 

  • 참고로 헝크는, 수정하지 않은 부분을 기준으로 나누어짐.
    • 예를 들어 이전에 커밋된 파일을 기준으로 수정된 부분 > 수정안된부분 > 수정된 부분 과같은 식으로 수정내용이 존재하면, 이 파일의 헝크는 수정된 부분의 앞쪽/뒤쪽으로 총 두개임
  • 또한, 한 파일 내의 여러 헝크중 일부만 스테이징(git add)할 경우, 해당 파일은 git status를 했을 때, staged 파일과 unstaged 둘다에서 확인됨(일부만 staging됬으니까)

unstageing과 staging 둘다에서 동일한 파일을 찾을 수 있다!

 

  • commit을 진행할 때도, 헝크별로(파일별로) 확인이 가능하다.
  • 물론 헝크별로 확인할 수 있게 나온다는 것이지, 스테이징 할 때처럼 파일의 일부만 커밋하고 그런건 불가능
  • 추가)
    • 'git diff --staged'는 스테이징된 내용을 헝크별로 확인할 수 있게 함.
    • 즉, 'git commit -v' 는 'git diff --staged'와 'git commit'을 합친 것과 같음
#커밋시, 헝크별로 확인할 수 있음
git commit -v

#git commit -v 는 다음의 두 줄을 합친것과 같음
git diff --staged
git commit

 

3. stash 활용 : 커밋하기 애매한 변화 치워두기

  • stash : 일종의 임시저장소
  • working directory나 staging 혹은 repository와 다른 별개의 임시저장소임!!
#stash에 현재 작업 내역을 넣어두기
git stash

#메시지와 함꼐 stash
git stash -m 'Add Stash3'

 

  • 마치 hunk별로 commit 하듯이, stash도 그게 가능함
  • hunk별로 y/n을 입력해서 원하는 것만 stash에 넣음
git stash -p

 

  • stash는 여러개가 존재할 수 있음
  • git stash list로 스태시의 목록을 볼 수 있고, 리스트상의 번호로 여러가지 명령어가 적용이 가능함
#스태시 목록 보기
git stash list

 

  • 해당 리스트의 번호를 참고하여 여러가지 명령이 가능함
  • 참고로 명령어를 사용해도, 일반적으로는 stash리스트가 그대로 남아있음(pop을 쓰거나 지워주지 않는 이상)
#형식
git stash 명령어 stash리스트이름
#예시
git stash apply stash@{1}

 

4. 마지막 커밋 수정 : amend

  • 특정 파일을 스테이징(git add)한 후, 다음을 입력하면 마지막 커밋에 해당 파일의 수정내용을 포함시킬 수 있음
  • 해당 명령어를 입력하면 에디터가 열리고, 거기서 이름을 바꾸면 된다.
  • 만약 파일의 변화없이 동일한 명령어를 입력시, 커밋이름만 바꿀 수 있는 것임

 

#마지막 커밋에 스테이징 내용들 추가 & 커밋이름 변경
git commit --amend
#한줄로 커밋의 메세지를 변경시킬 수도 있음(더 간편)
git commit --amend -m 'Add members to Panthers and Pumas'

 

5. 이전 커밋 수정 : rebase -i

  • 과거의 깃 이력을 수정할 수 있음
  • 수정하려는 커밋보다 이전 커밋의 해쉬태그를 함께 입력해줘야 함!
  • 해쉬태그를 입력하면 에디터가 켜짐
#과거 커밋 수정
git rebase -i (수정하려는 커밋보다 이전 커밋의 해쉬태그)

 

  • 다음과 같이 이전 커밋들을 수 있음
  • 여기서 edit은 , 해당 커밋을 수정하기 위해 그시점으로 돌아간다는 뜻임
    • 예시)두 작업이 함께 있는 커밋 > 해당 커밋 edit > 해당 커밋이 딱 완료된 시점으로 돌아감
    • 해당 커밋에서 git reset HEAD^입력(그러면 완료된 커밋이 취소되고, 작업 내용이 working directory로 감)
    • 거기서 작업을 분리해서 따로 커밋을 해줌
    • 마지막으로 git rebase --continue

에디터에 입력할 수 있는 명령어

#예시(삭제:d / 이전 커밋에 합치기 : s)
pick c4949b7 버그 수정
d 92a8abf 뻘짓
pick b2a4f65 결전의 찜질방 맵 추가중
s 179f7ac 결전의 찜질방 맵 추가 완료
pick 4e29b6e 캐릭터 귤맨 추가, 시작메뉴 디자인 변경
pick c0372dd 성능 개선

 

  • 과거 커밋을 조정하는 명령어가 git rebase를 사용하는 이유
  • 이전의 특정 커밋으로 돌아가서 작업을 하면, 특정 커밋 이후의 모든 커밋들은 해당 커밋의 영향을 받게 됨
  • 따라서, rebase -i를 사용하여 과거커밋에서 변화를 발생시키는 경우, git이 내부적으로 임의의 branch를 생성하고 거기서 변화를 발생시킨 후, 최종적으로 기존의 커밋들에 rebase를 통해 들고와서 합침

과거의 변화발생 > 임의의 다른 브랜치에서 변화를 일으킴 > 변화가 발생했던 브랜치를 기존 브랜치에 rebase하여 합침

 

BELATED ARTICLES

more