> Hello World !!!

     

@syaku

자주 사용하는 Git CLI (Command line interface)

CLI(Command line Interface)는 습관입니다.

외운다고 되는 것이 아니라 시간을 투자해 반복적으로 사용해야 몸에 익혀져요.

GUI Tool로 쉽게 할 수 있지만 CLI로 서투르지만 하나하나 해보세요.

처음에는 시간이 걸릴지라도 점점 자유롭게 쓸 수 있을 거예요.

GUI Tool에 의존하지 마세요. Git을 얼마나 많이 사용하나요?

전 빈번하게 사용을 해요. 여러 프로젝트를 다루다 보니 이곳저곳 프로젝트를 돌아다니죠.

MSA 기반이라면 더더욱 그럴 것 같아요.

그리고 자주 사용될 Git 명령어들이 복잡할까요? 그렇지 않아요. 복잡할 경우는 극히 드물어요.

그래서 전 IntelliJ 나 VSCode에 내장되어 있는 터미널로 빠르게 명령을 내릴 수 있어요.

GUI Tool을 실행하고 프로젝트를 찾고 커밋 파일들을 스테이지하고 메시지를 입력하고 커밋 하는 수고를 줄일 수 있어요.

이게 점차적으로 반복될 때 GUI Tool 을 작업시간을 변함없지만 Git CLI는 점점 작업 시간이 줄어들 거예요.

명령어가 기억나지 않는다면 -h 옵션으로 확인할 수 있습니다.

$ git log -h

tab 키를 이용하면 단어에 관련된 명령어도 리스트 업해주기도 해요.

rebase를 사용하세요. 처음 시작은 merge로 사용하는 게 뭐가 문제냐 싶지만 시간이 지나보면 내가 무슨 짓을 한 거지 깨달을 거예요.

쓸모없는 커밋은 정리해 주는 게 좋아요. 이것도 rebase로 할 수 있고 -i 옵션을 사용하면 돼요.

아래는 주로 사용하는 명령어를 정리해 보았어요. 생각날 때마다 추가할게요.

설정

git 설정 보기

$ git config -l

원격 저장소 설정하기

# 원격저장소 복제하기
$ git clone http://....

# 기본 원격 저장소 설정
$ git push -u 원격저장소명

# 원격 저장소 등록
$ git remote add origin http://...

# 원격 저장소 이름 변경
$ git remote rename origin remote

기본 명령어

pull rebase

# 원격 저장소 내려받고 rebase 하기
git pull --rebase

pull merge 되돌리기 (복원하기)

$ git reset --head ORIG_HEAD
$ git reset --merge ORIG_HEAD

원격 브랜치 가져오기

# 원격 정보를 업데이트 한다.
git remote update

# 브랜치를 생성하고 가져온다.
git checkout -t origin/브랜치명

# 다른 브랜치를 생성하고 가져온다.
git checkout -b 새로운브랜치명 origin/브랜치명

# 브랜치가 아닌 커밋을 직접 참조한 상태에서 가져온다. Detached HEAD 라고한다.
git checkout origin/브랜치명

변경된 상태 초기화하기

# 특정 파일 변경 상태 초기화하기
$ git restore 파일명

# 스테이지 상태를 내리기
--stage

# 변경 상태 초기화 하기
$ git reset --hard 

--mixed               HEAD와 인덱스를 초기화
--soft                HEAD만 초기화
--hard                HEAD, 인덱스, 작업폴더를 초기화

# 변경사항 청소하여 정리하기
$ git clean -i -d

-d: 폴더까지 제거

현재 브랜치 변경하기

$ git switch 브랜치명

강제 원격저장소 push 하기

$ git push -u 원격저장소명 +브랜치명

stash

$ git stash

or

# 현재 스테이지을 스태쉬에 저장하기
$ git stash save

# 저장된 스태쉬 목록보기
$ git stash list

# 스태쉬 적용하기
$ git stash apply stash@{0}

# 적용한 스태쉬 되돌리기 (복원하기)
$ git stash show -p | git apply -R

# 저장된 스태쉬 삭제하기
$ git stash drop stash@{0}

고급

커밋 히스토리 변경 : rebase

$ git rebase -i @~3

-i: 인터랙티브 (상호간에 협의에 의해 결정하는 것) 즉 사용자가 리베이스할 커밋 목록을 편집할 수 있도록 한다.
@~3: 최근 3개의 커밋을 rebase 한다.
--root: 전체 커밋을 rebase 한다.

# p, <commit> 선택 = 커밋 사용
# r, reword <commit> = 커밋을 사용하지만 커밋 메시지를 편집합니다.
# e, edit <commit> = 커밋을 사용하지만 수정을 위해 중지
# s, squash <commit> = 커밋을 사용하지만 이전 커밋에 병합
# f, fixup <commit> = "squash"와 비슷하지만 이 커밋의 로그 메시지를 버립니다.
# x, exec <command> = 쉘을 사용하여 명령(나머지 줄) 실행
# b, break = 여기서 중지(나중에 'git rebase --continue'로 계속 리베이스)
# d, drop <commit> = 커밋 제거
# l, <label> 레이블 = 현재 HEAD에 이름으로 레이블 지정
# t, <label> 재설정 = HEAD를 레이블로 재설정

--continue 계속
--skip 현재 패치를 건너뛰고 계속
--abort 중단하고 원래 분기를 확인합니다.

코멘트변경

$ git commit --amend

커밋 히스토리 조회

# 2개 커밋 로그 출력

$ git log -p -2

# 커밋 로그 통계 출력

$ git log --stat

# 커밋 로그 한줄 출력

$ git log --pretty=oneline

# 커밋 로그 그래프로 보기

$ git log --pretty=oneline --graph

상태(log, diff, show) 출력시 사용할 수 있는 옵션
common diff options:
  -z            output diff-raw with lines terminated with NUL.
  -p            output patch format.
  -u            synonym for -p.
  --patch-with-raw
                output both a patch and the diff-raw format.
  --stat        show diffstat instead of patch.
  --numstat     show numeric diffstat instead of patch.
  --patch-with-stat
                output a patch and prepend its diffstat.
  --name-only   show only names of changed files.
  --name-status show names and status of changed files.
  --full-index  show full object name on index lines.
  --abbrev=<n>  abbreviate object names in diff-tree header and diff-raw.
  -R            swap input file pairs.
  -B            detect complete rewrites.
  -M            detect renames.