TIL 5/9

·2024년 5월 10일

팀원분들, 다른 캠프원분들께 깃 브랜치 관련 질문을 많이 받고 종종 고쳐주고 있어서 해당 내용을 정리해보려고 한다.

Git 구조

내 파일의 모든 변화를 기록하는 형상 관리 도구(분산형 버전 관리 시스템)로 과거 작업 내용과 현재 작업내용, 변경점을 확인 할 수 있도록 만들어졌음.


work tree(workspace) 에서 작업을 하고 add 과정을 거쳐 stage(index)에 파일 상태를 기록(staging)하고, 모여진 파일 상태 기록들을 commit하여 local repository에 저장한다.

그리고 local repository의 기록들을 push하여 remote repository로 공유한다.

Git의 장점

  • 하나의 파일을 여러명이 동시 작업하는 병렬개발 가능
  • 프로젝트 복제 없이 여러 버전의 파일을 한번에 관리 가능 (Git 미사용 : 각 버전의 프로젝트별 공통되는 코드를 일일히 수정, Git 사용시 : 한개의 프로젝트 코드만 수정 → 모든 버전에 적용)
  • 분산 관리 이므로 인터넷이 연결되지 않은곳에서 개발진행 가능하며 중앙 저장소가 날아가도 원상복구 가능(원하는 시점의 commit이력을 찾아서 불러온다)
  • 깃(Git)을 위한 버전관리로 체계적 개발이 가능, 프로그램 배포, 패치 과정이 간단해짐

Git 용어 정리

  • Repository(저장소) - 저장소를 의미하며 히스토리, 태그, 소스의 branch에 따라 버전을 저장. 저장소를 통해 작업자가 변경한 모든 히스토리 확인 가능
    • Remote Repository(원격 저장소) - 파일이 원격 저장소 전용 서버에서 관리되며 여러 사람이 함께 공유하기 위한 저장소.
    • Local Repository(로컬 저장소) - 내 PC에 파일이 저장되는 개인 전용 저장소
  • Working Tree - 작업중인 폴더(프로젝트 디렉토리)
  • Staging Area - 저장소에 커밋하기 전에 준비하는 위치(index)
  • Commit - 현재 변경된 작업 상태를 점검을 마치면 확정하고 저장소에 저장하는 작업
  • Head - 현재 작업중인 Branch를 가리킴(특정 브랜치의 마지막 커밋에 대한 포인터)
  • *Branch - 독립적인 작업을 진핼할때 생성 각 브랜치간의 작업에 영향을 받지않음, 작업을 할 때에 현재 상태를 복사하여 Branch에서 작업을 한 후 완전하다 싶을때 Merge를 하여 작업.
  • *Merge - 다른 Branch의 내용을 현재 Branch로 가져와 합치는 작업을 의미.

단어 뜻 : Branch - 나뭇가지 / *Merge - 병합

Git 주요 명령어

  • git *init : 깃 저장소 초기화 - 저장소나 디렉토리 안에서 이 명령을 실행하기 전까진 일반 폴더이다. 이것을 입력한 후에 추가적인 깃 명령어들을 줄 수 있다.
  • git help : 깃 명령어 목록 - 커맨드라인에 ‘git help’입력시 가장 많이 사용하는 21개의 깃 명령어가 나타나며 더 자세히 보려면 ‘git help init’ 같은 방식으로 입력하여 조회할수 있음
  • git status : 저장소 상태 체크 - 어떤 파일이 저장소 안에 있는지, 커밋이 필요한 변경사항의 유무, 현재 저장소의 어떤 브랜치에서 작업중인지 등을 볼 수 있음.
  • git clone : 원격 저장소의 저장소를 내 local에서 이용할 수 있게 그대로 복사해 가져온다.
  • git add : 다음 commit을 기록할 때까지 변경분을 모아놓기 위해 사용(work tree에서 index에 변경된 파일들을 추가하여 모아둠)
    • git add . - 그동안 한거 다 추가
  • git commit : 깃이 유의미한 수정 작업이 끝났을때 마침을 알리는 작업(로컬 저장소에 기록)
    • git commit -m “메세지” : 메세지 달아서 커밋 가능(이름 달기)
  • git push : 로컬 브랜치(local branch)를 원격 저장소(remote repository)로 push할 때 사용 하는 기본 명령어
    • git push (origin master) : 42에서 푸시할땐 항상 이거로! 뒤에 붙은건 권한 설정.
  • git pull : 저장소의 변경된 내용을 로컬저장소에 적용하는 작업
  • git log : 커밋 내역을 확인해보고 싶을 때 사용하는 명령어
  • git branch : branch를 생성하여 독립적인 공간을 만듬.
  • git checkout : 원하는 브랜치로 자유롭게 이동할 수 있음.
  • git merge : 브랜치에서 작업을 끝내고, 모든 협업자가 볼 수 있는 master브랜치로 병합 할 수 있음
    단어 뜻 : init - 초기화

보통 깃에 푸쉬하는 법

  1. git init → .git 생성
  2. git remote add origin (주소) - 주소에 깃 연결
  3. git status - 상태 확인
  4. git add (올릴 파일)
  5. git commit -m “fuck42” → 깃에 올라갈 애들 알려줌(삭제 후 커밋하면 지워진것도 반영)
  6. git push origin master - 깃에 올림
  7. git log - 잘 올라갔나 확인 - 빨간 글씨 origin / main이 맨 위에 있어야 거기까지 푸쉬 잘 된거.
  8. git clone (주소) (받을 폴더이름) - 깃에 있는거 어떤 폴더로 다 받을거임.

Github

분산 버전 관리 툴인 깃(Git)을 사용하는 프로젝트를 지원하는 웹호스팅 서비스.

PC에서 깃(Git) 히스토리를 가져와서 깃허브 웹사이트에 푸쉬하고, 상대방은 이를 가져와서 변화기록을 볼 수 있음

.gitignore

Git 버전 관리에서 제외할 파일 목록을 지정하는 파일. 보안상 위험성이 있는 파일, 프로젝트와 관계없는 파일, 용량이 너무 커서 제외해야 하는 파일등을 .gitignore에 추가하여 제외시킨다.


팀플에서 자주 발생하는 문제점과 해결방법

위까지가 깃에 대해 간단하게 정리한 것이고, 자주 질문받는 것에 대해 정리해보겠다.

보통 각자 본인 이름으로 브랜치를 파고, 본인 레포지토리에 본인의 작업물을 올리고 메인에 PR(PULL REQUEST), MERGE를 하는 것이 일반적이다.

하지만 깃에 익숙하지 않은 분들이 가끔 메인에다 푸쉬를 해버리거나, 로컬 main, branch을 잘 못하는 경우들이 종종 보인다.

우선 처음 프로젝트를 시작할 때, 깃허브에 본인 이름으로 원격 브랜치를 파고, 깃허브 메인 브랜치(원격 메인 브랜치)에서 모두 pull을 하고 시작해야 한다.
겹치는 부분이 하나도 없다면 merge가 되지 않기 때문이다.
공통적인 기초 뼈대를 먼저 만들어 main에 넣고, 그걸 본인의 로컬 브랜치에 pull을 하고 작업을 시작해야한다.

git pull origin main

처음에 로컬에는 main(혹은 master)브랜치 밖에 존재하지 않는다. 확실히 브랜치 간 구분을 두고, 깃허브 main브랜치에 푸쉬하는 대참사를 막기위해

git branch 본인 브랜치 이름

으로 로컬 브랜치를 만들어주고,

git checkout 본인 브랜치 이름

으로 해당 브랜치로 이동해준다. 그리고 해당 브랜치에서 다시 main을 pull하고 작업을 한다. 이후 add, commit, 'push origin 본인 브랜치 이름'을 통해 깃허브 원격 본인 브랜치에 push를 한다.

git add .
git commit -m "커밋 메세지"
git push origin 본인 브랜치 이름'

이후 깃허브에서 pull request를 통해 main브랜치에 merge하면 된다.

그리고 누군가 새롭게 main브랜치에 merge를 했다면 팀원들에게 merge를 새롭게 했으니 main을 pull 받아달라고 말하는 것이 좋다.

이 때 pull 받는 것을 로컬 main 브랜치에 받고, git checkout 본인 브랜치, git merge main 을 통해 팀원의 작업물을 본인 작업물에 merge하고 마저 작업하는 것이 나중에 충돌이 나지 않도록 할 수 있다.

git pull origin main (로컬 메인 브랜치에서!)
git checkout 본인 브랜치 이름
git merge main   //작업하던 로컬 내 브랜치에 새로 pull 받은 main 브랜치를 합침

그리고 checkout을 할 때 commit을 통해 변경사항을 영구 저장하거나, stash를 통해 잠깐 일시저장한 후 넘어갈 수 있다.

profile
응애개발자

0개의 댓글