Git 기본

 

Remarks

{NAME} 와 같은 형식으로 되어 있는 부분은 각자 customize 해야할 부분이다.
origin 역시 바뀔 수 있는 remote repo 이름이지만 편의상 고정함.

1. Github 가입 후 repository 생성

https://github.com

2. Git 다운로드

https://git-scm.com/downloads

3. User 설정

$ git config --global user.name "{NAME}"   # NAME 제한 없음
$ git config --global user.email "{EMAIL}" # Github 가입 email

$ git config --list  # user.name, user.email 확인 

4. Remote repository 연동

4.1 기존 파일들이 없는 경우

$ git clone {REPO-URL}  # REPO-URL은 .git으로 끝남
ex) $ git clone https://github.com/alchemine/git-exercise.git

4.2 기존 파일들이 있는 경우

$ cd {PROJECT-DIRECTORY}
$ git init
$ git branch -M main                # rename: current branch -> main (remote branch name)
$ git remote add origin {REPO-URL}  # "origin" 이라는 이름으로 remote(github) repository 정보를 저장
$ git remote -v                     # 연동된 remote repo 확인

5. Commit, Push

$ git add .   # current working directory에 포함된 모든 파일(디렉토리)들을 remote repo에 올리기로 설정 (unstage -> stage)
$ git status  # 수정 사항 확인 (staged)
$ git commit -m "First commit"
$ git push -u origin main
  # -u option을 통해 이후 remote repo, branch를 생략할 수 있음
  # $ git push
  # $ git pull

이후 위와 거의 유사한 수행을 다음의 명령어를 통해 수행할 수 있음
참고: git add . vs git commit -a

$ git commit -a -m "First commit"
$ git push

6. Pull

$ git pull origin main

7. Log

Git history를 확인할 수 있음
git log --oneline --graph를 자주 쓰기 때문에 gitlog와 같이 alias 지정을 해두면 편하다

$ git log
$ git log --oneline --graph

8. Revert, Reset

$ git log --oneline --graph
* cb473e3 (HEAD -> master, origin/master) Commit 2
* 0f92b64 Commit 1

위와 같은 상황에서 Commit 2를 없던 것으로 하고 싶은 경우 사용할 수 있는 방법이 revert, reset이다.

8.1 Revert: 되돌아간 기록을 남김

$ git revert cb473e3
$ git log --oneline --graph
* dc47cb4 (HEAD -> master) Revert "Commit 2"
* cb473e3 (origin/master) Commit 2
* 0f92b64 Commit 1
$ git push

8.2 Reset: 되돌아간 기록을 제거

$ git reset --hard 0f92b64
$ git log --oneline --graph
* 0f92b64 (HEAD -> master) Commit 1
$ git push -f  # force(-f) option이 필요

단, push -f를 수행하기 전 누군가 pull하여 되돌리고 싶은 commit을 가지고 있다면 그 사람이 push하게 되는 경우 다시 remote repo에 되돌리고 싶은 기록이 나타난다.

9. Branch

$ git branch                            # list local branches
$ git branch -r                         # list remote branches
$ git branch -a                         # list local, remote branches
$ git branch {BRANCH-NAME}              # Generate new branch
$ git checkout -b {BRANCH-NAME}         # Generate new branch & checkout
$ git checkout -t origin/{BRANCH-NAME}  # Get branch from remote repo & checkout
$ git branch -M {BRANCH-NAME}           # Force Rename
$ git branch -D {BRANCH-NAME}           # Force Delete

10. Checkout

$ git checkout {BRANCH-NAME}   # Change working branch
$ git checkout -b {COMMIT-ID}  # Generate new branch with {COMMIT-HASH} & checkout
$ git checkout {TAG-NAME}      # Checkout to the commit with the tag

11. Tag

$ git tag                           # List all tags
$ git tag {TAG-NAME}                # Tag to the current commit
$ git tag {TAG-NAME} {COMMIT-ID}    # Tag to the target commit
$ git push origin {TAG-NAME}        # Push the tag to the remote repo
$ git push --tags                   # Push all tags to the remote repo
$ git tag -d {TAG-NAME}             # Delete the tag in local repo
$ git push origin :tags/{TAG-NAME}  # Delete the tag in remote repo
$ git checkout {TAG-NAME}           # Checkout to the commit with the tag