Git Basic Commands

Git Basic Commands는 버전 관리 시스템인 Git을 사용하기 위한 필수 명령어들의 집합입니다. 이 명령어들은 코드의 버전 관리, 협업, 이력 추적을 가능하게 하는 기본 도구이다. init, clone, add, commit, push, pull 등의 핵심 명령어들은 모든 Git 사용자가 일상적으로 사용하는 작업의 기반을 형성한다. 이러한 기본 명령어들을 이해하고 숙달하는 것은 효과적인 소프트웨어 개발과 팀 협업의 필수 요소이다.

핵심 개념

Git Basic Commands는 저장소 초기화, 변경사항 추적, 커밋 생성, 원격 저장소와의 동기화를 수행하는 기본 명령어들의 집합이다. 예를 들어, git add는 변경된 파일을 커밋 대상으로 지정하고, git commit은 실제로 변경 사항을 저장소에 기록한다.

주요 원리

Git의 기본 작동 원리는 세 가지 주요 영역을 기반으로 한다:

1
2
3
4
5
6
Working Directory → Staging Area → Repository
    (작업 공간)        (준비 영역)     (저장소)
         |                 |              |
         |--- git add ---->|              |
         |                 |--- commit -->|
         |<------------ checkout ---------|

로컬 및 원격 저장소의 기본 흐름 이해

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
로컬 저장소                     원격 저장소
+-----------+                  +-----------+
|  Working  |                  |           |
| Directory |                  |  GitHub/  |
|     ↓     |                  |  GitLab   |
|  Staging  |     git push     |           |
|   Area    | ---------------> |           |
|     ↓     |                  |           |
|   Local   |     git fetch/   |           |
|   Repo    | <--------------- |           |
|           |     git pull     |           |
+-----------+                  +-----------+

기본 워크플로우:

  1. 로컬에서 작업 (Working Directory)
  2. 변경사항 스테이징 (git add)
  3. 커밋 생성 (git commit)
  4. 원격 저장소로 푸시 (git push)
  5. 다른 개발자의 변경사항 풀 (git pull)

파일의 라이프사이클

파일의 라이프사이클
https://git-scm.com/book/ko/v2/Git%ec%9d%98-%ea%b8%b0%ec%b4%88-%ec%88%98%ec%a0%95%ed%95%98%ea%b3%a0-%ec%a0%80%ec%9e%a5%ec%86%8c%ec%97%90-%ec%a0%80%ec%9e%a5%ed%95%98%ea%b8%b0

파일 상태 추적

명령어상태 변화설명
git add <file>Untracked → Staged새 파일 추적 시작
git add <file>Modified → Staged수정된 파일 스테이징

파일 상태 종류

상태의미다음 단계
UntrackedGit이 관리하지 않는 파일add → Staged
Modified수정되었지만 아직 스테이징되지 않음add → Staged
Staged커밋될 준비가 된 상태commit → Committed
Committed저장소에 안전하게 저장된 상태modify → Modified
상태 변화 시나리오
1
2
3
4
5
6
7
# 1. 새 파일 추가
$ git add README # Untracked → Staged
$ git commit -m "Add README" # Staged → Committed

# 2. 파일 수정 # CONTRIBUTING.md 수정 
$ git status # Modified 상태 확인 
$ git add CONTRIBUTING.md # Modified → Staged
이중 상태 케이스
1
2
3
4
# 파일이 Staged 상태인 후 다시 수정된 경우
$ git add file.txt        # 첫 번째 수정 스테이징
# 파일 다시 수정
$ git status              # 동시에 Staged와 Modified 상태 표시
주요 특징과 주의사항
상황설명주의사항
스테이징 후 수정파일이 두 가지 상태로 존재 가능커밋 시 스테이징된 버전만 커밋됨
git diffUnstaged 변경사항만 표시전체 변경사항을 보려면 다른 옵션 필요
커밋 시점마지막 add 시점의 내용이 커밋됨최신 수정사항은 다시 add 필요

Git 설치 및 초기 설정

Git 설치 방법

Git은 다양한 운영 체제에서 사용할 수 있으며, 공식 웹사이트에서 설치 파일을 다운로드할 수 있다.

OS설치 방법명령어/방법
Windows공식 사이트- git-scm.com 에서 다운로드
- 설치 프로그램 실행
macOSHomebrewbrew install git
Ubuntuaptsudo apt-get install git
CentOSyumsudo yum install git

초기 설정 - 사용자 정보

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 전역 사용자 설정
$ git config --global user.name "Your Name"
$ git config --global user.email "your.email@example.com"

# 특정 저장소 사용자 설정
$ git config user.name "Your Name"
$ git config user.email "your.email@example.com"

# 설정 확인
$ git config --list
user.name=John Doe
user.email=johndoe@example.com  
color.status=auto  
color.branch=auto  
color.interactive=auto  
color.diff=auto

기본 환경 설정

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 기본 브랜치 이름 설정
$ git config --global init.defaultBranch main

# 기본 편집기 설정
$ git config --global core.editor "vim"  # vim 사용
$ git config --global core.editor "code --wait"  # VS Code 사용

# 줄바꿈 설정
$ git config --global core.autocrlf true    # Windows
$ git config --global core.autocrlf input   # macOS/Linux

Git 저장소 초기화

1
2
3
4
5
6
7
8
# 새 저장소 생성
$ git init

# 원격 저장소 복제
$ git clone <repository-url>

# 원격 저장소 추가
$ git remote add origin <repository-url>

주요 설정 옵션

설정명령어설명
색상 설정git config --global color.ui autoGit 출력 색상 활성화
별칭 설정git config --global alias.co checkout자주 사용하는 명령어 별칭
Merge 도구git config --global merge.tool vimdiff병합 충돌 해결 도구 설정
인증 캐시git config --global credential.helper cache인증 정보 캐싱

Git 설정 파일 위치

Linux 기준

범위파일 위치설명
시스템/etc/gitconfig모든 사용자와 저장소에 적용
git config --system 옵션으로 이 파일을 읽고 쓸 수 있다.
전역~/.gitconfig현재 사용자의 모든 저장소에 적용
git config --global 옵션으로 이 파일을 일고 쓸 수 있다.
로컬.git/config현재 저장소에만 적용
git config --local 옵션으로 이 파일을 일고 쓸 수 있다.

각 설정은 역순으로 우선시된다.

유용한 설정 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 자동 줄바꿈 처리
$ git config --global core.whitespace trailing-space,space-before-tab

# Pull 기본 전략 설정
$ git config --global pull.rebase false

# Push 기본 설정
$ git config --global push.default simple

# 병합 충돌 스타일 설정
$ git config --global merge.conflictstyle diff3

설정 확인 및 관리

작업명령어설명
설정 확인git config --list --show-origin설정값과 출처 확인
특정 설정 확인git config user.name특정 설정값만 확인
설정 삭제git config --global --unset user.name설정 제거
설정 편집git config --global --edit설정 파일 직접 편집

문제 해결 팁

문제해결 방법
인증 오류- SSH 키 재설정
- 인증 캐시 클리어
줄바꿈 문제- core.autocrlf 설정 확인
-.gitattributes 설정
한글 경로 문제- core.quotepath 설정 변경
프록시 설정- http.proxy 설정 추가

SSH 키 설정

1
2
3
4
5
6
7
8
# SSH 키 생성
$ ssh-keygen -t rsa -b 4096 -C "your.email@example.com"

# 공개키 확인
$ cat ~/.ssh/id_rsa.pub

# SSH 연결 테스트
$ ssh -T git@github.com

보안 관련 설정

1
2
3
4
5
6
# 안전한 디렉토리 설정
$ git config --global --add safe.directory *

# 자격 증명 저장 방식 설정
$ git config --global credential.helper store  # 영구 저장
$ git config --global credential.helper cache --timeout=3600  # 1시간 캐시

.gitignore 설정

.gitignore 파일은 Git에서 버전 관리에서 제외할 파일이나 디렉터리를 지정하는 설정 파일이다.
주로 프로젝트 루트 디렉터리에 위치하며, 다음과 같은 목적에 사용된다:

  • 불필요한 파일 제외: 빌드 결과물, 로그, 임시 파일, IDE(통합 개발 환경) 설정 파일 등 프로젝트 관리에 필요 없는 파일을 Git 추적에서 제외해 저장소 용량과 관리 효율을 높인다.
  • 보안 및 개인정보 보호: 비밀번호, API 키, 인증 정보 등 민감한 데이터가 담긴 파일이 실수로 저장소에 업로드되는 것을 방지한다.
  • 환경별 파일 관리: 개발자마다 다르거나 특정 환경에만 필요한 설정 파일 등은 공유할 필요가 없으므로.gitignore로 관리에서 제외한다.

.gitignore 파일에는 한 줄에 하나씩 무시할 파일 또는 디렉터리의 패턴을 작성하며, 표준 glob 패턴(*,?, / 등)을 사용한다. 이미 Git에서 추적 중인 파일은 .gitignore에 추가해도 자동으로 제외되지 않으니, 이 경우 git rm --cached 명령어로 추적을 해제해야 한다.

.gitignore 기본 규칙

.gitignore 파일에 입력하는 패턴은 아래 규칙을 따른다:

  • 아무것도 없는 라인이나, # 로 시작하는 라인은 무시한다.
  • 표준 Glob 패턴을 사용한다. 이는 프로젝트 전체에 적용된다.
  • 슬래시(/)로 시작하면 하위 디렉토리에 적용되지(Recursivity) 않는다.
  • 디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현한다.
  • 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다.
1
2
3
4
5
6
# 주석
*.log           # 모든 .log 파일 무시
temp/           # temp 디렉토리 전체 무시
!important.log  # important.log는 예외
/build          # 루트의 build 디렉토리만 무시
doc/*.txt       # doc 디렉토리의 .txt 파일 무시

일반적인.gitignore 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# IDE 설정
.idea/
.vscode/
*.iml

# 빌드 결과물
/target/
/build/
/dist/
*.class
*.jar

# 로그 파일
*.log
logs/

# 환경 설정
.env
.env.local
.env.*.local

# OS 생성 파일
.DS_Store
Thumbs.db

# 의존성 디렉토리
node_modules/
vendor/

Git 명령어

Git Init
Source: https://medium.com/@nmpegetis/git-how-to-start-code-changes-commit-and-push-changes-when-working-in-a-team-dbc6da3cd34c

설정 및 초기화

git config

사용자 정보, 에디터, 색상 등 Git 환경 설정

1
2
3
4
git config --global user.name "이름"     # 전역 사용자 이름 설정
git config --global user.email "이메일"  # 전역 이메일 설정
git config --list                       # 모든 설정 확인
git config --global core.editor "vim"   # 기본 편집기 설정
설정 항목설명예시 명령어사용 예시 설명
user.name커밋에 기록될 사용자 이름 설정git config --global user.name "홍길동"모든 저장소에서 커밋 작성자 이름이 “홍길동"으로 기록됨
user.email커밋에 기록될 이메일 주소 설정git config --global user.email "hong@domain.com"모든 저장소에서 커밋 작성자 이메일이 “hong@domain.com“으로 기록됨
core.editor커밋 메시지, rebase 등에서 사용할 기본 에디터 지정git config --global core.editor vim커밋 메시지 입력 등에서 vim 에디터가 기본으로 실행됨
color.uiGit 출력에 색상 사용 여부 설정git config --global color.ui truegit status, git log 등에서 컬러로 결과가 출력됨
core.autocrlf줄바꿈 문자 자동 변환 설정(CRLF↔LF)git config --global core.autocrlf inputmacOS/Linux에서 입력 시만 LF로 변환, 윈도우와 협업 시 줄바꿈 문제 방지
pull.rebasegit pull 시 rebase 사용 여부 설정git config --global pull.rebase truegit pull 시 자동으로 rebase 적용, merge 커밋이 생성되지 않음
pull.ffgit pull 시 fast-forward만 허용 설정git config --global pull.ff onlygit pull 시 병합 커밋 없이 fast-forward만 허용, 충돌 방지
merge.conflictstyle병합 충돌 표시 방식 설정git config --global merge.conflictstyle zdiff3병합 충돌 발생 시 zdiff3 스타일로 충돌 구간이 더 명확하게 표시됨
rebase.autosquashrebase 시 fixup/squash 커밋 자동 정렬 설정git config --global rebase.autosquash truegit rebase -i 시 fixup/squash 커밋이 자동으로 관련 커밋 아래로 정렬됨
alias.<별칭>자주 쓰는 명령어에 별칭(alias) 지정git config --global alias.st statusgit st 입력만으로 git status 명령어 실행 가능
push.defaultgit push 기본 동작 방식 설정git config --global push.default simple현재 브랜치만 원격 저장소에 push, 실수로 다른 브랜치까지 푸시되는 것 방지
log.abbrevCommit로그 출력 시 커밋 해시를 짧게 표시git config --global log.abbrevCommit truegit log 실행 시 커밋 해시가 짧은 형태로 출력됨
diff.tool외부 diff 툴 지정git config --global diff.tool meldgit difftool 명령어 사용 시 meld 툴이 실행됨
core.pagergit diff 등에서 사용할 pager 설정git config --global core.pager 'less -x4'git diff 등에서 탭 크기가 4로 표시됨
credential.helper인증 정보 저장 방식 설정git config --global credential.helper cache인증 정보가 일정 시간(기본 15분) 동안 캐시에 저장되어 매번 입력할 필요 없음
completion.ignoreCase명령 자동 완성 시 대소문자 구분 여부 설정git config --global completion.ignoreCase truegit 명령 자동 완성 시 대소문자 구분 없이 자동 완성 가능
include.path다른 설정 파일을 포함시키는 옵션git config --global include.path ~/.gitconfig-extra추가 설정 파일의 내용을 함께 적용 가능
advice.statusHints상태 힌트 메시지 출력 여부 설정git config --global advice.statusHints falsegit status 등에서 안내 메시지(힌트)가 출력되지 않음

참고

  • 설정 범위
    • --system: 시스템 전체(모든 사용자, 모든 저장소)
    • --global: 현재 사용자(모든 저장소)
    • --local: 현재 저장소(기본값, 저장소 내.git/config에 저장)
  • 설정 확인
    • git config --list: 전체 설정 값 확인
    • git config --global --list: 전역 설정 값만 확인
    • git config --edit --global: 전역 설정 파일 직접 편집
git init

새로운 Git 저장소를 초기화

1
2
git init                # 현재 디렉터리에 Git 저장소 생성
git init myproject      # myproject 디렉터리에 새 저장소 생성

저장소 복제 및 원격 관리

git clone

원격 저장소를 복제하여 로컬에 저장소 생성

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# HTTPS로 복제
git clone https://github.com/user/repo.git

# SSH로 복제
git clone git@github.com:user/repo.git

# 특정 브랜치만 복제
git clone -b develop https://github.com/user/repo.git

# 기본 복제
git clone https://github.com/user/repo.git              

# 얕은 복제 (최신 커밋만)
git clone --depth 1 https://github.com/user/repo.git    

# 서브모듈까지 복제
git clone --recursive https://github.com/user/repo.git  
git remote

원격 저장소 연결 및 관리

원격 저장소 목록 조회

git remote 명령으로 현재 프로젝트에 등록된 리모트 저장소를 확인

1
2
$ git remote
origin
원격 저장소 URL 조회

리모트 저장소가 여러 개 있다면 이 명령은 등록된 전부를 보여준다.

1
2
3
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
원격 저장소 상세 정보 확인

 원격 URL, 브랜치 정보, 추적 관계 등의 정보를 보여준다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)
원격 저장소 추가하기
1
2
3
4
5
6
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)
원격 저장소 이름을 바꾸기

 ```bash
$ git remote rename pb paul
$ git remote
origin
paul

1
2
3
4
5
6
7
8
9

###### 원격 저장소 삭제하기

 원격 저장소를 삭제하면 해당 원격 저장소에 관련된 추적 브랜치 정보나 모든 설정 내용도 함께 삭제된다.
 
```bash
$ git remote remove paul
$ git remote
origin

파일 추적 및 스테이징

git add

작업 디렉터리의 변경사항을 스테이징 영역에 추가

1
2
3
4
git add .                 # 모든 변경 파일 스테이징
git add -A                # 모든 변경사항(삭제 포함) 스테이징
git add -p                # 변경사항을 부분적으로 선택해 스테이징
git add README.md         # 특정 파일만 스테이징
git rm

파일을 삭제하고 Git 추적에서도 제거

1
2
git rm file.txt           # 파일 삭제 및 추적 해제
git rm --cached secret.txt # 파일은 남기고 Git 추적만 해제
git mv

파일이나 디렉터리 이동 또는 이름 변경

1
2
git mv oldname.txt newname.txt    # 파일명 변경
git mv src/hello.js lib/hello.js  # 파일 이동

커밋 및 기록 관리

git commit

스테이징 영역의 변경사항을 커밋(버전)으로 저장

1
2
3
git commit -m "메시지"            # 메시지와 함께 커밋
git commit -a -m "메시지"         # 추적 중인 파일의 변경사항 모두 커밋
git commit --amend                # 마지막 커밋 메시지 수정 또는 추가 변경 포함
git log

git log 명령을 실행하면 저장소의 커밋 히스토리를 시간순으로 보여준다
각 커밋의 SHA-1 체크섬, 저자 이름, 저자 이메일, 커밋한 날짜, 커밋 메시지를 보여준다.

용도명령어출력 내용
기본 조회git log- 커밋 해시
- 저자 정보
- 날짜
- 커밋 메시지
변경 내용 포함git log -p- 기본 정보 + 각 커밋의 diff
통계 정보git log --stat- 수정된 파일 목록
- 변경된 라인 수
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$ git log -p
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

diff --git a/Rakefile b/Rakefile
index a874b73.f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gee-mail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae.c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
     end

 end
-
-if $0 == __FILE__
-  git = SimpleGit.new
-  puts git.show
-end
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ git log --stat  
commit ca82a6dff817ec66f44342007202690a93763949  
Author: Scott Chacon <schacon@gee-mail.com>  
Date: Mon Mar 17 21:52:11 2008 -0700

    changed the version number

 Rakefile | 2 +1 file changed, 1 insertion(+), 1 deletion(-)

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7  
Author: Scott Chacon <schacon@gee-mail.com>  
Date: Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test

 lib/simplegit.rb | 5 -----  
 1 file changed, 5 deletions(-)
Pretty 옵션을 이용한 다양한 포맷
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 한 줄로 표시
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
# 커스텀 포맷
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit

Format 옵션 상세

옵션설명예시
%H커밋 해시ca82a6dff817…
%h짧은 해시ca82a6d
%an저자 이름Scott Chacon
%ae저자 메일schacon@gmail.com
%ad저자 시각Mon Mar 17 21:52:11 2008
%ar상대적 시각2 days ago
%s커밋 메시지initial commit
%T트리 해시
%t짧은 길이 트리 해시
%P부모 해시
%p짧은 길이 부모 해시
%cn커미터 이름
%ce커미터 메일
%cd커미터 시각
%cr커미터 상대적 시각
조회 범위 제한 옵션
옵션설명예시
-(n)최근 n개 커밋git log -2
–since, –after특정 날짜 이후git log --since="2 weeks ago"
–until, –before특정 날짜 이전git log --until="2024-01-01"
–author저자 검색git log --author="Scott"
–grep커밋 메시지 검색git log --grep="bug"
-S코드 변경 내용 검색git log -S"function_name"
주요 사용 예시
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 최근 2개의 커밋 상세 내용 보기
git log -p -2

# 통계와 함께 한 줄로 보기
git log --stat --oneline

# 특정 기간 동안의 커밋 검색
git log --since="1 week ago" --until="yesterday"

# 특정 저자의 커밋만 보기
git log --author="John" --pretty=format:"%h - %s"
고급 필터링 옵션
1
2
3
4
5
6
7
8
# 병합 커밋 제외
git log --no-merges

# 특정 파일의 히스토리만 보기
git log -- path/to/file

# 특정 브랜치의 커밋만 보기
git log branch_name
시각화 옵션
1
2
3
4
5
# 그래프로 표시
git log --graph

# 그래프와 한 줄 표시 조합
git log --graph --oneline --decorate
git show

특정 커밋의 상세 정보와 변경 내용 보기

1
2
git show HEAD                     # 최신 커밋 상세 보기
git show abc123                   # 특정 커밋(해시) 상세 보기

상태 확인 및 변경 비교

git status

작업 디렉터리와 스테이징 영역의 상태 확인

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 자세한 상태 확인
git status

# 간단한 상태 확인
git status -s
git status --short

# 브랜치 정보 포함
git status -b

# 스크립트 처리용 출력
git status --porcelain     
기본 상태 메시지

git status

상태 메시지의미설명
“working directory clean”깨끗한 작업 디렉토리- 수정된 파일 없음
- 모든 파일이 추적 중
“Untracked files”추적되지 않는 파일Git이 관리하지 않는 파일
add 명령어로 추적 시작 가능
“Changes not staged”스테이징되지 않은 변경사항- 추적 중인 파일이 수정됨
- 아직 스테이징되지 않음
“Changes to be committed”커밋될 변경사항- 스테이징된 파일
- 다음 커밋에 포함될 변경사항
1
2
3
$ git status
On branch master
nothing to commit, working directory clean
상태표시

git status -s 또는 git status --short

상태 코드의미설명
??추적되지 않음- 새로운 파일
Git이 아직 관리하지 않음
A추가됨- 새 파일이 스테이징됨
- 다음 커밋에 포함
M (좌측)스테이징됨- 수정되고 스테이징된 파일
M (우측)수정됨- 수정되었지만 아직 스테이징되지 않음
MM스테이징 후 재수정- 스테이징된 후 다시 수정된 파일
1
2
3
4
5
6
$ git status -s
 M README           # 수정되었지만 스테이징되지 않음
MM Rakefile         # 스테이징된 후 다시 수정됨
A  lib/git.rb       # 새로 추가되고 스테이징됨
M  lib/simplegit.rb # 수정되고 스테이징됨
?? LICENSE.txt      # 새 파일, 아직 추적되지 않음
git diff

변경사항 비교

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 워킹 디렉토리와 스테이징 영역의 차이 확인
git diff

# 스테이징 영역과 마지막 커밋(HEAD) 비교
git diff --staged

# 두 브랜치(main, feature) 비교
git diff main feature

# 전체 변경사항을 HEAD와 비교
git diff HEAD                     

# 특정 파일만 비교
git diff --staged app.js

# 변경 파일명만 출력
git diff --name-only

# 변경 요약 통계 출력
git diff --stat

# 공백 무시하고 비교
git diff -w

브랜치 및 병합

git branch

브랜치 목록, 생성, 삭제

1
2
3
4
git branch                        # 로컬 브랜치 목록
git branch develop                # develop 브랜치 생성
git branch feature/login          # feature/login 브랜치 생성
git branch -d feature/login       # 브랜치 삭제
브랜치의 목록
1
2
3
4
$ git branch
  iss53
* master
  testing

* 기호가 붙어 있는 master 브랜치는 현재 Checkout 해서 작업하는 브랜치.
지금 수정한 내용을 커밋하면 master 브랜치에 커밋되고 포인터가 앞으로 한 단계 나아간다.

브랜치마다 마지막 커밋 메시지 확인

각 브랜치가 지금 어떤 상태인지 확인하기에 좋은 옵션

1
2
3
4
$ git branch -v
  iss53   93b412c fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 add scott to the author list in the readmes
Merge한 브랜치 목록
1
2
3
$ git branch --merged
  iss53
* master

iss53 브랜치는 앞에서 이미 Merge 했기 때문에 목록에 나타난다.
* 기호가 붙어 있지 않은 브랜치는 git branch -d 명령으로 삭제해도 되는 브랜치다.
이미 다른 브랜치와 Merge 했기 때문에 삭제해도 정보를 잃지 않는다.

현재 Checkout한 브랜치에 Merge하지 않은 브랜치 목록
1
2
$ git branch --no-merged
  testing

아직 Merge 하지 않은 커밋을 담고 있기 때문에 git branch -d 명령으로 삭제되지 않는다.

1
2
3
$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

Merge 하지 않은 브랜치를 강제로 삭제하려면 -D 옵션으로 삭제한다.

git checkout

브랜치 전환 또는 파일 복구

1
2
3
4
5
git checkout develop              # develop 브랜치로 전환
git checkout -b hotfix/bugfix     # 새 브랜치 생성 및 전환
git checkout -- README.md         # 파일을 마지막 커밋 상태로 복구

git switch main                   # main 브랜치로 전환 (최신 Git 권장)
git merge

다른 브랜치의 변경사항을 현재 브랜치에 병합

1
git merge feature/login           # feature/login 브랜치 병합
git rebase

한 브랜치의 커밋을 다른 브랜치 위로 재적용
커밋을 정리하고, 브랜치 히스토리를 명확하게 하는 데 유용함.
커밋 히스토리가 직렬화되어 프로젝트 이력을 깔끔하게 유지할 수 있는 장점이 있다.

Rebase의 작동 방식

  1. 공통 조상 커밋을 찾는다.
  2. 이동할 브랜치의 커밋들을 임시로 저장한다.
  3. 기준 브랜치의 최신 커밋으로 이동한다.
  4. 저장해둔 커밋들을 순서대로 적용한다.

장점

  • 깔끔한 프로젝트 히스토리: 선형적인 커밋 히스토리를 만들어준다.
  • 충돌 해결 용이: 각 커밋마다 충돌을 해결할 수 있어 세밀한 제어가 가능함
  • 최신 변경사항 반영: 공유 브랜치의 최신 변경사항을 즉시 반영할 수 있다.

주의사항

  • 공개 브랜치 rebase 금지
  • 복잡한 rebase 전 백업 브랜치 생성
  • 충돌 해결 시 신중하게 진행
  • 커밋 해시를 변경하므로 주의가 필요함.

Rebase 사용 시 모범 사례

  • 작은 단위로 자주 rebase
  • 의미 있는 커밋 메시지 유지
  • feature 브랜치는 작게 유지
  • rebase 전 변경사항 커밋 또는 stash
Rebase 명령어의 기본 사용법

현재 브랜치를 main 브랜치의 최신 커밋 위에 다시 작성한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 기본 문법
git rebase <base-branch>

# 현재 브랜치를 main 위로 재배치
git rebase main                   

# rebase 중 충돌 해결
git rebase --continue  # 충돌 해결 후 계속
git rebase --abort    # rebase 취소
git rebase --skip     # 현재 커밋 건너뛰기

# 예시
## 브랜치 구조
A---B---C---D---E---F (feature)
         \
          G---H---I (main)
# 기본 rebase
git checkout feature
git rebase main

## rebase후
A---B---C---G---H---I (main)
                         \
                          D'---E'---F' (feature)
대화형 Rebase
1
2
# 대화형 rebase
$ git rebase -i HEAD~3  # 최근 3개 커밋 수정

대화형 Rebase의 주요 명령어

1
2
3
4
5
6
pick   # 커밋 유지
reword # 커밋 메시지 수정
edit   # 커밋 수정
squash # 이전 커밋과 합치기
fixup  # 메시지 없이 이전 커밋과 합치기
drop   # 커밋 삭제
고급 Rebase 기능

특정 커밋부터 Rebase

1
git rebase --onto <new-base> <old-base> [<branch>]
인자설명
<new-base>새로운 베이스가 될 커밋 또는 브랜치
<old-base>기존 브랜치의 시작점이었던 커밋 (변경할 커밋의 직전 커밋)
<branch>Rebase 대상 브랜치 (생략 시 현재 브랜치)

옵션 동작 원리

  1. 커밋 범위 선택: <old-base> 이후의 커밋들(즉, <old-base>의 자식 커밋부터 <branch>까지)을 선택한다.
  2. 재배치: 선택된 커밋들을 <new-base> 위에 재적용한다.
  3. 브랜치 포인터 이동: <branch>의 포인터를 새로운 커밋 체인으로 이동시킨다.

주의사항

  1. Conflict 발생 가능성: Rebase 과정에서 충돌이 발생하면 git rebase --continue 또는 git rebase --abort로 처리.
  2. 원격 브랜치에 푸시한 경우: 히스토리가 변경되므로 git push --force 필요 (협업 시 주의).
  3. Interactive Rebase와 조합: -i 옵션을 추가하면 커밋 편집 가능 (예: git rebase -i --onto F C feature).

활용 사례

  • 브랜치 분기점 변경: 다른 브랜치를 새로운 베이스로 사용할 때
  • 커밋 정리: 불필요한 커밋 제거 또는 순서 조정
  • 히스토리 단순화: 복잡한 병합 커밋을 선형화할 때

  • 예시 1: 브랜치의 시작점 변경

    • feature 브랜치가 main 브랜치의 C 커밋에서 분기됨
    • feature 브랜치를 main 브랜치의 최신 커밋(F)으로 이동시키려 함
    1
    
    git rebase --onto F C feature
    
    1
    2
    3
    4
    5
    6
    7
    
    A---B---C---D---E---F (main)
         \        
          G---H---I (feature)  # Before
    
    A---B---C---D---E---F (main)
                         \
                          G'---H'---I' (feature)  # After
    
  • 예시 2: 특정 커밋 제거 후 Rebase

    • feature 브랜치에서 커밋 DE를 제거하고 F 커밋부터 Rebase
    1
    
    git rebase --onto F E feature
    
    1
    2
    3
    4
    5
    6
    7
    
    A---B---C---D---E---F (main)
         \        
          G---H---I (feature)  # Before
    
    A---B---C---D---E---F (main)
                         \
                          H'---I' (feature)  # After (G 커밋 삭제)
    
  • 예시 3: 다른 브랜치로 커밋 이동

    • topic 브랜치의 커밋을 master 브랜치로 이동
    1
    
    git rebase --onto master next topic
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    o---o---o---o---o (master)
     \  
      o---o---o---o---o (next)
           \
            o---o---o (topic)  # Before
    
    o---o---o---o---o (master)
                    \
                     o'---o'---o' (topic)  # After
    

Rebase 문제 해결

1
2
3
4
5
6
7
8
9
# rebase 충돌 시
$ git status  # 충돌 파일 확인
# 충돌 해결
$ git add .
$ git rebase --continue

# rebase 실수 복구
$ git reflog  # 이전 상태 확인
$ git reset --hard HEAD@{5}  # 특정 시점으로 복구
git cherry-pick

특정 커밋을 선택적으로 현재 브랜치에 적용
커밋의 “이력"이 아니라 “변경 내용"만을 현재 브랜치에 새로운 커밋으로 적용한다.

주요 활용 예시

  • 다른 브랜치의 버그 수정 커밋만 현재 브랜치에 빠르게 반영
  • 여러 브랜치에서 동일한 기능/버그 수정이 필요할 때
  • 실수로 머지하지 못한 커밋 복원
1
2
3
4
git cherry-pick <commit-hash>

# 여러 커밋을 한 번에 적용할 수도 있다
git cherry-pick <hash1> <hash2> <hash3>
자주 쓰는 옵션
  • --no-commit : 변경사항을 스테이징만 하고 커밋은 직접 작성
  • --edit 또는 -e : 커밋을 적용하기 전에 커밋 메시지 수정
  • --continue : 충돌 해결 후 cherry-pick 재개
  • --abort : cherry-pick 중단 및 이전 상태로 복원
충돌 발생 시
  1. 충돌 파일을 직접 수정
  2. git add <file>
  3. git cherry-pick --continue
    (중단하려면 git cherry-pick --abort)

원격 저장소와 동기화

git fetch

원격 저장소의 변경사항을 로컬로 가져오기(병합X)

  • 이 때 워킹 디렉토리의 파일 내용은 변경되지 않고 그대로 남는다.
  • 서버로부터 데이터를 가져와서 저장해두고 사용자가 Merge 하도록 준비만 해둔다.
1
git fetch origin                  # 원격 저장소의 최신 변경사항 가져오기
git pull

원격 저장소의 변경사항을 가져와서 자동 병합

  • 추적 브랜치가 설정되면 git pull 명령은 서버로부터 데이터를 가져와서 현재 로컬 브랜치와 서버의 추적 브랜치를 Merge 한다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 기본 원격 저장소에서 풀
git pull

# origin의 main 브랜치와 병합
git pull origin main

# 리베이스로 풀
git pull --rebase

# 특정 원격 저장소의 특정 브랜치 풀
git pull origin develop
git push

로컬 커밋을 원격 저장소에 업로드

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 기본 원격 저장소에 푸시
git push

# main 브랜치 커밋을 origin에 푸시
git push origin main              

# 특정 원격 저장소와 브랜치에 푸시
git push origin feature-branch

git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
 * [new branch]      serverfix -> serverfix

# develop 브랜치 푸시 및 추적 설정
git push -u origin develop

# 강제 푸시 (주의!)
git push --force

태그 및 버전 관리

git tag

커밋에 태그(버전) 달기
프로젝트의 특정 시점을 표시하는 중요한 기능
릴리스 버전 관리나 중요한 커밋 지점을 식별하기 위해 사용된다.
두 가지 종류의 태그가 있으며 각각의 사용 목적과 특징이 다르다.

태그의 종류

  1. Lightweight 태그
    • 특정 커밋에 대한 참조로 단순히 커밋에 이름을 부여하는 형태이다.
    • 커밋 체크섬만을 저장한다.
  2. Annotated 태그
    • 태그 생성자 정보, 날짜, 메시지 등 추가 메타데이터를 저장한다.
    • Git 데이터베이스에 완전한 객체로 저장된다.
1
2
3
git tag v1.0.0                    # 최신 커밋에 태그 추가
git tag -a v1.0.1 -m "설명"       # 주석이 포함된 태그 추가
git push origin v1.0.0            # 태그 원격 저장소에 푸시
태그 생성하기
  1. Lightweight 태그
    Lightweight 태그를 만들 때는 -a-s-m 옵션을 사용하지 않는다.
    git tag <tagname>
1
git tag v1.0.0
  1. Annotated 태그
    tag 명령을 실행할 때 -a 옵션을 추가
    -m 옵션으로 태그를 저장할 때 메시지를 함께 저장할 수 있다.
    git tag -a <tagname> -m "Message"
1
2
3
4
5
$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4

특정 커밋에 태그 생성

예전 커밋에 대해서도 태그할 수 있다. 커밋 히스토리는 아래와 같다고 가정한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

“updated rakefile” 커밋을 v1.2.0로 태그하지 못했다고 가정했을때, 명령의 끝에 커밋 체크섬을 명시한다(긴 체크섬을 전부 사용할 필요는 없다).

1
git tag -a v1.2.0 9fceb02 -m "Release version 1.2.0"
태그 조회하기

모든 태그 조회

1
2
3
$ git tag
v0.1
v1.3

패턴으로 태그 검색

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5

태그 상세 정보 조회

Annotated 태그의 경우, 태그 정보(태그를 만든 사람, 언제 태그를 만들었는지 태그 메시지)와 커밋 정보를 모두 확인할 수 있다.
Lightweight 태그의 경우, 커밋의 정보만 보여준다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number
    
$ git tag v1.4-lw

$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number
태그 공유 및 가져오기

git push 명령은 자동으로 리모트 서버에 태그를 전송하지 않는다.
태그를 만들었으면 서버에 별도로 Push 해야 한다.

특정 태그 원격 저장소로 내보내기

git push origin <태그 이름> 을 실행한다.

1
2
3
4
5
6
7
8
$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

모든 태그를 원격 저장소로 내보내기

한 번에 태그를 여러 개 Push 하고 싶으면 --tags 옵션을 추가하여 git push 명령을 실행한다.
이 명령으로 리모트 서버에 없는 태그를 모두 전송할 수 있다.

1
2
3
4
5
6
7
$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

원격 저장소의 태그 가져오기

1
git fetch origin --tags
태그 삭제하기

태그 삭제하기

git tag -d <tagname>

1
git tag -d v1.4

원격 저장소의 태그 삭제하기

git push origin --delete <tagname>

1
git push origin --delete v1.4
태그를 이용해서 Checkout 하기

주로 특정 버전의 코드를 확인할 때 사용한다.

태그로 직접 Checkout 하는 경우

태그가 특정 버전을 가리키고 있고, 특정 버전의 파일을 체크아웃 해서 확인하고 싶다면 다음과 같이 실행한다.

1
git checkout <tagname>

태그를 체크아웃하면 “detached HEAD”(떨어져나온 HEAD) 상태가 된다.
일부 Git 관련 작업이 브랜치에서 작업하는 것과 다르게 동작할 수 있다.
“detached HEAD” 상태: 현재 HEAD가 브랜치가 아닌 특정 커밋을 직접 가리키는 상태
코드를 살펴보거나 변경 사항을 테스트하기 적합.
실험적인 변경이 가능
변경 후 커밋해도 기존 브랜치에 영향을 주지 않음.
다른 브랜치로 체크아웃하면 이 커밋들에 접근하기 어려움.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch>

HEAD is now at 99ada87… Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87… Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601… add atlas.json and cover image

태그를 기반으로 하여 새 브랜치를 생성하여 작업

태그가 가리키는 커밋에서 새로운 브랜치 생성

1
2
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

안전하게 새로운 작업 가능
커밋 이력 추적 가능
변경 사항을 저장하고 관리하기 용이
다른 브랜치와의 병합 작업 가능

태그와 브랜치의 동작

브랜치는 커밋이 추가될 때마다 자동으로 갱신되는 포인터
태그는 특정 커밋을 가리키는 고정 포인터

임시 저장 및 복구

git stash

작업 중인 변경사항을 임시로 저장
브랜치 전환 시 유용하게 사용된다.
Modified이면서 Tracked 상태인 파일과 Staging Area의 파일을 저장한다.

1
2
3
git stash                         # 변경사항 임시 저장
git stash list                    # stash 목록 확인
git stash pop                     # 가장 최근 stash 적용 및 제거
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 기본 stash
$ git stash 또는 git stash save  # 현재 변경사항을 스택에 저장
Saved working directory and index state \
  "WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")

# stash 관리
$ git stash list     # 저장된 stash 목록 보기
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

$ git stash apply    # 가장 최근 stash 적용
On branch master
Changes not staged for commit:
  (use "git add <file>…" to update what will be committed)
  (use "git checkout -- <file>…" to discard changes in working directory)

  modified:   index.html
  modified:   lib/simplegit.rb

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash apply --index # Staged 상태까지 적용
On branch master
Changes to be committed:
  (use "git reset HEAD <file>…" to unstage)

  modified:   index.html

Changes not staged for commit:
  (use "git add <file>…" to update what will be committed)
  (use "git checkout -- <file>…" to discard changes in working directory)

  modified:   lib/simplegit.rb
  
$ git stash drop     # 가장 최근 stash 삭제
$ git stash drop stash@{0} # 특정 stash 삭제
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)

$ git stash pop      # stash 적용하고 즉시 삭제

# 특정 stash 적용
$ git stash apply stash@{2}  # 특정 stash 선택 적용
고급 옵션
1
2
3
4
5
6
# 다양한 stash 옵션들
$ git stash --keep-index     # Staging Area에 있는 파일은 제외하고 저장
$ git stash -u              # 추적하지 않는 파일도 포함해서 저장
$ git stash --include-untracked  # 추적하지 않는 파일도 포함해서 저장 
$ git stash --patch         # 변경사항을 대화형으로 선택해서 저장
$ git stash branch <name>   # stash를 새로운 브랜치에 적용
주의 사항
  • 스택 구조이므로 적용 순서 주의
  • 가능하면 의미 있는 설명과 함께 저장
  • 오래된 stash는 정기적으로 정리
  • 복잡한 변경사항은 브랜치 사용 권장

되돌리기 및 복구

git reset

HEAD(커밋 포인터) 및 작업 디렉터리 상태 되돌리기

1
2
3
4
git reset <file>                  # 스테이징 취소
git reset --soft HEAD~1           # 최근 커밋만 취소, 변경사항은 스테이징
git reset --mixed HEAD~1          # 최근 커밋 취소, 변경사항은 워킹 디렉터리로
git reset --hard HEAD~1           # 최근 커밋 및 변경사항 모두 삭제
git revert

특정 커밋을 되돌리는 새로운 커밋 생성

1
git revert abc123                 # abc123 커밋의 변경사항을 되돌림

기타 유용한 명령어

git clean

추적되지 않는 파일/디렉터리 삭제
빌드 산출물이나 임시 파일 제거에 유용하다.

1
2
3
4
5
git clean -n                      # 삭제될 파일 미리보기
git clean -f                      # 실제로 삭제
git clean -d          # 디렉토리까지 삭제
git clean -fd                     # 추적 안 되는 파일/디렉터리 모두 삭제
git clean -i          # 대화형 모드로 실행
고급 옵션
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$ git clean -f -d       # 추적하지 않는 파일과 디렉토리 모두 삭제
$ git clean -x          # .gitignore에 명시된 파일도 삭제
$ git clean -d -n       # 삭제될 파일과 디렉토리 미리보기
Would remove test.o
Would remove tmp/

$ git clean -x -i       # .gitignore 파일 포함 대화형 삭제
Would remove the following items:
  build.TMP  test.o
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each             5: quit
    6: help
What now>

$ git clean -n -d -x    # .gitignore 파일 포함 삭제될 파일과 디렉토리 미리보기
Would remove build.TMP
Would remove test.o
Would remove tmp/
주의사항
  • 삭제는 되돌릴 수 없으므로 항상 -n옵션으로 미리 확인
  • 중요한 파일 삭제 방지를 위해 .gitignore 정확히 관리
  • 가능하면 대화형 모드(-i) 사용 권장
  • 완전 삭제 전 git stash -all 고려
git blame

각 코드 줄의 마지막 커밋 정보 확인

1
git blame app.js                  # app.js의 각 줄 작성자 및 커밋 확인

협업 워크플로우

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 1. 원격 저장소 복제
git clone <url>

# 2. 브랜치 생성 및 작업
git checkout -b feature-branch

# 3. 변경사항 커밋
git add .
git commit -m "Add feature"

# 4. 원격 저장소 최신화
git fetch origin
git rebase origin/master

# 5. 변경사항 푸시
$ git push origin feature-branch

주요 협업 시나리오

시나리오명령어 sequence설명
코드 리뷰1. git push
2. Pull Request 생성
3. 리뷰 및 토론
4. 변경사항 반영
팀 협업시 코드 품질 관리
충돌 해결1. git pull
2. 충돌 해결
3. git add
4. git commit
5. git push
동시 수정으로 인한 충돌 처리

모범 사례와 주의사항

영역권장사항주의사항
푸시 전fetch/pull로 최신화
- 로컬 테스트 수행
- 강제 푸시 주의
- 대용량 파일 확인
브랜치 관리- 기능별 브랜치 사용
- 정기적인 동기화
- 오래된 브랜치 정리
- 명확한 이름 사용
충돌 관리- 작은 단위로 커밋
- 정기적인 동기화
- 충돌 해결 시 신중
- 팀과 소통

Atomic Commit 전략

Atomic Commit은 하나의 논리적 변경사항만을 포함하는 커밋을 만드는 전략이다.
git add -p로 부분 변경 사항 스테이징

좋은 Atomic Commit 예시

1
2
3
4
5
6
7
8
# 나쁜 예 - 여러 기능이 한 커밋에
git commit -m "회원가입 기능 추가, 로그인 버그 수정, README 업데이트"

# 좋은 예 - 분리된 atomic commits
git commit -m "feat: 회원가입 폼 컴포넌트 추가"
git commit -m "feat: 회원가입 API 연동"
git commit -m "fix: 로그인 시 토큰 만료 체크 누락 수정"
git commit -m "docs: README에 회원가입 기능 설명 추가"

Atomic Commit의 이점

  1. 변경사항 추적 용이
  2. 코드 리뷰 효율성 증가
  3. 버그 발생 시 원인 파악 용이
  4. 선택적 롤백 가능
  5. 체리픽(cherry-pick) 용이

실무 적용 예시

상황명령어 조합설명
새 프로젝트 시작git initgit add.git commit로컬 저장소 생성 및 초기 커밋
기존 프로젝트 참여git clone [URL]git branch develop저장소 복제 후 개발 브랜치 생성
일일 작업git pull → 작업 → git addgit commitgit push일반적인 개발 작업 흐름
긴급 버그 수정git stashgit checkout hotfix → 수정 → git push현재 작업 임시 저장 후 핫픽스
신기능 개발git checkout -b feature → 개발 → git push origin feature기능별 격리 개발

실무에서 효과적으로 적용하기 위한 고려사항 및 주의할 점

고려사항설명
커밋 메시지 작성명확하고 일관된 커밋 메시지를 작성하여 변경 이력을 이해하기 쉽게 합니다.
.gitignore 활용불필요한 파일이 버전 관리에 포함되지 않도록 .gitignore 파일을 적절히 설정합니다.
브랜치 전략 수립효율적인 협업을 위해 브랜치 전략을 수립하고 일관되게 적용합니다.
정기적인 pull원격 저장소의 변경 사항을 자주 반영하여 충돌을 최소화합니다.

최적화하기 위한 고려사항 및 주의할 점

최적화 영역방법효과
저장소 크기정기적인 git gc 실행불필요한 객체 제거
네트워크 사용git fetch vs git pull 적절히 사용필요한 데이터만 가져오기
대용량 파일Git LFS 사용저장소 크기 최적화
히스토리 관리shallow clone 사용초기 복제 시간 단축

최신 동향

주제항목설명
AI 통합Git Copilot CommandsAI가 명령어 추천 및 자동 완성 지원
보안 강화Signed Commits DefaultGPG 서명이 기본값으로 설정
클라우드 통합Cloud Shell Git브라우저에서 직접 Git 명령어 실행
자동화Smart Commands컨텍스트 기반 자동 명령어 제안

주목해야 할 기술

주제항목설명
Git ExtensionsGit LFS 3.0대용량 파일 처리 성능 개선
보안Git Guardian실시간 보안 취약점 검사
협업 도구Git Live Share실시간 협업 Git 세션
모니터링Git Analytics저장소 사용 패턴 분석 도구

앞으로의 전망

주제항목설명
자동화컨텍스트 인식 명령어작업 상황에 따른 자동 명령어 실행
통합멀티 플랫폼 통합다양한 VCS 시스템과 상호운용성
보안양자 암호화 지원양자 컴퓨터 시대 대비 암호화
UX 개선음성 명령 지원음성으로 Git 명령어 실행

하위 주제별 추가 학습 내용

하위 주제설명카테고리
Git Aliases자주 사용하는 명령어 단축키 설정생산성 향상
Git Hooks커밋, 푸시 등의 이벤트에 자동 실행 스크립트자동화
Git Config전역/로컬 설정 관리환경 설정
Git Reflog참조 로그를 통한 작업 복구복구 및 디버깅

관련 분야 추가 학습 내용

관련 분야설명카테고리
Shell ScriptingGit 명령어 자동화 스크립트 작성자동화
CI/CDGit과 연동된 자동 빌드/배포DevOps
코드 리뷰 프로세스Pull Request와 Git 명령어 활용협업
버전 관리 전략Semantic Versioning과 Git Tags릴리즈 관리

용어 정리

용어설명
저장소 (Repository)프로젝트의 소스 코드와 변경 이력이 저장되는 공간입니다.
브랜치 (Branch)독립적인 개발을 위해 분기된 작업 공간입니다.
커밋 (Commit)변경 사항을 저장소에 기록하는 작업입니다.
스테이징 영역 (Staging Area)커밋할 파일들을 임시로 저장하는 공간입니다.
원격 저장소 (Remote Repository)GitHub와 같은 원격 서버에 위치한 저장소입니다.
.gitignoreGit이 무시해야 할 파일이나 디렉토리를 지정하는 파일입니다.
Working Directory실제 작업이 이루어지는 프로젝트 디렉토리
Remote원격 저장소를 가리키는 참조
Origin기본 원격 저장소의 별칭
HEAD현재 체크아웃된 커밋을 가리키는 포인터

참고 및 출처