1. 버전관리 (Version Control)
1.1 `git init` - Git 저장소 초기화
Git을 사용하려면 저장소(Repository)를 먼저 만들어야 함
$ mkdir my_project # 새 폴더 생성
$ cd my_project # 폴더 이동
$ git init # Git 저장소 초기화

- `.git` 폴더가 생성되며, Git이 버전 관리를 시작할 준비 상태가 됨
- `$ ls -al`로 `.git` 폴더가 생성되었는지 확인 가능
1.2 `git add` - 파일 추가 및 관리 시작
Git에 새로운 파일을 추가하려면 `git add`를 사용
$ vim a.txt # a.txt 파일 생성 후 내용 입력
$ git status # 현재 상태 확인 (추적되지 않은 파일 표시)
$ git add a.txt # Git에 파일 추가

✅ 추적되지 않은 파일이란?
- Git이 아직 관리하지 않는 파일로, `git add`를 통해 Git에 포함시켜야 버전 관리됨.
- '파일을 Git에게 버전관리를 시작해'라고 하기 전까진 무시함.
- 관리해야 할 파일을 명확하게 알려주기 위해 사용
$ git status
# 새 파일 a.txt가 추가됨


✅ 전역 사용자 정보 설정 Git은 커밋 기록에 작성자 정보(이름, 이메일)를 저장
$ git config --global user.name "사용자이름"
$ git config --global user.email "이메일주소"

1.3 `git commit` - 버전 만들기
Git은 커밋(commit)을 통해 변경 사항을 저장
$ git commit
# 메세지 입력 후 ESC -> :wq 로 저장하고 종료

✅ 간단한 커밋 방법
$ git commit -m "첫 번째 커밋"
✅ 커밋 내용 확인
- 언제 작성됐는지, 작성자는 누구인지 확인
$ git log

✅ 수정 후 커밋 과정
$ vim a.txt # 파일 내용 수정
$ git status # 수정된 파일 확인 (modified 상태)
$ git add a.txt # 수정된 파일을 다시 스테이징 -> "버전 관리 해줘~"라는 의미
$ git commit -m "a.txt 수정됨"


다시 `$git commit`통해 메시지를 '22'로 작성 후, `$git log`

📌 정리
- `git add` → 파일을 스테이징(stage area) 상태로 만듦
- `git commit` → 버전(repository)을 생성하여 변경 사항 저장
1.4 Git Stage Area (스테이징 영역)
- Git이 `add`를 사용하여 커밋할 파일을 미리 준비하는 과정
$ cp a.txt b.txt # a.txt를 복사하여 b.txt 생성
$ git add b.txt # b.txt를 Git에 추가
$ git commit -m "b.txt 추가됨"


✅ Git은 왜 Add를 해야하는가?
- `commit`하고자하는 파일만 커밋 가능
- `$git add a.txt` 는 a.txt만 커밋 대기 상태

- 이 상태에서 `$git commit`을 해도 a.txt는 커밋되지만 b.txt는 커밋되지 않음
- commit은 커밋대기 상태인 것들만 커밋 시킴
- 커밋대기 상태 = stage area // 커밋 결과 저장되는 곳 = repository

✅ 추가 팁
$ git commit -a # 수정하거나 삭제한 파일 자동으로 add
$ git commit -am "message" # 수정하거나 삭제한 파일 자동으로 add + 에디터를 띄우지 않고 메시지 바로 작성 가능
1.5 변경 사항 확인 (`git log`, `git diff`)
✅ 커밋 로그 확인
$ git log
$ git log -p # 커밋 사이의 차이점 확인

✅ 이전 버전과 현재 버전의 차이점 확인
- `$git log`를 사용하면 각 커밋의 고유 id를 확인 가능
- `$git diff id1..id2` 로 변화 확인 가능
$ gif diff # 이전 커밋과 지금 커밋의 차이 확인
$ git diff id1..id2 # 내가 원하는 두 개의 버전 간 차이 확인

1.6 과거로 돌아가기 (`git reset`, `git revert`)
✅ 커밋 되돌리기 (`reset`)
$ git reset <커밋 ID> --hard


📌 주의: --hard 옵션은 되돌린 이후의 변경 사항을 완전히 삭제!
✅ 커밋 취소 후 새로운 커밋 생성 (revert)
$ git revert <커밋 ID>
- `reset`은 과거로 되돌리는 것,
- `revert`는 기존 기록을 유지하면서 새로운 버전 생성
2. 브랜치 (Branch)
2.1 브랜치란?
Git에서 브랜치는 독립적인 작업 공간을 의미
브랜치를 활용하면 기존 코드에 영향을 주지 않고 새로운 기능을 개발 가능.
✅ 현재 브랜치 확인
$ git branch

✅ 새로운 브랜치 생성
- 브랜치를 생성하면 생성한 브랜치는 원래 속해있던 브랜치를 그대로 복사
$ git branch exp # exp는 본인이 정하는 이름

✅ 브랜치 이동
$ git checkout feature-branch
$ git checkout -b name # 브랜치 name을 만들고 거기로 checkout하겠다.

- 기존에는 3개의 커밋이 있지만 master로 브랜치 바꾸면 다시 커밋은 2개가 됨.


- exp 브랜치에 새로운 파일(b.txt)를 만들고 브랜치를 변경 시켜보자.
- 브랜치에 따라 파일이 변함.


2.2 브랜치 정보 확인
- 모든 브랜치의 커밋 내역을 한눈에 볼 수 있음
$ git log --branches --decorate --graph # 저장소의 모든 브랜치를 다 보여줌
$ git log --branches --decorate --graph --oneline # 간단 버전
- master의 가장 최신 커밋이 '2' , exp의 가장 최신 커밋이 '4'
- HEAD -> exp : 현재 exp 브랜치에 체크아웃되어있다.

- master와 브랜치들 사이의 그래프


2.3 브랜치 병합 (Merge)
✅ 브랜치 병합 과정
- 병합할 브랜치로 이동
$ git checkout master # exp -> master 병합하려면 master로 체크아웃하고 master에서 merge
2. 브랜치 병합
- 두 개의 부모 (2, 4)를 갖는 하나의 커밋이 만들어지면서, master는 5번과 exp의 4번을 모두 가짐
$ git merge exp

✅ 병합 후 브랜치 삭제
$ git branch -d exp

2.4 Stash (작업 보관)
- 브랜치 작업이 덜 끝났는데, 다른 브랜치로 checkout해야할 때 stash 사용
- 브랜치에서 수정한 파일을 커밋하지 않고 checkout했다면 영향이 master에게도 미침

✅ 브랜치 변경 전에 임시로 작업 저장
$ git stash save # 작업중인 변경 사항들을 exp 브랜치에 세이브

✅ 저장된 작업 불러오기
$ git stash apply # 숨겨두었던 파일들이 다시 나타남

✅ 저장된 작업 목록 확인
$ git stash list
✅ 저장된 특정 작업 삭제
$ git stash drop <stash@{번호}>