우공이산(愚公移山)

자신과 세상을 바꾸는 것은 머리좋고 가진것이 많은 사람이 아니라 결코 포기하지 않는 의지로 꾸준히 노력해 가는 사람이다. 오늘이 쌓여 내일을 만들고, 내일이 쌓여 인생을 만든다.

Code Story

GIT 명령어

보노보노 2025. 6. 13. 00:45

 

 

 

 

 

1. Git 시작하기: 버전 관리의 첫걸음

이 섹션에서는 Git이 무엇인지, 왜 필요한지, 그리고 자주 함께 언급되는 GitHub와는 어떤 차이가 있는지 알아봅니다. 버전 관리의 기본 개념을 이해하여 앞으로의 학습을 위한 탄탄한 기초를 다집니다.

1.1. Git이란 무엇인가?

Git(깃)은 파일의 변경 사항을 추적하고 여러 사용자 간의 작업을 조율하는 분산 버전 관리 시스템(Distributed Version Control System, DVCS)입니다. 소프트웨어 개발, 특히 여러 프로그래머가 협력하여 소스 코드를 관리할 때 주로 사용됩니다. Git은 2005년 리눅스 커널의 소스 코드를 효과적으로 관리하기 위해 리누스 토르발스에 의해 처음 개발되었습니다.

Git은 단순한 파일 백업 도구를 넘어섭니다. 프로젝트의 모든 변경 이력을 상세히 기록하여 특정 시점으로 코드를 되돌릴 수 있는 '타임머신' 기능을 제공하며, 여러 개발자가 동시에 각자의 작업을 진행하고 그 결과를 효율적으로 병합할 수 있도록 지원하는 '협업의 신경망'과 같은 역할을 합니다.

1.2. 버전 관리 시스템(VCS)의 필요성과 Git의 장점

버전 관리 시스템(VCS)은 파일의 변경 이력을 체계적으로 관리하고, 필요한 경우 이전 상태로 복원할 수 있도록 돕는 도구입니다. 여러 사람이 동시에 작업할 때 발생할 수 있는 코드 충돌을 예방하고, 누가 언제 무엇을 변경했는지 추적할 수 있게 하여 협업의 효율성을 높입니다.

Git은 VCS 중에서도 다음과 같은 장점으로 널리 사용됩니다:

  • 분산형 시스템: 각 개발자가 전체 저장소의 복사본을 가지므로 네트워크 연결 없이도 대부분의 작업을 수행할 수 있습니다.
  • 매우 빠른 속도: 대부분의 연산이 로컬에서 이루어지기 때문에 속도가 빠릅니다.
  • 가볍고 효율적인 브랜칭: 브랜치 생성과 삭제가 매우 가벼워 부담 없이 다양한 실험을 위한 브랜치를 만들 수 있습니다.
  • 강력한 병합 기능: 다양한 병합 전략을 지원하며, 충돌 발생 시에도 명확하게 해결할 수 있는 도구를 제공합니다.
  • 스테이징 영역(Staging Area) 지원: 커밋할 변경 사항을 선택적으로 준비할 수 있는 중간 영역을 제공하여, 의미 있는 단위로 커밋을 구성할 수 있게 합니다.

1.3. Git과 GitHub의 차이점

Git과 GitHub는 종종 혼용되지만 명확히 다릅니다. 이 둘의 관계를 이해하는 것은 매우 중요합니다.

  • Git: 분산 버전 관리 "시스템" 또는 "소프트웨어" 그 자체입니다. 로컬 컴퓨터에 설치되어 파일의 버전을 관리하고, 변경 이력을 추적하는 도구입니다.
  • GitHub: Git으로 관리되는 프로젝트 저장소를 위한 웹 기반 "호스팅 서비스"입니다. Git 저장소를 클라우드에 올려 다른 사람들과 공유하고 협업할 수 있는 플랫폼을 제공합니다. GitHub 외에도 GitLab, Bitbucket 등 유사한 서비스가 있습니다.
💻

Git (소프트웨어)

내 컴퓨터에서 버전 관리

↔️
☁️

GitHub (서비스)

클라우드에서 코드 공유/협업

2. Git 설치 및 최초 설정

이 섹션에서는 사용자의 운영체제에 맞게 Git을 설치하고, 커밋 기록에 자신의 신원을 명시하기 위한 기본적인 사용자 정보를 설정하는 방법을 배웁니다. 모든 Git 작업의 가장 첫 단계입니다.

2.1. 운영체제별 Git 설치 방법

Git은 Windows, macOS, Linux 등 대부분의 주요 운영체제를 지원합니다.

  • Windows: Git 공식 웹사이트에서 설치 파일을 다운로드하여 실행합니다. 대부분의 옵션을 기본값으로 두고 설치를 진행하면 됩니다.
  • macOS: Homebrew 패키지 관리자를 사용하는 것이 가장 편리합니다. 터미널에서 `brew install git` 명령어를 실행하여 설치합니다.
  • Linux (Debian/Ubuntu): 터미널에서 `sudo apt-get update` 후 `sudo apt-get install git` 명령어로 설치할 수 있습니다.

2.2. Git 최초 사용자 정보 설정 (`git config`)

Git을 설치한 후에는 커밋 시 작성자 정보를 기록하기 위해 사용자 이름과 이메일 주소를 설정해야 합니다. 이 정보는 협업 시 누가 변경했는지 식별하는 데 사용됩니다.

터미널 또는 Git Bash에서 다음 명령어를 실행하세요. `--global` 옵션은 현재 시스템의 모든 Git 저장소에 이 설정을 적용합니다.

git config --global user.name "Your Name" git config --global user.email "youremail@example.com"

설정이 올바르게 적용되었는지 확인하려면 다음 명령어를 사용합니다.

git config --list

3. 저장소 관리: 시작과 복제

Git으로 버전 관리를 시작하는 두 가지 방법, 즉 새로운 프로젝트를 위한 로컬 저장소를 만들거나 이미 존재하는 원격 저장소를 내 컴퓨터로 가져오는 방법을 알아봅니다.

3.1. 새로운 로컬 저장소 만들기 (`git init`)

`git init` 명령어는 현재 디렉토리를 Git 저장소로 초기화합니다. 이 명령을 실행하면 해당 디렉토리 내에 버전 관리와 관련된 모든 정보가 저장되는 `.git`이라는 숨김 폴더가 생성됩니다.

# 버전 관리를 시작할 프로젝트 폴더로 이동 mkdir my-new-project cd my-new-project # 현재 폴더를 Git 저장소로 초기화 git init

3.2. 원격 저장소 복제하기 (`git clone`)

`git clone` 명령어는 이미 존재하는 원격 저장소(예: GitHub 프로젝트)를 로컬 컴퓨터로 똑같이 복제해오는 데 사용됩니다. 원격 저장소의 모든 파일, 브랜치, 그리고 전체 커밋 히스토리가 로컬로 다운로드됩니다.

# GitHub에 있는 원격 저장소를 현재 폴더 하위에 복제 git clone https://github.com/example-user/example-repo.git # 로컬에 'my-project' 라는 다른 이름으로 폴더를 만들며 복제 git clone https://github.com/example-user/example-repo.git my-project

4. Git 핵심 워크플로우

Git의 가장 기본적인 작업 흐름을 이해합니다. 파일 변경 사항을 추적하고, 스테이징 영역에 준비시킨 후, 로컬 저장소에 영구적으로 기록하는 과정을 시각적인 다이어그램과 함께 학습합니다.

4.1. Git의 3가지 작업 영역

Git은 파일을 관리하기 위해 논리적으로 구분된 세 가지 공간을 사용합니다. 아래 다이어그램의 각 요소를 클릭하면 해당 설명으로 이동합니다. 이 흐름을 이해하는 것은 Git 사용의 핵심입니다.

작업 디렉토리

(Working Directory)

git add

스테이징 영역

(Staging Area)

git commit

로컬 저장소

(Local Repository)

  • 작업 디렉토리 (Working Directory): 사용자가 실제로 파일을 생성하고, 코드를 작성하고, 수정하는 프로젝트 폴더 그 자체입니다.
  • 스테이징 영역 (Staging Area): 다음 커밋에 포함될 변경 사항들을 선별하여 준비시키는 가상의 공간입니다. `git add` 명령으로 작업 디렉토리의 변경 사항을 이곳으로 옮깁니다.
  • 로컬 저장소 (Local Repository): 프로젝트의 모든 버전 이력, 즉 커밋(commit)들이 영구적으로 저장되는 곳입니다. `.git` 디렉토리에 보관됩니다. `git commit` 명령으로 스테이징 영역의 내용을 이곳에 기록합니다.

4.2. 변경 사항 추적 및 스테이징 (`git add`)

`git add` 명령어는 작업 디렉토리의 변경된 파일들을 스테이징 영역으로 옮겨, 다음 커밋에 포함될 수 있도록 준비시키는 역할을 합니다.

# 특정 파일 하나만 스테이징 git add file1.txt # 여러 파일을 동시에 스테이징 git add file1.txt file2.html # 현재 디렉토리의 모든 변경 사항을 스테이징 (주의해서 사용) git add .

4.3. 변경 사항 기록 (`git commit`)

`git commit` 명령어는 스테이징 영역에 준비된 파일들의 현재 상태(스냅샷)를 로컬 저장소에 영구적으로 기록합니다. 각 커밋에는 변경 사항을 설명하는 메시지를 반드시 함께 기록해야 합니다.

# -m 옵션으로 커밋 메시지를 함께 입력 git commit -m "사용자 로그인 기능 구현" # 가장 최근 커밋을 수정 (메시지 변경 또는 파일 추가/제외) # 주의: 원격에 push한 커밋은 수정하지 않는 것이 좋음 git commit --amend -m "수정된 커밋 메시지"

4.4. 상태 및 이력 확인 (`git status`, `git log`, `git diff`)

작업 상태를 파악하고, 과거 이력을 살펴보며, 변경 내용을 비교하는 명령어들입니다.

  • `git status`: 현재 작업 디렉토리와 스테이징 영역의 상태를 종합적으로 보여줍니다.
  • `git log`: 현재 브랜치의 커밋 히스토리를 시간의 역순으로 보여줍니다. --oneline, --graph 등 유용한 옵션이 많습니다.
  • `git diff`: 파일들 간의 변경된 내용을 비교하여 보여줍니다.
# 현재 상태 확인 git status # 커밋 로그를 한 줄로 간결하게 그래프와 함께 보기 git log --oneline --graph # 아직 스테이징하지 않은 변경 내용 확인 git diff

5. 브랜치 활용: 병렬적 작업 관리

Git의 가장 강력한 기능인 브랜치에 대해 배웁니다. 기존 코드에 영향을 주지 않고 새로운 기능을 개발하거나 버그를 수정하는 등 독립적인 작업을 가능하게 하는 브랜치의 생성, 전환, 병합, 그리고 충돌 해결 방법을 알아봅니다.

5.1. 브랜치의 개념과 필요성

브랜치는 현재 개발 중인 주 흐름에서 가지를 치듯이 분기하여 독립적인 작업 영역을 만드는 기능입니다. 각 브랜치는 자신만의 커밋 히스토리를 가지며, 다른 브랜치의 작업에 영향을 받지 않고 자유롭게 코드를 수정하고 커밋할 수 있습니다. 이를 통해 새로운 기능을 안정적으로 개발하고, 여러 작업을 동시에 효율적으로 관리할 수 있습니다.

5.2. 브랜치 기본 명령어

# 모든 로컬 브랜치 목록 확인 git branch # 'feature/login'이라는 새 브랜치 생성 git branch feature/login # 'feature/login' 브랜치로 작업 환경 전환 git checkout feature/login # 브랜치 생성과 동시에 해당 브랜치로 전환 (가장 많이 사용) git checkout -b feature/user-profile # 작업 완료 후 병합된 브랜치 삭제 (안전한 삭제) git branch -d feature/login # 병합되지 않은 브랜치 강제 삭제 (주의해서 사용) git branch -D old-feature

5.3. 브랜치 병합 (`git merge`)

`git merge`는 분리된 브랜치에서 진행된 작업 결과를 현재 브랜치로 통합하는 과정입니다.

# 병합 결과를 받을 main 브랜치로 이동 git checkout main # 'feature/user-profile' 브랜치의 작업 내용을 main으로 병합 git merge feature/user-profile

5.4. 병합 충돌(Merge Conflict) 해결

두 브랜치에서 같은 파일의 같은 부분을 다르게 수정하면 병합 충돌이 발생합니다. Git은 자동으로 해결할 수 없어 사용자에게 해결을 요청합니다.

충돌이 발생하면, 파일에 `<<<<<<< HEAD`, `=======`, `>>>>>>>` 마커가 생깁니다. 이 마커를 기준으로 내용을 직접 수정한 후, 다음 단계를 따릅니다.

# 1. 충돌이 발생한 파일을 열어 코드 수정 및 충돌 마커 제거 # 2. 충돌을 해결한 파일을 스테이징 git add <충돌_해결한_파일명> # 3. 병합 커밋 완료 git commit

만약 충돌 해결이 어렵다면 `git merge --abort` 명령으로 병합 시도 이전 상태로 돌아갈 수 있습니다.

6. 원격 저장소 연동: 협업의 시작

로컬에서 관리하던 프로젝트를 GitHub과 같은 원격 서버에 연결하고, 다른 사람과 코드를 공유하거나 백업하는 방법을 배웁니다. `push`와 `pull`을 통해 협업의 기본을 다집니다.

6.1. 원격 저장소 연결 및 관리 (`git remote`)

로컬 저장소를 원격 저장소와 연결합니다. 관례적으로 기본 원격 저장소의 별칭은 `origin`을 사용합니다.

# 원격 저장소 연결 추가 ('origin'이라는 별칭 사용) git remote add origin https://github.com/user/repo.git # 연결된 원격 저장소 목록과 URL 확인 git remote -v # 원격 저장소 연결 삭제 git remote remove origin

6.2. 로컬 변경 사항 원격으로 전송 (`git push`)

`git push`는 로컬 저장소의 커밋들을 원격 저장소로 업로드하는 명령어입니다.

# 로컬의 main 브랜치를 origin 원격의 main 브랜치로 푸시 git push origin main # -u 옵션으로 업스트림 설정 (최초 푸시 시 유용) # 이후에는 'git push'만 입력해도 됨 git push -u origin main

6.3. 원격 변경 사항 로컬로 가져오기 (`git pull`)

`git pull`은 원격 저장소의 최신 변경 사항을 현재 로컬 브랜치로 가져와 자동으로 병합까지 수행하는 명령어입니다. 내부적으로 `git fetch` (가져오기)와 `git merge` (병합)를 순차적으로 실행합니다.

# origin 원격의 main 브랜치 변경 사항을 현재 브랜치로 가져와 병합 git pull origin main

로컬에 커밋하지 않은 변경사항이 있는 상태에서 pull을 하면 충돌이 발생할 수 있으니, pull을 하기 전에는 작업을 커밋하거나 임시 저장(stash)하는 습관을 들이는 것이 좋습니다.

7. 고급 활용 팁

Git 기본 사용법에 익숙해졌다면, 이제 작업을 더욱 효율적으로 만들어 줄 고급 팁들을 알아봅니다. 버전 관리에서 특정 파일을 제외하는 방법과, 실수를 되돌리는 두 가지 중요한 방법을 비교하며 학습합니다.

7.1. 특정 파일 및 폴더 무시하기 (`.gitignore`)

프로젝트 내에 버전 관리가 필요 없는 파일(로그 파일, 빌드 결과물, 민감 정보 등)이 있다면, 프로젝트 루트 디렉토리에 `.gitignore` 파일을 만들어 해당 파일/폴더 목록을 지정할 수 있습니다. Git은 이 목록에 있는 것들을 추적하지 않습니다.

# .gitignore 파일 예시 # 모든 .log 파일 무시 *.log # build 폴더 전체 무시 build/ # node_modules 폴더 무시 node_modules/ # .env 파일과 같이 민감한 정보가 담긴 파일 무시 .env

이미 Git이 추적하고 있는 파일을 나중에 무시하려면, `git rm --cached <파일명>` 명령으로 Git의 추적 목록에서 먼저 제거해야 합니다.

7.2. 작업 되돌리기: `reset` vs `revert`

작업을 되돌리는 두 가지 주요 명령어 `reset`과 `revert`는 동작 방식과 히스토리 변경 여부에서 중요한 차이가 있습니다. 아래 대화형 예제를 통해 차이점을 명확히 이해해 보세요.

git reset --hard

과거로 돌아가 이후 히스토리를 삭제

C3: 기능 C 추가
C2: 기능 B 추가
C1: 초기 커밋

주의: 공유된 히스토리에 사용하면 위험합니다.

git revert

변경을 취소하는 새 커밋 추가

C3: 기능 C 추가
C2: 기능 B 추가
C1: 초기 커밋

협업 시 안전하게 변경을 되돌릴 수 있습니다.

특징 git reset git revert
히스토리 변경 과거 커밋 내역을 변경(삭제) 과거 내역을 유지하고, 취소하는 새 커밋을 추가
사용 환경 주로 로컬 저장소에서 Push 전 개인 작업 되돌릴 때 주로 원격 저장소에 Push된 공유 작업 되돌릴 때
안전성 (협업 시) 매우 위험 비교적 안전

8. 마무리: Git 학습을 위한 다음 단계

꾸준한 연습의 중요성

Git은 강력하고 유용한 도구이지만, 그 기능을 온전히 활용하기 위해서는 이론 학습만큼이나 실제 사용 경험이 매우 중요합니다. 이 가이드에서 다룬 명령어들을 직접 터미널에 입력해보고, 다양한 시나리오를 스스로 만들어 연습하는 과정이 필수적입니다.

추가 학습 자료 추천

  • Git 공식 문서: 가장 정확하고 포괄적인 정보를 제공합니다.
  • Pro Git (프로 Git) 책: Git에 대한 거의 모든 것을 다루는 훌륭한 책이며, 온라인에서 무료로 볼 수 있습니다.
  • 온라인 학습 플랫폼: 인프런, 생활코딩, Codecademy, Udemy 등 다양한 플랫폼의 Git 강좌를 활용해 보세요.
  • Git GUI 도구: SourceTree, GitKraken, GitHub Desktop, VS Code 내장 Git 기능 등 그래픽 인터페이스 도구는 브랜치 구조 등을 시각적으로 이해하는 데 도움을 줍니다.

격려 메시지

Git은 현대 소프트웨어 개발에서 거의 필수적인 기술입니다. 처음에는 다소 어렵게 느껴질 수 있지만, 꾸준히 학습하고 실제 프로젝트에 적용하며 경험을 쌓는다면 개발자로서의 역량을 한층 끌어올리는 강력한 동반자가 될 것입니다. 포기하지 않고 Git의 세계를 탐험하길 바랍니다!