본문 바로가기
Deployment/GitHub

Learn Git Branching (1) main

by curious week 2026. 4. 30.

Learn Git Branching

 

Learn Git Branching

An interactive Git visualization tool to educate and challenge!

learngitbranching.js.org

들어가기 전 알고 있으면 좋은 learngitbranching 명령어

# 뒤로 돌리기
undo
# 초기화
reset
# level 선택 (문제 정답을 맞추고 여러 방법으로 테스트를 한다면 필수!)
levels

기본적인 명령어

git --version # 깃 버전 확인
git --help # 도움말
git diff 파일경로 # 파일 변경 사항 확인
git diff --staged 파일경로 # 스태이징 영역(add한) 파일 변경사항 확인

init

해당 폴더를 Git으로 관리되기 시작하며, .git 폴더를 생성하고 버전 정보를 저장하기 시작한다.

git init

log

커밋을 하게 되면 커밋 히스토리가 남는다. 로그 명령어는 커밋 히스토리(커밋 해시, 작성자, 날짜, 메시지)를 출력한다.

git log
git log --oneline # 한 줄 요약
git log --graph # 구조 시각화

status

내가 작업한 현재 상태가 어떤지를 보여주는 명령어다. 어떤 파일이 수정되고 스테이징(add) 되었는지, 또 추적되지 않는지(untracked)를 알려준다.

git status

commit

커밋은 로컬 디렉토리에 있는 모든 파일에 대한 스냅샷을 기록하는 것

git commit

git commit --amend # 마지막 커밋을 수정
git commit -m "메시지" # 커밋 메시지 바로 작성 (안쓰면 에디터 열림)
git commit -am "메시지" # 수정된(tracked) 파일을 자동으로 add 후 커밋
# 중요한 것은 am은 새로운 파일은 포함되지 않음!!!!

branch

브랜치는 특적 커밋에 대한 참조(reference)다. 그래서 많이 만들어도 메모리에 부담이 되지 않기 때문에 작은 단위로 잘게 나누는 것이 좋다.

git branch 브랜치명 # 생성
git branch --list # 브랜치 리스트
git branch --delete 브랜치명 # 삭제
git branch --move 이전이름 새이름 # 브랜치명 수정

브랜치는 하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역이다.

git branch NewImage
git checkout NewImage
git commit

merge

머지는 두 개의 부모를 가리키는 특별한 커밋을 만들어 낸다. 한 부모의 모든 작업 내역과 나머지 부모의 모든 작업, 그리고 그 두 부모의 모든 부모들의 작업 내역을 포함한다.

git merge [가져올 대상(브랜치/커밋)]

# main이 이동하지 않고 새로운 병합 커밋이 생김
git merge --no-ff <feature-branch> -ㅡ "메시지"
git merge bugFix

rebase

리베이스는 커밋의 흐름을 한 줄로 만들 수 있다.

# 이동할 브랜치를 선택하고
git rebase [붙고 싶은 브랜치]
git rebase [기준 브랜치] [붙이고 싶은 브랜치]

# A(HEAD), B가 존재할 때
git rebase B # B 뒤에 A를 연결 (B만 남음) B - A'(HEAD)
git rebase A B # A 뒤에 B를 연결 (A만 남음) A - B'(HEAD)
git rebase main

여기서 main을 선택하고 아래 명령어를 입력하면 main이 bugFix의 부모이기 때문에 단순히 앞쪽 커밋을 가리키게 이동한다.

git rebase bugFix

HEAD

HEAD는 현재 체크 아웃된(작업 중인) 커밋을 가리킨다.

git checkout C1

아래처럼 HEAD가 분리된 걸 볼 수 있다.

Relative Reference (상대 참조)

git log로 커밋의 해시값(현재 예시로 C0, C1으로 사용하고 있는 값이다.)을 보면 상당히 길다. 이걸 전부 입력하기 어렵기 때문에 Git은 고유한 값임을 보여줄 정도만 입력하면 된다.

# 해시값
fed2da64c0efc5293610bdd892f82a58e8cbc5d8
# 해시값이 위와 같다면
fed2
# 특정할 정도만 입력해도 이해한다.

상대 참조 방법

# 한번에 한 커밋 위로 움직인다.
^
# 한번에 여러 커밋 위로 움직인다. 숫자 생략 시 1
~<num>
git checkout main^

현재 HEAD가 main에 있기 때문에 아래도 가능하다.

git checkout HEAD^

git checkout HEAD~4

브랜치 강제로 옮기기 (branch -f)

git branch -f [대상] [위치]
git branch -f main HEAD~3

또는 아래도 가능하다.

git checkout main
git branch -f main C1
git checkout bugFix

브랜치와 HEAD 같이 이동

git checkout -B [대상] [목적지]
git switch -C [대상] [목적지]

대상을 목적지로 이동시키고 동시에 HEAD도 이동된다.

내부적으로는 아래와 같다.

git branch -f [대상] [목적지]
git checkout [대상]

 

reset

리셋은 브랜치로 하여금 예전의 커밋을 기리키도록 이동시키는 방식으로 내용을 되돌린다. 리셋은 히스토리를 고쳐쓰기 때문에 (혼자만 이전으로 돌아가는 것이기 때문에) 공동 작업에서는 사용할 수 없다.

git reset [커밋]
# 1 생략 가능
git reset HEAD~1

revert

변경된 내용을 다른 사람과 공유하기 위해서는 리버트를 사용해야한다. 리버트는 되돌리려고 한 커밋 아래에 새로운 변경 내용을 커밋한다. 이렇게 리버트를 하면 변경된 커밋을 다른 사람에게 푸쉬 할 수 있다.

git revert HEAD

cherry-pick

체크 아웃된 브랜치 아래에 일련의 커밋들을 복사해 붙여 넣을 수 있는 기능이다.

git cherry-pick C2 C4

cherry pick을 이용한 간단한 문제

git checkout main
git cherry-pick C2
git reset C1
git cherry-pick C2' C3

Interactive Rebase

해시값을 모를 때는 cherry-pick을 사용할 수 없다. 이때는 인터렉티브 리베이스를 사용한다.

git rebase -i [위치(상대 참조도 가능)]

위 명령어를 실행하면 복사될 커밋들을 보여주는 텍스트 편집기(vim, vscode 등)을 실행하게 된다. 여기서 복사할 커밋을 선택하면 된다.

git rebase -i HEAD~4

리베이스를 사용한 간단한 문제 (커밋들 갖고 놀기)

git rebase -i HEAD~2
git commit --amend
git rebase -i HEAD~2
git branch -f main C3''

Git tag

중요한 지점을 영구적으로 표시하고 참조할 수 있게 한다. git checkout 태그 이름 등이 가능해진다.

git tag [태그이름] [커밋해시]
git tag v1 C1

describe

가장 가까운 태그로 부터 HEAD(또는 현재 체크아웃된 브랜치)가 어디에 있는지 알려준다.

# 위치를 생략 시 현재 위치(HEAD)
git describ [커밋해시, 브랜치, 태그(가능하지만 자기 자신이라 의미 없음)]
출력: [tag]-[numCommits]-g[hash]

이 상황에서 입력과 출력은 다음과 같다.

git describe main
출력: v1-2-gC2

git describe side
출력: v2-1-gC4

부모 선택하기

# 부모 선택
git checkout main^

# 2번째 부모 선택
git checkout main^2

git checkout HEAD~
git checkout HEAD^2
git checkout HEAD~2
# 위와 동일
git checkout HEAD~^2~2

이미지(캡처) 출처: https://learngitbranching.js.org/?locale=ko

'Deployment > GitHub' 카테고리의 다른 글

Github Actions  (1) 2026.05.05
Learn Git Branching (2) remote  (0) 2026.05.01
GitHub Skills  (0) 2026.04.30
버전 관리와 깃(Git)  (0) 2025.12.01
Git 기본 사용법 (CLI)  (0) 2025.04.09