Git 초보를 위한 가이드

Jimyu·2023년 10월 11일
0
post-thumbnail

33기 웹파트 미미나에서 설명한 내용을 글로 정리했습니다.
미미나 때 길어질까봐 설명하지 못한 부분과 읽어보면 좋을 만한 참고 자료가 포함되어 있습니다 🙂
피드백은 언제나 환영입니다! 🙌🏻

1. Git?

  • 버전 관리 시스템(VCS - Version Control System) 중 하나!
    • 버전 관리란?
      파일 변화를 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템

장점

  • 작업하던 여러 버전이 기록되어 있기 때문에 갑자기 작업이 날아갈 걱정을 하지 않아도 되고, 문제가 생겨도 쉽게 복구할 수 있다!
  • 버전 간 수정 사항을 비교해 보고 누가 어떤 작업을 했는지 파악하기 용이하다. 따라서 문제 해결도 편해진다.

Git의 파일 관리 시스템 특징

Git 파일 관리 시스템

  • 데이터를 파일 시스템 스냅샷의 연속으로 취급한다.

    스냅샷(snapshot)
    - In computer systems, a snapshot is the state of a system at a particular point in time. (Wikipedia)
    - A snapshot, as the name implies, is a point-in-time copy of the filesystem as it existed at the moment of the snapshot. (https://csguide.cs.princeton.edu/storage/snapshots)
    → 즉 특정 시점의 컴퓨터 파일 시스템 상태를 복사한 것을 의미한다.

  • 파일에 변경 사항이 없으면 성능을 위해 새로 파일을 저장하지 않는다.

  • 데이터를 저장하기 전에 항상 체크섬을 구해 데이터를 관리한다.

    체크섬(checksum)
    - a digit representing the sum of the correct digits in a piece of stored or transmitted digital data, against which later comparisons can be made to detect errors in the data. (Oxford Languages)
    → CS 개념이라 여기서는 체크섬이란 저장되거나 전달 받은 데이터에 에러가 있는지 확인하기 위해 사용하는 숫자라는 정도만 알아두자!

  • 해시를 이용해 40자 길이의 16진수 문자열로 체크섬을 구하는데, Git은 이 해시로 파일을 식별하기 때문에 Git을 쓰다 보면 종종 볼 수 있다.
    - 해시 예: 24b9da6552252987aa493b52f8696cd6d3b00373

  • Git에서는 일반적으로 데이터베이스에 데이터를 추가하기만 한다. 즉 이미 올라간 데이터를 삭제하기 어렵다. 물론 Git도 커밋하지 않으면 변경사항을 잃어버릴 수 있다. 하지만 커밋하고 나면 데이터를 잃어버리기 어렵다.

  • Git에서 이미 실행한 것을 되돌리는 방법을 포함하고 있는 링크 => 되돌리기

Local, Remote

  • 말 그대로 이해하면 기억하기 쉽다.
    local : 현지, remote : 원격
  • 현재 자신이 작업하고 있는 환경인 로컬 저장소(local)와 서버에 있는 원격 저장소(remote)
  • 로컬에서 작업한 것을 원격저장소로 보내줘야(push) 변경사항이 서버에 반영된다.

Git의 파일 상태 관리

  • Git은 파일을 세 가지 상태로 관리한다.
    • Committed : 데이터가 local DB에 안전하게 저장 완료(Git 디렉토리에 변경사항을 commit 완료한 상태)
    • Modified : 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 말한다.(수정했지만, 아직 Staging Area에 추가하지 않음)
    • Staged : 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미한다.(파일을 수정하고 Staging Area에 추가)
      1. 워킹 트리에서 파일 수정
      2. Staging Area에 파일을 Stage 해서 커밋할 스냅샷 만들기
      3. Staging Area에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장
  • 커밋하면 Git은 예전 커밋을 가리키는 커밋 포인터가 있어 현재 커밋이 어떤 예전의 커밋을 기준으로 변한 것인지 알 수 있다.


CLI vs GUI

  • CLI(Command Line Interface) : 텍스트 입출력으로만 컴퓨터와 소통하는 도구.
    • Mac의 Terminal, Windows의 CMD나 Powershell
  • GUI(Graphic User Interface) : 명령이나 작업을 이해하기 쉽도록 프로젝트 히스토리를 시각화하여 도와주는 도구
    • GitKraken, Github Desktop, SourceTree, ...
  • CLI의 장점 : Git의 모든 명령어를 지원한다.
  • GUI의 장점 : CLI보다 단순하고 사용하기 쉽다.
    → GUI를 쓰고 싶다면 CLI로 연습하다가 GUI를 사용하는 것을 추천!

2. Github?

  • Git으로 관리하는 프로젝트를 올려둘 수 있는 대표적인 Git 호스팅 사이트 중 하나
  • 즉, Git으로 관리하는 프로젝트를 올려둘 수 있는 사이트
  • Github, GitLab, Atlassain 등 다양한 사이트들이 있다.

3. Branch

  • 개발의 주요 줄기를 더럽히지 않으면서 일할 수 있게 분기를 통해 독립적으로 개발을 진행할 수 있는 것이 브랜치!(기존의 코드를 통째로 복사해 와서 작업)
  • Git의 브랜치는 매우 가벼워서 빠르게 브랜치를 생성하고 브랜치 간 이동이 가능한 것이 장점이다.

Git-flow 기준 브랜치들

  • 항상 유지되는 메인 브랜치들
    • main : 배포 가능한 상태(제품으로 출시될 수 있는 브랜치)
    • develop: 다음 출시 버전 개발하는 브랜치(기능 개발 브랜치 병합용)

  • 일정 기간 동안만 유지되는 보조 브랜치들
    • feature: 기능 개발 브랜치
    • release: 이번 출시 버전 준비 브랜치
    • hotfix: 출시 버전에서 발생한 버그 수정하는 브랜치
      (긴급 수정용, main에서 분기하는 브랜치)

4. Git 명령어 - 브랜치 관련

git 저장소 생성하기 - 현재 폴더에 .git 파일 생성됨

git init

github 주소와 연결

git remote add origin [github 주소]

깃허브에 이미 레포가 있다면? => 저장소 복제 및 다운로드
git clone [https: ~~~~ ]

브랜치 생성

git branch [브랜치명]

해당 브랜치로 이동

git checkout [브랜치명]

브랜치를 생성하고 해당 브랜치로 바로 이동

git branch -b [브랜치명]

원하는 브랜치로 이동했는지 확인 - 현재 생성된 브랜치들과 지금 있는 브랜치 위치 표시

git branch

모든 브랜치 확인

git branch -a

파일 및 폴더 add

git add . : 현재 directory 전체 추가, dotfiles(파일명이 .으로 시작하는 애들) 제외
git add * : 현재 directory 전체 추가

  • dotfiles까지 추가하므로 .gitignore에 있는 파일들 처리가 필요하며 이외에도 여러 문제가 있을 수 있다고 한다.

커밋 생성

git commit -m "commit message"

원하는 브랜치로 push하여 원격 서버에 저장

git push origin [브랜치명]

원격 저장소의 변경 내용을 현재 디렉토리로 가져오기

  • pull vs fetch&merge

    • pull은 최신 커밋을 받아온 다음 local과 자동 병합 진행

      • 작업하던 거 다 날아갈 수 있습니다,, 따라서 커밋 필수!

    • fetch는 최신 커밋을 받아온 후 이름 없는 임시 브랜치('FETCH_HEAD'라는 이름으로 체크아웃 가능)로 내려받기만 하고 병합은 하지 않는다. 즉 병합을 하기 위해서는 fetch 후에 merge가 필요하다.
      (그래서 보통 fetch는 merge 전 변경사항을 확인하는 용으로 많이 씁니다)

      → 따라서 fetchmerge가 더 안전하므로 권장하는 방법!

원격 저장소의 변경 내용을 현재 디렉토리로 가져오기

git pull [커밋 가져올 브랜치]

git fetch [커밋 가져올 브랜치]

현재 브랜치에 다른 브랜치 수정사항 병합

git merge [다른 브랜치 이름]

한 브랜치에서 다른 브랜치로 합치는 방법

  • rebase : base를 재설정한다.
    (페이지 하단에 추가 자료 링크 있어요!)

  • merge


변경 내용을 merge 하기 전에 바뀐 내용 비교

git diff [브랜치 이름] [다른 브랜치 이름]
(커밋 내역이나 staged 파일들, 변경 사항 있는지 여부 등 보여줌)

현재 상태 확인

git status
(git add, commit 여부 등을 파악할 수 있으며 어떤 수정사항들이 staged 됐는지 알 수 있다)

전체 로그 확인

git log

브랜치 삭제

git branch -d [브랜치 이름]


5. Git 명령어 - 임시저장

  • pull 받아야 하는데 커밋 안 되어 있을 때, 커밋 없이 브랜치 이동하고 싶을 때 많이 쓴다.

현재 상태 임시 저장

git stash

임시 저장 목록 확인

git stash list

가장 최근 stash 가져오기

git stash apply

git stash apply [stash 이름]

가장 최근 stash 삭제

git stash drop

모든 stash 삭제

git stash clear

다른 브랜치 커밋만 가져올 때

git cherry-pick

  • 커밋은 복제되지만 커밋 해쉬는 새로 생성되므로 유의.


참고 자료

Git Book
(오역이 종종 있어 원문을 기준으로 보는 것을 추천합니다..!)
Git 브랜치의 종류 및 사용법 (5가지)
웹 개발 기초 - Git이란?
주로 사용하는 GitHub 명령어 모음
원격 저장소와 로컬 저장소

rebase 관련 자료
git rebase란?
Git Book-Rebasing(꼭 영문 버전도 확인하기!)
git rebase 옵션 설명

profile
블로그 이전 : https://jimyu-s-record.tistory.com/

0개의 댓글