본문 바로가기
Git/박미정의 깃&깃허브 입문

[Git] Ch.2 깃 기본 명령어 알아보기

by ♡˖GYURI˖♡ 2023. 10. 16.

깃/깃허브 소스 관리 기본 흐름

  1. 지역 저장소 → 깃허브(원격 저장소)
  2. 깃허브(원격 저장소) → 지역 저장소

 

지역 저장소 → 깃허브(원격 저장소)

지역 저장소에 새 프로젝트를 생성했다고 합시다.

  1. git init 명령어로 해당 프로젝트를 깃 지역 저장소로 지정합니다.
  2. 파일을 수정합니다.
  3. git add 명령어로 수정한 파일을 스테이징 영역으로 옮깁니다.
  4. git commit으로 지역 저장소에 저장하게 됩니다.
  5. git push 명령어로 지역 저장소에서 발생한 변경 내역을 원격 저장소에 반영합니다.

 

깃허브(원격 저장소) → 지역 저장소

이미 깃허브에 올려진 프로젝트 전체를 git clone 명령어로 지역 저장소에 내려받거나 혹은 일부 변경 사항만 git pull 명령어로 내려받을 수 있습니다.

 

 

깃 지역 저장소 설정

git init

▼숨김 폴더 및 파일 목록을 함께 보여주는 명령어 

ls -a

 

 

.git 폴더 확인

▼ .git 폴더 내의 파일 및 폴더 목록 확인

ls -l

깃 지역 저장소에서 관리하는 파일, 브랜치, 설정 정보 등이 담겨 있습니다. .git 폴더 내의 파일 및 폴더를 사람이 직접 수정할 일은 거의 없습니다. 깃 명령어를 이용하여 작업할 때 깃에 의해 자동으로 관리됩니다.

 

 

git init 취소

rm -rf .git

 

 

사용자 등록

git config user.name "사용자 이름"
git config user.email "이메일 주소"

한 프로젝트를 대상으로 여러 개발자가 작업할 수 있기 때문에 현재 작업하는 개발자가 누구인지 등록하는 과정입니다.

(사용자 이름과 이메일 주소는 깃허브 계정의 Username, Email과 동일해야 합니다.)

 

현재 깃 지역 저장소에만 해당하는 사용자 정보를 등록했지만, 모든 프로젝트에 적용될 사용자 정보를 등록하고 싶다면

--global 옵션을 사용합니다.

git config --global user.name "사용자 이름"
git config --global user.email "이메일 주소"

한 컴퓨터에서 여러 계정을 사용할 일이 없다면 --gloal 옵션을 사용해서 입력하세요. 그러면 모든 프로젝트에서 동일한 사용자 정보로 사용할 수 있어 편리합니다.

 

 

깃 설정 파일 확인

앞에서 깃 저장소에 사용자 정보를 등록했습니다. 깃은 .git 폴더 안의 config 파일에 저장된 설정 정보를 참고합니다.

cat .git/config

[core]

  1. repositoryformatversion : 현재 깃 저장소의 형식 및 버전을 식별하기 위해 내부적으로 사용되는 변수입니다.
  2. filemode : 깃 저장소에 포함된 파일 모드의 변경 감지 여부를 설정합니다. 예를 들어 파일시스템이 다른 윈도우와 리눅스에서 동시에 작업하는 깃 저장소 파일이라면 실제 코드를 변경하지 않았는데도 변경된 파일이라고 표시될 수 있습니다. 파일 모드의 변경을 무시하고 싶다면 'filemode = false'로 설정하세요.
  3. bare : 현재 깃 저장소가 코드를 변경하고 작업하는 용도가 아닌 현재까지 작업을 복사하는 용도라면 'bare = true'로 설정하세요. 보통 원격 중앙 저장소를 만드는 데 사용합니다.
  4. logallrefupdates : 깃 명령어를 통해 수행되는 작업 내용을 기록하는 reflog를 활성화합니다. git reflog 명령어를 통해 기록된 작업 내역을 확인할 수 있습니다.
  5. ignorecase : 대소문자 구분 여부를 설정하는 값입니다. 기본값은 true로 대소문자를 구분하지 않습니다.
  6. precomposeunicode : 맥OS로 깃 저장소를 작업할 때 사용할 수 있는 설정입니다. 맥OS의 유니코드 정규화 방식이 달라서 파일명이 한글일 때 깃에서 해당 파일을 인식하지 못하는 문제가 발생할 수 있습니다. 이 때 'precomposeunicode = true'로 설정하면 해당 문제를 해결할 수 있습니다.

 

깃 원격 저장소 설정

  1. 깃허브에서 새로운 저장소를 생성합니다.
    1. github.com에 접속해 로그인
    2. 우상단 + 기호를 좌클릭
    3. 팝업에서 [New repository]를 선택
  2. Repository name 설정 후 Create repository를 선택합니다.
  3. 생성한 원격 저장소 페이지에서 원격 저장소 주소를 복사합니다.
  4. chapter2-basic 폴더로 이동합니다.
  5. git remote add origin 명령어를 실행해 원격 저장소 주소를 깃 지역 저장소에 등록합니다.
  6. 설정 파일을 확인합니다. : cat .git/config 명령어 실행

앞에서 확인했던 config 파일과 다르게 [remote "origin"] 섹션이 추가된 것을 확인할 수 있습니다.

 

 

.gitignore 파일 설정

특정 프로젝트에서 생성되는 모든 파일의 버전을 깃으로 관리할 필요는 없습니다. 로그 파일 혹은 빌드 결과 파일 등은 개발자가 직접 수정할 일이 없고, 프로젝트 버전 관리용으로도 필요 없습니다. 따라서 깃으로 관리할 필요가 없습니다. .gitignore 파일을 이용해 이런 파일들을 깃이 무시하도록 만들 수 있습니다.

  1. .gitignore 파일을 프로젝트의 최상위 경로에 생성합니다.
  2. gitignore 파일을 열어 로그 파일과 외부 패키지들이 설치되는 node_modules/ 폴더를 깃으로 관리하지 않겠다고 지정한 후 저장합니다.
# Logs
logs
*.log
npm-debug.log*

#Dependency directories
node_modules/

폴더 말고 개별 파일도 지정할 수 있습니다. 프로젝트를 진행하면서 깃으로 관리할 피요가 없는 파일이 생길 때마다 해당 .gitignore 파일에 추가하면 됩니다. .gitignore 파일에 포함된 파일은 수정이 일어나도 깃에서 변경된 파일이라고 알려주지 않습니다.

참고로 .gitignore 파일에 명시하는 경로는 .gitignore 파일 경로에 상대적이기 때문에 이를 주의해서 작성해야 합니다.

(#은 주석기호, .gitignore 파일 사용에 익숙해졌다면 개발 환경에 맞게 기본적인 .gitignore 파일을 생성해주는 gitignore.io와 같은 도구를 활용해도 좋습니다.)

 

 

깃 작업 트리

작업 트리 : 깃이 추적(괸라)하는 파일과 추적하지 않는 파일을 구분하고, 추적하는 파일들의 상태를 구분짓는 영역으로 .git 숨김 폴더 안에서 관리됩니다.

  1. 작업 디렉터리(Working Directory) : 실제 작업 중인 파일들이 존재하는 영역입니다. 파일을 생성하거나 기존 파일을 수정한다면 이는 작업 중인 파일을 의미합니다.
  2. 스테이징 영역(Staging Area) : 작업 디렉터리에서 작업 중인 파일 중 깃이 추적하는 파일들을 식별하는 영역입니다. 실제로 .git 숨김 폴더 내부의 index 파일에서 추적하는 파일들을 식별하고 있습니다.
  3. 지역 저장소(Local Repository) : 스테이징 영역에서 추적되는 파일이 커밋으로 등록되는 영역입니다. 즉, 스테이징 영역의 파일 혹은 파일들이 하나의 변경 단위인 커밋으로 등록되는 과정입니다.

 

깃으로 파일 상태 확인

Untracked 및 Tracked 상태

깃에서 관리하는 파일은 Untracked와 Tracked 상태로 나뉩니다. 현재 작업 진행 중인 작업 디렉터리에서 새로 생성된 파일은 Untracked 상태가 됩니다. 주의할 점은 한 번 Tracked 상태가 되었다가 작업 디렉터리에서 수정된 파일은 Untracked 상태가 아니라는 점입니다.

 

  1. git status 명령어를 실행하여 프로젝트의 현재 파일 상태를 확인합니다.
    • .gitignore 파일이 Untracked files 상태일 것입니다.
  2. .gitignore 파일을 git add 명령어로 커밋에 포함될 파일로 등록하면 파일 상태가 tracked 상태로 변경됩니다.
git add .gitignore
git status

Changes to be committed는 해당 파일이 깃에서 관리하는 파일인 Tracked 상태뿐만 아니라 스테이징 영역에서 커밋으로 기록될 준비가 되었다는 뜻입니다.

 

  • git add를 수행할 때 여러 파일을 선택하기 원하는 경우 해당 파일 이름을 나열하면 됩니다.
  • git add 명렁어를 실행할 때 다음과 같은 경고 문구가 보일 수도 있습니다.
warning: LF will be replaced by CRLF in .gitignore.
  • 이 경고는 운영체제마다 개행문자를 인식하는 방법이 달라서 발생합니다. 해당 경고를 무시해도 문제는 없지만, 경고문구를 보고 싶지 않다면 터미널에서 다음 명령어를 실행하세요.
git config core.autocrlf true

 

Unmodified 및 Modified 상태

한 번 스테이징 영역에 추가된 파일은 수정 여부에 따라 Unmodified 상태와 Modified 상태로 분류됩니다.

작업 디렉터리에서 git add 명령으로 스테이징 영역에 추가된 파일이 상태를 크게 2가지로 분류할 수 있습니다.

  1. Stage : 커밋으로 기록할 수 있는 최종 상태
  2. Unstage : 스테이징 영역에 있지만, 파일에 변화가 있는 상태

Stage 상태는 Tracked와 Unmodified 상태로 분류할 수 있지만 같은 의미라고 생각하면 됩니다. Unmodified 상태는 Tracked 상태이면서 파일이 변경되지 않은 상태를 의미합니다.

 

Unstage 상태에 있는 파일은 스테이지 영역에 있음에도 불구하고 커밋으로 기록할 수 있는 상태가 아닙니다. 즉, Stage 상태였다가 파일에 변경이 생기는 순간 Unstage인 Modified 상태로 이전됩니다.

  1. 현재 프로젝트에서 새로운 파일을 생성하고 내용을 작성합니다. 작업 디렉터리의 Untracked 상태가 됩니다.
  2. git add 명령어를 이용하여 파일을 등록합니다. 스테이징 영역의 Tracked 및 Unmodified 상태로 이전합니다.
  3. 해당 파일에 코드 한 줄을 추가했습니다. 파일이 변경된 것입니다. 여전히 스테이징 영역에 존재하지만 Tracked 및 Unmodified 상태로 이전합니다.
  4. 코드 추가가 완료되어 다시 git add 명령어로 해당 파일을 재등록합니다. Tracked 및 Unmodified 상태로 이전합니다.

 

커밋 생성하기

1. 커밋 명령어를 실행합니다.

git commit

2. i를 입력합니다. 그러면 입력 모드로 전환되고 터미널 내용 하단처럼 --INSERT-- 표시가 나타납니다. 직접 커밋 메시지를 작성할 수 있다는 의미입니다.

3. 작업한 내용을 기록하고 esc 키 입력, :wq 입력, enter 키를 눌러 해당 커밋 메시지를 저장합니다.

 

 

커밋 이해하기

git log 명령어로 현재 작업하는 브랜치의 커밋 로그를 확인할 수 있습니다.

(브랜치란 특정 기능을 독립적으로 개발하는 용도의 공간이라고 생각하면 됩니다.)

 

깃에는 HEAD라는 특별한 포인터가 존재합니다. HEAD 포인터는 현재 작업하는 브랜치의 최종 커밋을 가리킵니다.

HEAD → main은 HEAD 포인터가 main 브랜치를 가리키고 있다는 의미입니다. 

git log

커밋 로그를 조회하는 가장 기본적인 명령어입니다. 프로젝트에서 어떤 작업들이 이루어졌는지 작업 이력을 확인하는 데 사용됩니다.

git log
  • git log -p : -p 옵션은 patch의 약자입니다. 해당 옵션은 파일 단위에서 변경 내용을 보여줍니다. ( = git log --patch)
  • git log -{숫자} : 최근 몇 개의 커밋을 보여줄지 지정하게 됩니다.
  • git log --stat : 각 커밋의 통계 정보를 볼 수 있습니다. 여기에서 통계란 어떤 파일이 수정되었고, 각 파일에서 몇 줄이 추가 혹은 삭제되었는지를 의미합니다.
  • git log --pretty={option}  : 커밋 로그를 보여주는 형식을 지정할 수 있습니다.
    • git log --pretty=oneline: 각 커밋을 한 줄로 보여줍니다.
    • git log --pretty=format:"%h %an %s" : 나만의 출력 형식을 지정할 수 있습니다. (짧은 커밋 해시, 저자 이름, 커밋 요약)
    • git log --pretty=oneline --graph : 가시적으로 커밋 로그의 흐름을 파악할 수 있습니다.

▼--pretty 옵션에서사용할 수 있는 출력 형식

형식 설명 형식 설명
%H 커밋 해시 %ae 저자 이메일
%h 짧은 커밋 해시 %ar 저자 상대적 시각
%T 트리 해시 %cn 커미터 이름
%t 짧은 트리 해시 %ce 커미터 이메일
%P 부모 해시 %cr 커미터 상대적 시각
%p 짧은 부모 해시 %s 커밋 요약
%an 저자 이름    

 

 

커밋 수정하기

git commit --amend
git commit --amend -m "수정 메시지"

git commit --amend 명령어를 실행하면 마지막 커밋 에디터 화면을 보여줍니다. 커밋 메시지를 수정하고 다시 저장하면 마지막 커밋 메시지가 수정됩니다.

  1. git commit --amend 명령어를 실행합니다.
  2. 커밋 메시지를 수정합니다.
  3. esc 키 입력, :wq 입력, enter 키를 눌러 에디터에서 빠져나옵니다.
  4. git log 명령어를 실행해 마지막 커밋 내용을 확인합니다.

 

커밋 파일 추가

  1. .gitignore 파일을 엽니다.
  2. 마지막 줄에 '#Runtime data'를 추가하여 파일을 수정합니다. 이미 기존 커밋에 추가된 .gitignore 파일을 다시 수정하는 것입니다.
  3. git status 명령어를 실행해 상태를 확인합니다.
  4. git add .gitignore 명령을 실행해 커밋에 포함될 파일로 등록합니다.
  5. git commit --amend --no-edit 명령을 실행해 .gitignore의 추가 변경 내용을 기존 커밋에 반영할 수 있습니다. --no-edit 옵션은 에디터를 띄우지 않고 커밋 메시지를 수정하지 않겠다는 의미입니다.

 

커밋 저자 수정

  1. git log 명령어를 실행합니다.
  2. git commit --amend --author "username <email>"
  3. 수정하고 esc 키 입력, :wq 입력, enter 키를 눌러 메시지를 저장하고 에디터에서 빠져나옵니다.

 

커밋 푸시하기

origin 서버로 푸시하기

  1. cat .git/config 명령어를 실행합니다.
  2. git log 명령어를 실행하여 현재 지역 저장소에 등록된 커밋을 다시 확인해봅시다.
  3. git push origin main 명령어로 저장된 커밋을 원격 저장소에 등록해봅시다.

새로운 서버로 푸시하기

  1. 깃허브에 새로운 원격 저장소를 생성합니다.
  2. 새로운 원격 저장소 주소를 복사합니다.
  3. 기존 지역 저장소에 새로 생성한 원격 저장소를 등록합니다. git remote add 명령어를 실행합니다. (git remote add origin2)
  4. cat .git/config 명령어를 실행합니다.
  5. 새로운 원격 저장소로 지역 저장소의 커밋을 등록합니다. git push origin2 main 명령어를 실행합니다.

 

원격 저장소 복제하기

git clone "원격 저장소 주소" "새로운 저장소 이름"
  1. [Code] 탭에서 이미 존재하는 원격 저장소의 주소를 복사합니다.
  2. 터미널을 실행한 후 루트 디렉터리로 이동합니다.
  3. 터미널에서 git clone 명령어를 실행합니다.
  4. ls 명령어를 실행하여 지역 저장소가 생성되었는지 확인합니다.