MyB

GIT

2024.03.08

GIT

버전관리,협업에 사용되는툴이다.

GIT에는 여러 종류의 저장 공간이 있는데 이 저장공간을 활용하여 코드를 공유하고 합치고 코드를 다운받고 버전을 변경하는등 다양한 동작을 수행할 수 있다.

GIT의 구조

아래 그림은 GIT에서 특정 명령어 사용시 코드가 어디에 저장 되는지 나타내는 그림이다. 후에 나올 코드와 비교해 가며 살펴보는 것을 추천한다.

Untitled

ReomoteRepository: 팀원간 공유할 때 사용되는 원격 저장소, 깃허브 사이트의 repository를 의미한다.

workspace: 우리가 코딩을 하는 작업환경(컴파일러)

staging(stage area): 어떤 파일을 기록할 지 미리 선별해두는곳

LocalRepository: 파일의 변경사항을 저장해 두는곳

GIT사용형태

GIT에서 하는 행동은 크게 세가지로 나눌 수 있다.

  1. 원격 저장소로 업로드
  2. 팀원간 코드 합치기
  3. 로컬 저장소로 다운로드

각각의 기능에 대해 기술하고 최종적으로 흐름에 따라 기술하겠다. 각 코드들이 어떤 위치로 이동되는지는 그림에 나와 있다.

최초설정

git config --global user.email "신짱구@naver.com"
git config --global user.name "신짱구"

Git을 사용할 폴더에서 터미널을 열고 위와 같은 명령어를 입력한다. 어떤 동작을 했을때 누가 했는지 구분을 하기 위한 설정이다.

원격 저장소로 업로드(커밋 & 푸쉬)

git init
git add 파일명1 파일명2 ~~
git add .
git commit -m "메모"
git push -u 원격저장소주소 올릴로컬브랜치명

위에 있는 그림과 비교하여 각 명령어 사용시 코드가 어디에 저장되는지 확인

  1. git init : 새로운 Git 저장소(repository)를 생성하는 명령어. 코드를 원격 저장소에서 다운받지 않고 처음부터 생성할 시에 사용, 폴더 안에 .git 폴더가 생겼으면 성공

  2. git add 파일명1 파일명2 : 선택된 파일을 stage area로 올리는 용도, 로컬 저장소로 올릴 파일을 선택하는 과정이라고 생각하면 된다.

  3. git add . : 2번과 동일, . 사용시 모든파일을 선택한다는 의미, 보통 .을 사용해서 add . 한다.파일 선별이 필요할 때 파일명을 입력해서 add.

  4. git commit -m “메모” : 선택된 파일의 변경점(코드변경,파일생성,삭제등)을 로컬저장소에 저장한다. 변경의 기준은 이전 커밋 기준, 메모에는 변경점 같은 것을 메모하면 된다.

  5. git push -u 원격저장소주소 올릴로컬브랜치명: 로컬 저장소에 있는 변경점들을 원격저장소에 존재하는 코드에 적용,

    1. 원격저장소 주소는 깃허브 레포지토리에 들어가 초록색 코드버튼을 눌러 확인(후에 자세히 기술)
    2. 브랜치에 대한것은 밑에 기술

    Untitled

위의 과정을 거치면 원격 저장소에 내가 작성, 변경한 것들을 반영할 수 있다.

팀원간 코드 합치기(merge)

브랜치라는 개념이 등장한다. 브랜치란 따로 독립적으로 개발을 할 수 있는 공간을 의미한다. 우리가 수정한 파일을 바로 메인 파일에 적용시 오류가 생길 수 있기 때문에 그런 리스크를 방지하기 위함이다. 아래 그림은 “Git flow”라는 브랜치 사용전략(구조)이다.(아래 그림에서 같은색깔의 다른공간은 commit을 의미한다.)

출처: 코딩애플

출처: 코딩애플

위 그림을 보면 main이라는 브랜치가 기본 메인 브랜치이다. 여기서 우리는 develop이라는 브랜치를 따로 만들고 여기서 작업을 한다. 여기서 작업을 하다가 작업이 다 됐을 경우 develop브랜치와 main브랜치를 병합(merge)한다. 병합 할 경우 main기준으로 develop에서 변경된 사항을 main브랜치에 적용하게 된다. 그런데 만약 main 브랜치와 develope 브랜치에서 같은 코드에 대한 변경이 생겼다면 충돌이 발생하고 이 충돌은 병합과정에서 어떻게 수정할 지 컴파일러 혹은 깃허브 사이트에 코드가 뜨는데 하고자 하는 코드대로 수정후 다시 add, commit후 merge를 진행하면 된다. 다른 브랜치들에 대해선 후술한다.

git branch 브랜치명
git switch 브랜치명
git merge 합칠브랜치명
git branch -d 브랜치명
git branch -D 브랜치명
git branch -M 브랜치명
  1. git branch 브랜치명:브랜치를 생성한다.
  2. git switch 브랜치명 : 해당 브랜치로 이동하여 작업한다.
  3. git merge 합칠브랜치명 : 보통 main이 아닌 다른 브랜치에서 작업상황을 수정 후 메인 브랜치에서 다른 브랜치를 merge한다. 따라서 main브랜치에서 합치고 싶은 브랜치명을 입력후 명령어를 실행하면 main브랜치에 다른 브랜치의 변경사항들이 합쳐진다.
  4. git branch -d 브랜치명 : merge가 완료된 브랜치를 삭제한다.
  5. git branch -D 브랜치명 : merge가 안된 브랜치를 삭제한다.
  6. git branch -M 브랜치명 : 해당 브랜치를 기본 브랜치를 변경한다. 기본값은 main브랜치이다.

Pull request

Pull request는 터미널에서 진행하는 것이 아닌 깃허브 사이트에서 진행하는 것 이다. 깃허브 사이트에 들어가 내가 지금까지 코드를 업로드한 repository에 들어가면 왼쪽 위에 pull request를 볼 수 있다.

Untitled

들어가면 초록색 버튼으로 new pull request를 볼 수 있고 버튼을 누르면 아래와 같은 화면이 뜬다.

Untitled

잘 보면 브랜치를 선택하라고 나온다. pull requesr는 gitgub사이트에서 진행하는 merge라고 생각하면 된다. 내가 생성한 repository는 위 처럼 보이지만 다른 사람의 코드를 fork해온것 이라면 pull request를 통해서 fork를 해온 곳에 내 코드를 merge요청을 보낼 수 있다.

Create pull request를 누른 후 초록색 버튼을 계속 누르다보면 Merge pull request라고 뜬다. 이 버튼을 누르게 되면 최종적으로 코드가 합쳐지게 된다.

  • fork는 코드를 찍어서 가져온다는 의미로 파일을 똑같이 가져오는데 가져온 파일과 원래 파일이 연결되어 있어서 위에서 언급한 것 처럼 Pull requesr를 통해 merge 요청을 보낼 수 있다.

로컬 저장소로 다운로드(pull & clone)

원격 저장소에서 코드 복사(clone)하기

git clone 원격저장소주소 //깃허브에서 공동 작업자 설정 필요

원격 저장소에 있는 코드를 그대로 복사해서 현재 폴더에 붙여넣는다. 보통 프로젝트를 처음시작할 때 사용한다. 폴더에 프로젝트 코드들과 . git 폴더가 있으면 성공

원격 저장소에 있는 변경사항들을 내 코드와 합치기(pull)

git pull 원격저장소주소 브랜치명

git clone과 무슨 차이가 있겠냐 싶을 수 있다. 클론은 원격 저장소에 있는 코드를 내 폴더로 그대로 가져오는 것이고 git pull은 현재 내 코드와 원격 저장소 코드를 합치는것(merge)이다. 이때 충돌을 방지하기 위해 원격저장소에 현재까지 한 상황을 commit&push를 하고 pull을 해야한다.

협업시 흐름

  1. clone 하여 코드 가져오기 & init으로 저장소 생성
  2. 코드 작업
  3. 작업한 코드 add&commit
  4. 원격 저장소로 push(기본 브랜치에 코드가 반영된다)
  5. 원격 저장소에 있는 코드에 변경점 발생시 pull
    1. 이때 원격 저장소에 있는 변경사항 대상과 내 코드에 있는 변경사항의 대상이 동일하다면 충돌 발생(이때 내 코드의 변경사항은 이전 커밋을 기준으로 한다.)
    2. 충돌사항이 없다면 내 코드에 반영이 된다.

보통 위와 같은 흐름으로 진행이 된다. 협업시 브랜치관련 사항은 깃허브 사이트에서 하는걸 권장한다. 현재 내가 작업하는 공간은 메인 브랜치가 아닌 서브 브랜치이여야 한다. 이 또한 깃허브에서 설정을 하고 메인 브랜치로 병합(merge)하는것도 깃허브 사이트에서 진행한다. 깃허브 사이트에서 pullrequest를 진행하면 된다. 다른 브랜치에 merge 요청을 보내는것이다. 또한 협업시 팀의 Organization이 존재하고 나의 repository에 해당코드를 fork 해오고 나의 repository의 서브 브랜치에서 작업을 하게 되는데 최종적으로 팀의 organization에 merge를 하기 위해서 내 repository의 main브랜치에 pull request를 통해 merge를 진행하고 다시 main브랜치에서 팀의 organization에 pullrequest를 보내 merge를 진행해야 한다. 이 작업은 모두 안전하게 파일을 병합하기 위한 과정이다.

추가적인 명령어

현재 상태확인

  1. git status : 현재 어떤 파일이 add 되었는지 알 수 있음
  2. git log --all --oneline : 현재 어떤 파일이 커밋되어 올라갔는지 알려주는 명령어 = 커밋 내역을 알 수 있다.

스테이징 파일 취소 명령어

  1. git restore --staged 파일명 :

이전 버전의 커밋과의 차이점 확인

  1. git diff : 차이점을 보여주는 기본적인 코드, 사용 잘 안함
  2. git difftool : 차이점을 시각 적으로 보여준다.
  3. git difftool 커밋아이디1 커밋아이디2 : 두 커밋의 차이를 시각적으로 보여준다.

+ 비쥬얼스튜디오 코드 익스텐션 활용하면 더 편하기 때문에 위 코드의 사용은 비추천

깃에서 변수?사용

  1. git remote add 변수명 변수로들어갈내용(Like원격저장소주소) : 변수를 생성한다. 주소같이 긴 문장들을 저장할 때 사용된다.
  2. git push 변수 브랜치명(변수는 관습적으로 origin사용) : 이렇게 push, clone등 주소가 사용되는 부분에 사용하면 된다.
  3. git push -u 변수 브랜치명:u를 사용하면 주소를 기억해서 이 이후로는 git push만 작성하면 된다.

과거로 복구 명령어

  1. git restore 파일명:최근 커밋으로 돌려준다.
  2. git restore --source 커밋id 파일명 : 해당 파일을 커밋id 시점으로 돌려준다.
  3. git restore --staged 파일명 : 파일을 add한것을 취소해준다.
  4. git revert 커밋id : 해당 커밋에서 변경된 내용들만을 삭제하여 커밋을 새로 만들어줌(아이디 여러개 가능)
  5. git revert HEAD : 최근 커밋을 취소하여 새로 커밋을 만들어준다.
  6. git reset --hard 커밋id : 응애 나 아기 커밋.. 모든 상태를 해당 커밋상태로 되돌린다.(협업시엔 사용금지.. 너무 극단적)

브랜치 사용전략

브랜치를 사용하는 다양한 전략이 존재한다.

Git Flow

대표적으로 많이 알려진 전략

Untitled

핫픽스 브랜치 추가(위 그림과 아래 그림은 동일한 구조)

출처: 코딩애플

출처: 코딩애플

  • main 브랜치: 유저배포용
  • develop 브랜치: 개발용
  • feature/~ 브랜치: 특정 기능 개발용
  • release 브랜치: 테스트용
  • hotfix 브랜치: 핫픽스용

흐름

feature/~ 브랜치에서 각각의 새로운 기능을 개발한다. → develop브랜치에 merge → release브랜치에서 테스트 → 문제 없다면 메인 브랜치에 merge → 긴급하게 고쳐야 할 사항이 있다면 핫픽스 브랜치에서 패치후 main브랜치와 develop브랜치에 merge

Trunk-based

출처: 코딩애플

출처: 코딩애플

흐름

추가적인 코드를 작성할 때 새로운 브랜치를 그때그때 생성 → 완성후 main브랜치 merge, merge한 브랜치는 삭제

최근 글