* 이 글은 패스트캠퍼스: 백엔드 개발 부트캠프 과정 5기 git/github 특강 (강민철 강사님)을 듣고 정리한 내용입니다.


git 이란?

형상 관리 도구 (Configuration Management Tool) 즉, 버전 관리 도구(시스템)이라고 할 수 있다.
버전 = 유의미한 변화가 결과물로 나온 것

깃을 사용하면...

  • 변경 내역들을 기억하며
  • 필요하다면 작업을 되돌리며
  • 여러명의 코드를 쉽게 나누고 합치며
    개발할 수 있다.

git이 관리하는 세 개의 공간

  • 작업 디렉토리(working directory)
    : 버전 관리의 대상이 위치하는 공간 (.git 파일이 있는 디렉토리)

  • 스테이지(index)
    : 다음 버전이 될 후보가 올라가는 공간

  • 저장소(repository)
    : 버전이 만들어지고 관리되는 공간

하나의 버전이 만들어지는 과정

  1. 작업 디렉토리 내에서 변경 사항 생성
  2. 스테이지로 add
  3. 저장소로 commit

git 명령어 정리

버전 생성

💡 .gitignore 파일의 사용

add 할 파일이 많은데 add 제외 할 파일도 존재한다면...?
작업 디렉토리에 .gitignore 파일을 생성하여 제외 할 파일명을 작성한 후
git add . 를 수행한다.

커밋 목록 조회

작업 내역 비교

자세히 설명하면...

  • 변경사항이 발생한 후 아무 git 명령도 하지 않았을 때 -> git diff
  • 발생한 변경사항을 git add 명령으로 스테이지에 올렸을 때 -> git diff --staged
  • 커밋까지 완료 했을 때 -> git diff <커밋1> <커밋2>

⚠️작업 되돌리기

revert

: 버전을 되돌린 새 버전 만들기

reset

: 버전을 완전히 되돌리기
reset은 지금까지의 작업 내역에 영향을 끼친다!

  • soft reset : 커밋한 사실을 되돌리기(commit 내역이 사라짐)
  • mixed reset: 스테이지에 올린 사실을 되돌리기(add 내역이 사라짐)
  • hard reset: 작업 디렉토리에서 발생한 변경사항을 되돌리기(수정 내역이 사라짐)

* 주의

revert의 <취소할 커밋>과 reset의 <되돌아갈 커밋>을 혼동하면 안된다!

ex) 커밋1 - 커밋2 - 커밋3 이 있을 때
git revert 커밋3 => 커밋3을 취소한 커밋4가 생성=> 결과: 커밋1 - 커밋2 - 커밋3 - 커밋4
git reset 커밋2 => 커밋2로 되돌아가기 => 결과: 커밋1 - 커밋2

작업 임시 저장

  • stash는 후입선출 구조이다.

브랜치

브랜치는 버전을 여러 개의 흐름으로 관리하는 방법

브랜치를 사용하는 이유

  1. 협업 시 편리하다
    브랜치가 없다면...
    • 서로의 작업과 관련 없는 부분이나 같은 코드를 다르게 수정한 부분 혼재
    • 일일이 합쳐주어야 한다.
    • 서로의 코드를 합치다가 실수가 생길 수 있다.
  2. 분기를 나눠 요구사항을 적용할 수 있다.
    • 같은 버전에 대한 요구 사항이 다른 경우? -> 브랜치를 나눠 각각 반영 후 제공 가능

브랜치로 버전의 분기를 관리하는 방법

  1. 브랜치를 나눈다
  2. 각자의 브랜치에서 작업한다.
  3. (필요하다면) 나눈 브랜치를 합친다.

브랜치의 이름

최초의 브랜치: master(main)
브랜치 이름은 그 브랜치가 어떤 목적을 가지는지 명시해 주는것이 좋다.

* 병합의 종류
1. 빨리감기 병합(fast-forward merge)

  • 변함이 없던 브랜치가 마치 빨리감기하듯 내용이 업데이트되는 병합

  • ex) foo 브랜치에서 커밋이 쌓이는 동안 master 브랜치에서는 변함이 없었다.
    이 때, master 브랜치로 foo브랜치를 병합시키면?

  1. 일반적인 병합
  • 서로 변함이 있던 두 브랜치를 병합하는 경우
  • 이 때는 두 브랜치를 병합시킨 새 커밋이 생긴다(합쳐진 곳에)

충돌 해결하기

같은 부분을 다르게 수정한 경우 병합 시 충돌(conflict)이 발생한다.
충돌이 발생하면 깃이 충돌이 생긴 부분을 표시해주며,
이를 확인 후 최종 저장할 내용으로 직접 수정해주면 된다.

아래와 같은 형식으로 표시해준다.
<<<<<<< HEAD
현재 브랜치에 적힌 내용

=======
<브랜치A>에 적힌 내용

>>>>>>> <브랜치A>

해결 순서
1. 충돌을 해결한다(어떤 브랜치의 내용을 반영할지 직접 선별한다)
2. 다시 커밋(add, commit)한다.

커밋 수정하기

아래의 변경 옵션을 선택하여 해당 커밋 앞에 작성 후 저장하면 수정 창으로 이동한다.

자주 쓰이는 옵션

  • pick: 바꾸지 않는다
  • reword: 커밋 메세지만 변경한다
  • edit: 커밋한 변경 내용을 수정한다


github 명령어 정리

원격 저장소 브랜치 이름

  • main 브랜치 == master 브랜치
  • origin == 원격 저장소에 붙은 일종의 별명
  • origin/Head == 원격 저장소 origin의 HEAD
  • origin/main == 원격 저장소 origin의 main

클론(clone): 원격 저장소 복제

git clone <원격저장소 주소> (깃허브 상에 존재하는) 원격 저장소를 로컬(클론 받은 컴퓨터)로 복제

푸시(push): 원격 저장소에 밀어넣기

기본 명령어

git push <원격저장소> <푸시 할 브랜치>

초기 푸시 명렁어

git remote add origin <원격저장소 주소>
git branch -M main
git push -u origin main
  • git remote add origin <원격저장소 주소> : 해당 주소의 원격저장소를 origin이라는 이름으로 로컬에 등록
  • git branch -M main : 브랜치의 이름을 main으로 변경
  • git push -u origin main : origin이라는 저장소에 main 브랜치에 쌓인 내용을 푸시
    -u 옵션을 적용하면, 이후 git push만 적어도 git push origin main으로 인식함

패치(fetch): 원격 저장소를 일단 가져만 오기

원격 저장소의 변경사항을 가져오되 병합하진 않는 방식
git fetch <원격저장소> <패치 할 브랜치>

패치한 내용을 보려면?
git checkout FETCH_HEAD

풀(pull): 원격 저장소를 가져와 합치기

패치와 병합을 동시에 하는 방식
git pull <원격저장소> <풀 할 브랜치>


협업 실습: PR(Pull Request) 보내기

일반적으로 내가 소유하지 않은 원격 저장소에 푸시할 수 없다.
때문에, 원격 저장소의 오너에게 pull 요청을 보내 해당 저장소에 내 코드가 합쳐지도록 협업한다.

풀 리쿼스트 방법
1. 기여하려는 저장소를 본인 계정으로 포크(Fork)하기 (내 계정으로 복사본을 가져오는 행위임)
2. 포크한 저장소를 로컬에 클론하기
3. 브랜치 생성 후 작업하기
4. 작업한 브랜치 푸시하기
5. 풀 리퀘스트 보내기

profile
새싹 개발자

0개의 댓글