Git 가이드 - 커맨드라인 (CLI)
Git이란?
Git[1]은 프로젝트의 여러 인원이 동시에 작업을 진행하고 코드의 변경 이력 추적과 이전 버전으로 복원을 할 수 있도록 하는 분산형 버전 관리 시스템입니다.
Git의 용어
-
Repository (저장소)[2] Git으로 관리되는 프로젝트의 전체 파일과 변경 이력이 저장되는 공간이며, 로컬(Local) 저장소와 원격(Remote) 저장소로 구분됩니다.
-
Stage, Index (스테이지, 인덱스) Git에서 변경사항(Commit)을 생성하기 전 대상이 될 파일을 임시로 저장해두는 영역입니다.
-
Commit (커밋) 변경된 파일을 저장소에 기록하는 작업입니다. 커밋을 수행하면 해당 시점의 코드 상태가 저장됩니다.
-
Branch (브랜치) 독립적으로 작업할 수 있도록 생성된 개발 라인입니다. 기본 브랜치는
main또는master입니다. -
Merge (병합) 다른 브랜치에서 작업한 내용을 현재 브랜치로 합치는 작업입니다.
-
Push (푸시) 로컬 저장소의 커밋을 원격 저장소로 업로드합니다.
-
Pull (풀) 원격 저장소에서 변경된 커밋을 로컬 저장소로 가져옵니다.
-
Checkout (체크아웃) 특정 브랜치나 커밋으로 이동하는 작업입니다.
-
Reset (리셋)[3] 특정 커밋으로 되돌리는 작업입니다. 원격 저장소에 공유된 커밋은 되돌리지 않는 것을 권장합니다.
-
Revert (리버트) 특정 커밋의 변경 사항을 되돌리는 작업입니다. 기존 커밋을 유지한 채 새로운 되돌림 커밋을 생성합니다.
-
Fetch (패치) 원격 저장소에서 변경 사항을 가져옵니다. 로컬 브랜치는 변경되지 않으며 원격 추적 브랜치를 업데이트 합니다.
-
Conflict (충돌)[4] 병합 과정에서 동일한 부분이 각 브랜치간 다르게 수정되었을 때 발생하는 충돌입니다. 수동으로 해결하여야 합니다.
저장소 복제하기 - Clone
원격 저장소의 내용을 로컬로 복제하려면 git clone 명령어를 사용합니다.
# 저장소 복제
git clone <저장소_URL>
브랜치 생성 및 변경
브랜치를 생성하고 해당 브랜치로 이동(체크아웃)하는 방법입니다.
# 새 브랜치 생성 및 이동
git checkout -b <새_브랜치명>
# 또는 최신 방식 (Git 2.23+)
git switch -c <새_브랜치명>
TIP
main 브랜치에 직접 커밋하기보다는 작업용 브랜치를 생성하여 작업하는 것이 좋습니다.
브랜치 변경하기 - Checkout
WARNING
이 작업을 수행하기 전 넥사크로[5] 내 열린 탭이나 리포팅 툴 등 쓰기모드로 프로젝트 파일을 읽고 있는 프로그램을 종료하여 주시기 바랍니다.
# 기존 브랜치로 이동
git checkout <브랜치명>
# 또는 최신 방식
git switch <브랜치명>
현재 상태 및 브랜치 확인
# 현재 브랜치 및 변경 상태 확인
git status
# 브랜치 목록 확인
git branch
변경 사항 저장하기 - Commit
커밋은 작업 디렉토리의 변경 사항을 로컬 저장소에 기록하는 과정입니다. 커밋을 하기 위해서는 먼저 변경된 파일들을 스테이지(Stage) 영역에 올려야 합니다.
1. 변경된 파일을 스테이지에 추가 - git add
git add는 작업 디렉토리의 변경 내용을 스테이지 영역에 추가하여 다음 커밋에 포함될 준비를 하는 명령어입니다.
# 특정 파일 하나만 추가
git add <파일명>
# 변경된 모든 파일 추가 (새로 생성된 파일 포함)
git add .
# 수정된 파일만 추가 (새로 생성된 파일 제외)
git add -u
2. 대화형 스테이징 - git add -i
git add -i 명령어를 사용하면 대화형 인터페이스를 통해 커밋할 파일을 세밀하게 선택하고 검토할 수 있습니다.
# 대화형 모드 시작
git add -i
실행 예시:
-
명령어를 입력하면 현재 상태와 메뉴가 나타납니다.
staged unstaged path 1: unchanged +1/-1 README.md 2: unchanged +5/-0 src/main.js *** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now> -
update(2번)를 입력하여 파일을 스테이지에 올릴 준비를 합니다.What now> 2 staged unstaged path 1: unchanged +1/-1 README.md 2: unchanged +5/-0 src/main.js Update>> -
스테이지에 올릴 파일 번호를 입력합니다. (예: 1번 파일 선택)
Update>> 1 * 1: unchanged +1/-1 README.md 2: unchanged +5/-0 src/main.js Update>>번호 앞에
*표시가 생기면 선택된 것입니다. 선택을 마쳤으면 엔터를 칩니다. -
다시 메인 메뉴로 돌아오며, 파일이 스테이지에 올라간 것을 확인할 수 있습니다.
Update>> updated 1 path staged unstaged path 1: +1/-1 nothing README.md 2: unchanged +5/-0 src/main.js *** Commands *** 1: status 2: update 3: revert 4: add untracked 5: patch 6: diff 7: quit 8: help What now> 7 Bye.quit(7번)을 입력하여 종료합니다.
대화형 모드에서 자주 사용되는 메뉴는 다음과 같습니다:
- status (1): 현재 변경된 파일들의 상태를 요약해서 보여줍니다.
- update (2): 이미 추적 중인 파일의 변경 사항을 스테이지에 추가합니다.
- revert (3): 스테이지에 추가된 파일을 다시 워킹 디렉토리로 내립니다.
- add untracked (4): 새로 생성된 파일(untracked)을 스테이지에 추가합니다.
- patch (5): 파일의 변경 사항 중 일부(hunk)만 선택하여 스테이지에 추가할 수 있습니다. (매우 유용한 기능)
3. 커밋 생성 - git commit
스테이지에 올라온 파일들을 하나의 기록으로 저장합니다.
# 커밋 생성 (에디터 열림)
git commit
# 커밋 메시지를 바로 입력하여 생성
git commit -m "커밋 메시지"
반드시 커밋 메시지를 상세히 작성하여 변경 이유를 명확히 남기는 것이 좋습니다.
변경사항 받아오기 - Fetch & Pull
# 원격 저장소의 최신 정보만 가져오기 (로컬 코드 반영 X)
git fetch origin
# 원격 저장소의 변경 사항을 가져와서 현재 브랜치에 합치기
git pull origin <브랜치명>
WARNING
Pull 수행 전 수정 중인 파일의 점유를 해제(탭 닫기 등)하시기 바랍니다.
브랜치 병합 - Merge
다른 브랜치의 내용을 현재 브랜치로 합치는 방법입니다.
# 1. 내 브랜치로 이동
git checkout my-branch
# 2. 다른 브랜치(예: main)를 병합
git merge main
WARNING
Merge 수행 전 수정 중인 파일의 점유를 해제하시기 바랍니다.
원격 저장소로 업로드 - Push
# 현재 브랜치의 커밋을 원격 저장소로 업로드
git push origin <브랜치명>
커밋 되돌리기 - Revert
이미 생성된 커밋의 변경 사항을 되돌리는 새로운 커밋을 생성합니다.
# 특정 커밋 되돌리기
git revert <커밋_해시>
NOTE
커밋 해시는 git log 명령어로 확인할 수 있습니다.
특정 시점의 파일을 복원하기
# 특정 커밋의 특정 파일만 가져오기
git checkout <커밋_해시> -- <파일_경로>
충돌 해결하기 - Conflict
충돌 발생 시 Git은 파일 내에 충돌 표시자를 삽입합니다.
- 충돌이 발생한 파일을 열어 내용을 수정합니다.
<<<<<<< HEAD부터=======까지가 현재 브랜치의 내용=======부터>>>>>>>까지가 병합하려는 브랜치의 내용
- 수정 완료 후 파일을 저장합니다.
- 수정된 파일을 스테이지에 추가하고 커밋합니다.
git add <충돌_해결_파일명>
git commit -m "Fix conflict"