본문 바로가기
git & github

git github 처음부터 다시 배우기 - 5. git 활용

by spare8433 2023. 2. 13.

1. git clean 명령어


  • Git에서 추적(동록)하지 않는 파일들 삭제

옵션 설명
-n 삭제될 파일들 보여주기
-i 인터렉티브 모드 시작
-d 폴더 포함
-f 강제로 바로 지워버리기
-x ⚠️ .gitignore에 등록된 파일들도 삭제

  • 위의 옵션들을 조합하여 사용

※ 💡 흔히 쓰이는 조합: git clean -df



2. git restore 명령어


특정 파일을 지정된 상태로 복구


파일 여러 개를 수정하고 아래 명령어들 사용해보기


git restore (파일명)

  • 워킹 디렉토리의 특정 파일 복구
  • 파일명 자리에 . : 모든 파일 복구

변경상태를 스테이지에서 워킹 디렉토리로 돌려놓기


git restore --staged (파일명)

파일을 특정 커밋의 상태로 되돌리기


git restore --source=(헤드 또는 커밋 해시) 파일명



3. git reflog 명령어


reflog는 프로젝트가 위치한 커밋이 바뀔 때마다 기록되는 내역을 보여주고
이를 사용하여 reset하기 이전 시점으로 프로젝트를 복구할 수 있습니다.


git reflog



4. Fastforward 와 3-way-merge


  • git hub 에서도 마찬가지로 적용되는 개념이다
  • rebase 방식을 사용할때 Fastforward 를 사용하게된다

Fastforward



위와 같이 B 브랜치의 히스토리는 A 브랜치의 히스토리를 포함하는 즉 충돌이 나지않는 상황에서 두 브랜치를 병합했을때 A 브랜치헤드B 브랜치 마지막 분기점까지 옮기는 것을 의미한다.


git merge --ff

# git merge 를 사용하더라도 Fastforward 가 가능하다면 git merge --ff 처럼 실행됨
git merge

3-way-merge



# Fastforward 가 가능하더라도 아래의 명령어를 사용시 새로운 커밋을 만들어서 처리함
git merge --no-ff

양 브랜치의 내용이 다르고 병합했을때 충돌이 날 수 있는 상황에서 변경내용을 합쳐 새로운 커밋을 만드는 방식을 의미



5. git log


기본 명령어


# 각 커밋마다의 변경사항 함께 보기
git log -p

# 최근 n개 커밋만 보기
git log -(갯수)

# 통계와 함께 보기
# 더 간략히:  `--shortstat`
git log --stat

# 한 줄로 보기
# `--pretty=oneline --abbrev-commit`의 줄임
git log --oneline

# 변경사항 내 단어 검색
git log -S (검색어)

# 커밋 메시지로 검색
git log --grep (검색어)

# 자주 사용되는 그래프 로그 보기
git log --all --decorate --oneline --graph

※ git log 조회 범위 제한 옵션 : 공식문서


그래프 로그 옵션

  • --all : 모든 브랜치 보기

  • --graph : 그래프 표현

  • --decorate : 브랜치, 태그 등 모든 레퍼런스 표시

    • --decorate=no
    • --decorate=short : 기본
    • --decorate=full

포맷된 로그 보기


포매팅 옵션들 살펴보기


※ 예시


git log --graph --all --pretty=format:'%C(yellow) %h %C(reset)%C(blue)%ad%C(reset) : %C(white)%s %C(bold green)-- %an%C(reset) %C(bold red)%d%C(reset)' --date=short



6. git diff


기본 명령어


# 워킹 디렉토리의 변경사항 확인
git diff

# 파일명만 확인
git diff --name-only

# 스테이지의 확인
# `--cached`와 같음
git diff --staged

# 커밋간의 차이 확인
# 현재 커밋과 비교하려면 이전 커밋만 명시
# 커밋 해시 및 HEAD 로도 컨트롤 가능
git diff (커밋1) (커밋2)

# 브랜치간의 차이 확인
git diff (브랜치1) (브랜치2)



7. git blame


각 라인의 작성자를 확인합니다.


파일의 부분별로 작성자 확인하기


git blame (파일명)

특정 부분 지정해서 작성자 확인하기


git blame -L (시작줄) (끝줄, 또는 +줄수) (파일명)

VS CodeGitLens 같은 확장프로그램 활용도 고려해보자



8. git bisect


이진 탐색 알고리즘으로 문제의 발생 시점을 찾아냅니다.


# 의심 지점으로 이동
git checkout (해당 커밋 해시)

# 이진 탐색 시작
git bisect start

# 오류발생 지점임을 표시
git bisect bad

# 오류 발생 않을 시 양호함 표시
git bisect good

# ♻️ 원인을 찾을 때까지 반복
git bisect good/bad

# 이진 탐색 종료
git bisect reset



9. Git Hooks


Git상의 이벤트마다 자동으로 실행될 스크립트를 지정합니다.


📁 Git Hooks 폴더 보기


프로젝트 폴더 내 .git > hooks 폴더 확인


  • 파일 끝에 .sample을 없애면 훅 실행파일이 됨

gitmoji-cli로 활용예 보기


gitmoji-cli GitHub 페이지


1. gitmoji-cli 설치


윈도우


  • 먼저 Node.js 설치
  • 터미널에서 설치: npm i -g gitmoji-cli


  • brew로 설치 : brew install gitmoji

2. 프로젝트의 훅에 적용


프로젝트 폴더에서 아래 명령어 실행


gitmoji -i

  • hooks 폴더에 추가된 파일 확인하기
  • 프로젝트에 수정 뒤 git add ., git commit하여 진행
  • 커밋 추가 뒤 push하여 GitHub에서 확인

gitmoji-cli 훅을 해제하려면


hooks폴더에서 prepare-commit-msg 파일을 삭제해주면 됩니다.


10. git submodules


  • 프로젝트 폴더 안에 또 다른 프로젝트가 포함될 때 사용
  • 여러 프로젝트에 사용되는 공통모듈일 때 유용

사용 예


1. 두 개의 프로젝트 생성


  • main-project, submodule
  • 두 프로젝트 모두 GitHub에 각각 레포지토리 를 생성

2. main-project에 서브모듈로 submodule 프로젝트 추가


  • main-project 에서 명령어 실행

git submodule add (submodule의 GitHub 레포지토리 주소) (하위폴더명, 없을 시 생략)

  • 프로젝트 폴더 내 submodule(프로젝트) 폴더와 .gitmodules(하위 프로젝트 관련 내용) 파일 확인

  • submodule변경사항(Working directory)main-project 의 에서 확인 할 수 있으나 staging 할 수 없다

  • 하위 프로젝트 submodule 에서 작업 후 커밋한 내용은 main-projectStaging area 에 추가된다 이후 commitpush 진행해서 내용을 업데이트 할 수 있다.


3. 서브모듈 업데이트


main-project 새로운 곳에 clone

  • 서브 모듈의 내용은 추가되어있지 않음

아래 명령어들로 서브모듈 init 후 클론 진행

git submodule init (특정 서브모듈 지정시 해당 이름)
git submodule update

GitHub에서 submodule에 수정사항 커밋

git submodule update --remote

  • 서브모듈 안에 또 서브모듈이 있을 시: --recursive 추가

참고

https://www.inflearn.com/course/%EC%A0%9C%EB%8C%80%EB%A1%9C-%ED%8C%8C%EB%8A%94-%EA%B9%83/unit/102398