개발자취

TIL | Git Command 총정리 본문

개발/Dev | 웹개발

TIL | Git Command 총정리

hnhnhun 2022. 8. 19. 14:44

1. 포스팅의 목적

프로젝트를 진행함에 앞서 분산 버전 관리 및 협업을 위한 리포지토리 관리툴은 반드시 필요하다. 이때 거의 대다수가 Github를 이용하곤 한다. 쓰니도 대다수처럼 Git bash를 활성화 하여 command line으로 remote repository에 접근하는 일을 수없이 반복해오며 자주 쓰는 명령어를 곧잘 외워서 잘 사용했다. 하지만 가끔씩은 본의 아닌 commit으로 꽤나 난처한 경우가 생기곤 한다. 그럴땐 재빠르게 구글링으로 무마시키지만, 이러한 과정은 버그를 발견하지 못하는 상황과 맞먹을 정도의 스트레스를 동반하곤 한다. 따라서 /*쓰니와 읽는 이의 정신건강을 위해*/ git remote/local repository 생성 과정과 git command를 한 페이지에 담아 쉽게 기억할 수 있도록 포스팅을 써보겠다. Windows 환경을 시작으로 Linux, MAC-OS 등으로 확장시켜 내용을 보충할 것이다.

1.1 환경

  • Windows 11 Pro, 터미널
  • 용어정리 : 원격 리포지토리(remote repository), 로컬 리포지토리(local repository), 커밋(commit), 푸시(push), 커맨드(command)

1.2 시각적 구조

Git repository를 처음 써봤을 때를 생각해보면, 커맨드를 순차적으로 기억하면서 사용했었다. 그래서 사용법은 얼추 알았지만 전체적인 구조를 파악해본 적은 없었던것 같다. 그래서 git command를 정리하면서, 원격 저장소에 로컬 데이터가 어떠한 구조로 도달하는지를 시각적으로 나타내보았다.

From WD to LR
From LR to RR

2. 리포지토리 생성

2.1 원격 리포지토리 생성
STEP 1 | 리포지토리 생성
리포지토리 생성을 위한 버튼은  Repositories  Tab에서 확인할 수 있다.

리포지토리 생성 1


STEP 2 | Create a new repository setting
Repository name을 설정하고, repo의 공개 여부를 public/private으로 선택한다. 그리고 기타 사항인 README.md, .gitignore, license를 선택 혹은 추가할 것인지를 세팅한다.

리포지토리 생성을 위한 초기 세팅


STEP 3 | Repository 생성 후 초기화면
repository를 생성한 뒤에 출력되는 초기화면에는 git command line이 친절하게 명시되어있다.

Quick setup ㅡ "if you've done this kind of thing before"

HTTPS 형태로 주소를 복사한다. "https://github.com/youngvctr/test-repo.git"
...or create a new repository on the command line
> 새로운 repository를 command line으로 생성

$ echo "# test-repo" >> README.md 
> README.md 파일을 생성하여 "# test-repo"를 기록

$ git init
> git initialization

$ git add README.md
> stage에 README.md를 추가

$ git commit -m "first commit"
> message는 first commit으로 지정하여 commit

$ git branch -M main
> branch 이름은 main

$ git remote add origin https://github.com/youngvctr/test-repo.git
> git 원격에 https://github.com/youngvctr/test-repo.git를 추가

$ git push origin main
> git push
...or push an existing repository from the command line

$ git remote add origin https://github.com/youngvctr/test-repo.git
> remote repository(origin)에 https://github.com/youngvctr/test-repo.git를 추가함

$ git branch -M main
> branch 명을 main으로 설정

$ git push -u origin main
> main branch로 push (-u, --set-upstream ; set upstream for git pull/status)

+ 그래도 부족하다면,

$ git help -a
> See 'git help <command>' to read about a specific subcommand

$ git help -g
> The Git concept guides are:

$ git help add
> add와 관련한 문서 열람

$ git help commit
> commit과 관련한 문서 열람

$ git help push
> push와 관련한 문서 열람


2.2 로컬 리포지토리에 리모트 리포지토리를 clone하는 경우

$ git clone https://github.com/youngvctr/test-repo.git


2.3 로컬 리포지토리 생성한 후 확인할 것

$ git remote
> origin ; 원격 리포지토리의 이름이 출력됨 

$ git remote -v
> 현재 remote와 local 설정이 제대로 연결되었는지 확인할 수 있다.

 

3. 반복해서 쓸만한 git command

3.1 반복적으로 쓸만한 command

매커니즘 | 파일 추가(add) -> 커밋(commit) -> 푸시(push)

  • 의미 : 앞서 진행한 세팅이 완벽한 경우, 반복해서 쓸만한 git command
  • git command는 원격 리포지토리가 존재하는 로컬 리포지토리로 이동한 경로를 기점으로 커맨드를 시작한다.
  • 예를 들어 파일명이 'test-example', 'test-example-2 라고 한다면,
$ git add test-example
> 원격 repo로 올리기 위한 stage에 test-example 파일을 추가한다.

$ git add test-example test-example-2
> stage에 test-example, test-example-2를 추가한다.


$ git add .
> 원격 repo로 올리기 위한 stage에 경로 내에 (변경된)모든 파일을 추가한다.

$ git commit -m "이곳에 커밋메시지를 작성해주세요"
> 커밋 메시지를 one line으로 작성하는 방법
or
$ git commit 
> 커밋 메시지 작성을 위해 커밋 OOO으로 이동
> 'S/ㄴ' key를 누르면, 커서가 활성화되고, 그 때 커밋 메시지를 작성하면 됨.
> ESC를 누르고 :wq (write quit)를 입력하면 커밋이 완료됨.

3.1.1 Add 혹은 Commit이 잘못된 경우

  • onstage에 add한 파일을 취소, commit 메시지 수정, commit 취소
$ git reset
> add 취소

$ git commit --amend -m "message"
> commit 수정

$ git reset HEAD^
> 직전 commit을 취소

3.1.2 괜찮은 커밋 메시지 모음

Git-Msg

  • 이런건 미리 모아두면 좋잖아요? = )
```
"<type>(<scope>): <subject>"

ex:
fix(middleware): ensure Range headers adhere more closely to RFC 2616

Add one new dependency, use `range-parser` (Express dependency) to compute
range. It is more well-tested in the wild.

Fixes #2310
```

$ git commit -m "feat: subject"
> build script의 새로운 특징이 아닌, 사용자를 위한 새 기능

$ git commit -m "fix: subject"
> build script의 수정 사항이 아닌, 사용자에 대한 버그 수정

$ git commit -m "docs: subject"
> 문서의 변경 사항을 기록, README.md를 변경

$ git commit -m "style: subject"
> 포맷, 세미콜론 누락 등, 생산 코드에는 변경 없음

$ git commit -m "refactor: subject"
> 생산 코드 리팩토링(ex: 변수명 변경)

$ git commit -m "test: subject"
> 생산 코드는 변경 없고, 결측 테스트, 리팩토링 테스트

$ git commit -m "chore: subject"
> 그냥 아무 작업이나, 생산 코드는 변경 없음


```생략될 수도 있는 내용
Example values: 
init
runner
watcher
config
web-server
proxy
etc.
```

 

3.2 브랜치를 생성한 후 push를 진행

매커니즘 | 버전관리를 위해 분기점인 브랜치를 생성하여 분기점에 푸시하는 형태로, 만든 후 주 버전에 merge 하여 원격 리포지토리의 버전관리가 가능하다.

  • branch : 버전관리를 위한 분기점이라고 생각하면 된다.
  • 현재 branch : default 브랜치 명은 master다. 하지만 master라는 이름이 불편하므로 -M main으로 변경해서 지정하자.
  • 'tbranch'라는 브랜치를 생성해서 push를 진행한다면,
$ git branch tbranch
> tbranch를 생성한다.

$ git checkout tbranch
> 현재 브랜치를 tbranch로 이동한다.

$ git push origin tbranch
> 현재 브랜치에 push를 진행한다.

$ git checkout main
> 현재 브랜치를 main으로 옮긴다.

$ git merge tbranch
> 현재 브랜치에 tbranch를 merge(병합)한다.

$ git push -u origin main
> main 브랜치에 병합한 결과를 push한다.

 

3.3 브랜치를 생성하지 않고 현재 브랜치에 push를 진행

  • 현재 브랜치에 push를 진행한다.
  • 만약 현재 브랜치가 이전에 만들어둔 브랜치라면, branch를 변경한 후 push를 진행하면 된다.
  • 현재 브랜치가 'tbranch'라고 가정해보자.
$ git branch
> 현재 브랜치를 보여준다.

*tbranch  
 main

$ git checkout main
> master로 브랜치를 옮긴다.

$ git push
> 원격 리포지토리에 로컬에서 stage한 파일을 푸시하는 마지막 작업

 

3.4 브랜치 삭제

  • merge를 완료한 브랜치를 삭제하고 싶다면
$ git branch -d tbranch 
> stage에 생성한 tbranch를 삭제한다.

$ git push origin --delete tbranch
> 원격 리포지토리에 생성한 tbranch를 삭제한다.

 

4. 잘못 commit한 파일 처리

4.1 Git에 commit한 기록은 남겨두고 잘못 commit한 파일만 remove

  • 캐시(cached)로 저장된 기록을 rm(remove)
$ git rm --cached -r test-example-2
> test-example-2 를 remove함

$ git commit -m "Fixed untracked files"
> Fixed untracked files인 것을 명시함. 커밋 메시지도 중요함.

$ git push
> rm으로 commit한 결과가 원격 리포지토리에 반영됨.

 

4.2 Git에 commit한 기록과 잘못 commit한 파일까지 싹 다 remove

!매우 위험하니 !주의! 당황해서 어투도 바꾸었으니 제발 확인 후 진행할 것!

  • 다음 커맨드를 확인하기 전에 로컬 데이터를 백업해 두셨나요? (백업 안했으면 그냥 돌아가세요)
  • 원격 리포지토리에 있는 데이터는 로컬 리포지토리에 영향을 줍니다. 반드시 백업을 다른 곳에 시켜둔 후 진행하세요.
$ git log --oneline
> 로그를 띄워주세요.

// 다음과 같이 출력되었다고 가정합시다.  
eeeeeee (HEAD -> master, origin/master) 5th commit  
ddddddd 4th commit  
ccccccc 3rd commit  
bbbbbbb 2nd commit  
aaaaaaa 1st commit

$ git reset --hard "ccccccc"

> 3rd commit으로 돌아갑니다.

$ git push -f

> 강제로 진행시켜

강제로 진행시키면 로컬에 있는 데이터랑 생이별을 할 수도 있어요.
그러니 제발 부탁이니까 데이터 백업해두고 원격 리포지토리를 다루자고요.

Comments