CheatSheet | Git


Summary - PR

# 1. Fork repo to your own repo

# 2. clone, set remote
$ git remote # 현재 프로젝트에 등록된 리모트 저장소를 확인
$ git remote add <remote_name> <URL> # fork 해온 원래의 remote 추가

# 3. branch 생성
$ git checkout -b <feature/issue_number> # create new branch
$ git branch # Show all branches

# 4. 수정 작업 후 add, commit, push
# 4.1 add
$ git add *  # add changes to index
$ git status  # Check git status (staged/unstaged)
$ git reset HEAD <FILE> # cancle add, unclearstage file. unstage all w/o <FILE 
# 4.2 commit
$ git commit -m "explain this commit" #  commit
$ git commit --amend -m "modify commit message"
$ git log  # show commit log
# 4.3 push
$ git push <remote_name> <branch_name> # push to own remote repo # git push origin dev


# 5. Pull Request

# 6. Code Review

# 7. Merg
# 7.1 - Squash and Merge : PR 안에 있는 여러개 commit 을 새로운 하나의 commit 으로 => commit message를 새로 써줘야함 
# 7.2 - Rebase and Merge : PR 안에 여러개 commit이 있으면 여러개 commit을 그대로 merge

0. Setup Git Environment

# git user check
$ git config --list
$ git config --global --list

# Add user only for this project
$ git config user.name "Your Name"
$ git config user.email you@example.com

# Add user for global usage
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com

1. Create new git

# (1) create new git
$ git init # in the working dir, generates .git directory
$ git clone <URL> # 저장소를 clone하면 origin이라는 remote가 자동으로 등록 
$ git clone --recursive <URL> # 저장소 하위 submodule까지 recursive하게 clone
$ git clone -b <BRANCH> <URL> # branch를 따로 지정하지 않으면 master banch clone

# (2) Add remote git 
$ git remote # 현재 프로젝트에 등록된 리모트 저장소를 확인
$ git remote add <remote_name> <URL> # remote 추가

2. Modify : Add, Commit, Push

# (1) add
$ git add *  # add changes to index
$ git status  # Check git status (staged/unstaged)
$ git reset HEAD <FILE> # cancle add, unclearstage file. unstage all w/o <FILE 

# (2) commit
$ git commit -m "explain this commit" #  commit
$ git log  # show commit log

# (3) push
$ git push <remote_name> <branch_name> # changes from local to server

# (4) pull
$ git pull # 필요한 파일을 다운로드, 병합
$ git fetch  # 필요한 파일을 다운로드만

3. Branch

# (0) Show all branches
$ git branch

# (1) create new local branch
$ git branch <BRANCH>

# (2) change to the new branch
$ git checkout <BRANCH>

# (3) Delete branch
# (3.1) Delete local branch
$ git branch -d <BRANCH>
# (3.2) Delete remote branch
$ git push origin --delete <BRANCH>

4. gitignore File

# 로 시작하는 줄은 주석에 해당한다.

# 'file.ext' 이라는 이름의 파일을 ignore 처리한다
file.ext

# ignore 규칙을 정의하는 줄에 주석을 함께 섞어 쓰는 것은 허용되지 않는다
# 아래 줄은 'file.ext # not a comment' 라는 이름의 파일을 ignore 처리할 것이다
file.ext # not a comment

# 전체 경로를 통해 파일 ignore 처리하기
# 파일명만 기술된 규칙은 최상위 디렉토리뿐만 아니라 모든 서브디렉토리에 동일하게 적용된다
# 예) otherfile.ext 파일은 하부의 디렉토리 어디에 있던 모두 ignore 처리될 것이다
dir/otherdir/file.ext
otherfile.ext

# 디렉토리 전체를 ignore 처리하기
# 디렉토리 자체와 디렉토리 내의 모든 내용물들이 ignore 처리된다
bin/
gen/

# Glob 패턴 형식을 사용하여 특정 문자를 포함하는 경로를 ignore 처리할 수 있다
# 예를 들어, 아래의 규칙은 build/ 와 Build/ 두가지 경로 모두에 해당한다
[bB]uild/

# / 로 끝나지 않는 경로의 경우에는, 해당 규칙이 기술된 이름을 갖는 파일과 디렉토리 모두에 적용된다 
# 따라서, 아래 예제는 `gen` 이라는 이름을 가진 파일들 뿐만 아니라
# 동일한 이름의(`gen`) 디렉토리 및 해당 디렉토리의 내용물까지 모두 ignore 처리하게 된다
bin
gen

# 파일을 확장자 별로 ignore 처리하기
# 아래 기술된 확장자를 갖는 현재 디렉토리와
# 모든 서브디렉토리 내의 파일들이 ignore 처리될 것이다
*.apk
*.class

# 특정 디렉토리 지정과 특정 확장자 지정 규칙을 혼합하여 사용하는 것도 가능하다
# 아래에 기술된 규칙이 ignore 처리할 파일들은
# 위에서 지정한 규칙들이 ignore 처리하는 파일들과 중복된다
java/*.apk
gen/*.class

# 최상위 디렉토리에 존재하는 파일을 ignore 처리하되,
# 서브디렉토리 내의 동일한 이름을 갖는 파일들은 제외하고 싶다면 `/` 를 앞에 붙인다
/*.apk
/*.class

# DirectoryA 라는 이름의 디렉토리가 저장소 내 어떤 위치에 존재하던
# 모두 ignore 처리하고 싶다면 ** 를 앞에 붙인다 
# / 를 마지막에 붙이는 것을 잊지 말아야 한다
# 그렇지 않으면 DirectoryA 라는 이름의 디렉토리 뿐만 아니라 파일들까지 ignore 처리하게 된다
**/DirectoryA/
# 이 규칙은 다음 경로들을 ignore 처리할 것이다:
# DirectoryA/
# DirectoryB/DirectoryA/
# DirectoryC/DirectoryB/DirectoryA/
# 이 규칙은 DirectoryA 라는 이름의 파일을 ignore 처리하지는 않는다 (해당 파일이 어느 위치에 존재하든 무관)

# DirectoryA 라는 이름의 디렉토리 하부에 존재하는 DirectoryB 디렉토리를 ignore 처리하되
# 두 디렉토리 사이에 몇 단계의 다른 경로가 포함되어도 상관없이 ignore 하고 싶다면, 
# 두 디렉토리 경로 사이에 ** 문자열을 포함시켜 규칙을 작성할 수 있다
DirectoryA/**/DirectoryB/
# 이 규칙은 다음 경로들을 ignore 처리할 것이다:
# DirectoryA/DirectoryB/
# DirectoryA/DirectoryQ/DirectoryB/
# DirectoryA/DirectoryQ/DirectoryW/DirectoryB/

# 위에서 이미 살펴 보았듯이, 특정 파일들을 한꺼번에 ignore 처리하리 위해서 규칙 명세에 와일드카드를 이용할 수 있다 
# 이 때, '*' 하나를 단독으로 명시할 경우, .gitignore 까지 포함하여 폴더 내의 모든 파일들이 (의도치 않게) ignore 처리되게 된다
# 이렇듯 와일드카드를 사용하되 특정 파일은 ignore 처리하지 않으려면, ! 를 이용하여 예외 처리를 할 수 있다 
# 이렇게 예외처리로 명시된 파일은 ignore 목록에서 제외될 것이다:
!.gitignore

# 파일 이름 중에 해시(#) 문자가 존재할 경우, 백슬래시를 escape 문자로 이용하여 표기할 수 있다
# (1.6.2.1 버전 이후부터 지원)
\#*#

[Reference] https://rogerdudler.github.io/git-guide/index.ko.html)