[Git] - 나만 알기 아까운 Git 정리 : 1편
Git / September 21, 2020
약 한 달간의 오픈소스 컨트리뷰톤이 끝나고 가장 유익했다고 생각되는 건 바로 Git 공부일 것이다.
LearnGitBranching 이라는 사이트와 멘토님의 열혈 지도 덕분에 rebase
와 reflog
등 정말 듣도보도 못한 새로운 기능들을 배울 수 있었는데, 이 좋은 걸 나만 알긴 아까우니 정리해보려 한다.
1. 깃의 기본
깃을 사용하는 목적은 코드의 버전 및 형상을 관리하기 위함이다.
우선 용어를 간단하게 정리할 필요가 있는데 ‘로컬 저장소’ 라 함은 기본적으로 내 로컬 프로젝트의 git 저장소를 의미하고, ‘원격 저장소’ 라 하면 GitHub 등 네트워크 상의 git 저장소라고 생각하면 될 것이다.
위 그림은 깃의 동작을 간단하게 그림으로 나타낸 것이다.
스테이징 영역은 내 작업을 커밋하기 전에 잠깐 거쳐가는 곳으로, 이곳에서 어떤 파일을 커밋에 포함하고 제외할지 지정할 수 있다.
[둘러보면 좋은 글 : git의 staging area는 어떤 점이 유용한가]
1. 1. 변경사항이 존재하는 모든 코드 스테이징하기
$ git add .
1. 2. 특정 폴더 또는 파일만을 스테이징하기
$ git add [특정 파일 또는 폴더명]
# 파일은 확장자를 포함하며, 빈 폴더일 경우 스테이징이 불가능하다.
1. 3. 모든 스테이징 취소하기
$ git reset
1. 4. 특정 폴더 또는 파일 스테이징 취소하기
$ git reset [특정 파일 또는 폴더명]
2. 커밋 (commit)
스테이징까지 끝난 코드들은 본격적인 버전 관리를 위해 기록을 남겨야 하는데 이게 바로 ‘커밋’이다.
커밋은 깃의 주인공이라고 해도 과언이 아닌데, 여기에는 파일 및 폴더의 수정 시간, 이전 커밋과 비교 후 변경 이력 등의 정보가 담기게 되며 깃을 다룰 때는 모든 작업을 코드가 아닌 커밋
을 중심으로 생각해야 한다.
따라서 보통 하나의 작업당 한 커밋만을 수행하는 것을 권장하고 커밋 메시지에는 작업한 내용이 드러나도록 한다.
Ex. 기능이 다른 컴포넌트 A와 B의 수정 작업을 진행할 때
- 나쁜 커밋 메시지 예시 : 커밋 1 - “컴포넌트 A B 수정”
- 좋은 커밋 메시지 예시 : 커밋 1 - “컴포넌트 A 수정 - #이슈번호”, 커밋 2 - “컴포넌트 B 수정 - #이슈번호”
이걸 언제나 지키는건 어렵더라도 남과 협업하는 프로젝트에서는 반드시 지키는 것을 권장한다.
2. 1. 메시지를 포함한 커밋
$ git commit -m "커밋 메시지"
# 닫는 큰따옴표가 나타나기 전까지 엔터키로 개행도 자유롭게 가능합니다.
2. 2. 커밋 메시지 수정하기
$ git commit --amend
2. 3. 푸시 전 커밋 취소하기1
$ git reset --soft HEAD^
# 푸시하기 전 가장 최근 커밋과 스테이징을 취소합니다.
$ git reset --soft [커밋명^]
# 해당 커밋번호 이후의 모든 커밋과 스테이징을 취소합니다.
- 커밋명은 영문 + 숫자로 이루어진 40자리의 이름이 붙는데, 깃에서 커밋을 조작할 때는 앞(왼쪽)의 6자리만 떼어 사용해도 된다. (Ex. 977814bfbde6a604e4e4605f9d4fe3494bc0fe82 -> 977814)
3. 푸시 (push)
푸시는 내 커밋 기록을 원격 저장소에 추가할 때 사용한다.
원격 저장소 주소가 존재하지 않으면 푸시는 불가능하다.
푸시 동작을 수행하면 로컬 저장소의 커밋 기록과 원격 저장소의 HEAD 커밋을 비교한 후, HEAD보다 앞에 있을 때(최신일 때) 푸시를 진행한다.
3. 1. 특정 저장소 / 브랜치에 커밋 푸시하기2
$ git push [저장소명] [브랜치명]
3. 2. 특정 저장소 / 브랜치에 강제로 커밋 푸시하기
$ git push -f [저장소명] [브랜치명]
push -f
옵션은 원격 저장소를 로컬 저장소로 완전히 덮어쓴다.- 매우 위험한 옵션으로 평소에는 사용이 권장되지 않으며, 주로
interactive rebase
시에 사용한다.
3. 3. 특정 저장소 / 브랜치를 기본 푸시 타겟으로 설정하고 푸시하기
$ git push -u [저장소명] [브랜치명]
push -u
옵션을 사용하면 이후에는 저장소/브랜치를 직접 지정할 필요 없이git push
명령만으로 지정한 위치에 푸시한다.