
💡 현재 연결된 원격 저장소 확인:
git remote -v
git branch # 현재 브랜치 확인
git branch <생성할 브랜치 이름> # 새로운 브랜치 생성
git log --oneline --graph --all --decorate # 변경된 브랜치 확인
💡
HEAD는 현재 작업 중인 브랜치를 가리킨다.
[main] 브랜치에서 [mybranch1] 브랜치로 변경하고 새로운 커밋 생성 후 결과 확인
git switch <브랜치 이름> # 브랜치 변경
git branch # 현재 브랜치 확인
git log --oneline --graph --all --decorate # HEAD 변경 확인
# 파일 수정 후
git status # 스테이지 상태 확인
git add . # 스테이지에 변경 사항 추가
git commit -m "<message>" # 커밋
git log --oneline --graph --all --decorate # 변경된 브랜치 확인
main과 mybranch1 병합하기
git switch main # main 브랜치로 변경
git merge mybranch1 # 빨리 감기 병합
git log --oneline --graph --all --decorate # 확인
현재 브랜치를 지정한 커밋으로 옮긴다. 작업 폴더의 내용도 함께 변경된다.
git reset --hard <이동할 커밋 체크섬>
체크섬 대신 아래 약칭 사용 가능:
| 약칭 | 의미 |
|---|---|
HEAD~ | HEAD의 부모 커밋 |
HEAD~2 | HEAD의 할아버지 커밋 |
HEAD^ | HEAD의 부모 커밋 |
HEAD^2 | HEAD의 두 번째 부모 커밋 (부모가 둘 이상일 때 사용) |
git reset --hard HEAD~2 # 두 단계 이전으로 되돌리기
git log --oneline --graph --all --decorate # 로그 확인
| 구분 | 설명 |
|---|---|
merge | 병합 (줄기를 그대로 유지) |
rebase | 재배치 (내 브랜치의 시작점을 대상 브랜치의 최신 커밋에 옮겨 붙임 → 일직선 히스토리) |
리베이스 원리:
1. HEAD와 대상 브랜치의 공통 조상을 찾는다.
2. 공통 조상 이후에 생성한 커밋들을 대상 브랜치 뒤로 재배치한다.
⚠️ 주의: 이미 원격 저장소(GitHub)에 푸시한 브랜치는 절대 Rebase 하지 말 것!
git tag -a -m "첫 번째 태그 생성" v0.1 # 주석 있는 태그 작성
git log --oneline --graph --all --decorate # 태그 생성 확인
git push origin v0.1 # 태그 푸시
[main] 브랜치로부터 [hotfix] 브랜치 생성[main] 브랜치로 빨리 감기 병합 및 배포git switch main # main 브랜치로 변경
git switch -c feature1 # feature1 브랜치 생성 및 변경
# 파일 수정 후
git add .
git commit -m "<message>"
git log --oneline --graph --all --decorate
git switch -c hotfix main # main에서 hotfix 브랜치 생성 후 변경
# 버그 파일 수정 후
git add .
git commit -m "<message>"
git log --oneline --graph --all --decorate
* db531ae (HEAD -> hotfix) test3 버그수정
| * dc53cc3 (feature1) test3
|/
* 3ab375f (tag: v0.1, origin/main, origin/HEAD, main) test2
* 96abff0 test
* 73850bd 코딩테스트 기록 시작
git switch main
git merge hotfix # 빨리 감기 병합
* db531ae (HEAD -> main, hotfix) test3 버그수정
| * dc53cc3 (feature1) test3
|/
* 3ab375f (tag: v0.1, origin/main, origin/HEAD) test2
* 96abff0 test
* 73850bd 코딩테스트 기록 시작
hotfix 커밋(버그 수정)은 현재 개발 중인 [feature1] 브랜치에도 반영해야 한다.
[feature1]과 [main]은 서로 다른 분기이므로 3-way 병합을 수행한다.
git switch feature1 # feature1 브랜치로 변경
git merge main # main 브랜치와 병합 시도 → 충돌 발생
Auto-merging src/programmers/test3.java
CONFLICT (add/add): Merge conflict in src/programmers/test3.java
Automatic merge failed; fix conflicts and then commit the result.
git status # 충돌 파일 확인 (both added: ...)
충돌 파일을 직접 열어 수동으로 수정한 뒤:
cat <파일> # 최종 변경 내용 확인
git add .
git status # modified: src/programmers/test3.java
git commit # 병합 커밋 생성
git log --oneline --graph --all --decorate
* 997db09 (HEAD -> feature1) 병합
|\
| * db531ae (origin/main, origin/HEAD, main, hotfix) test3 버그수정
* | dc53cc3 test3
|/
* 3ab375f (tag: v0.1) test2
* 96abff0 test
* 73850bd 코딩테스트 기록 시작
3-way 병합은 병합 커밋이 생성되어 트리가 복잡해진다. 히스토리를 깔끔하게 유지하고 싶다면 리베이스를 사용한다.