IT/공부 정리

[Git] 깃 던전 공략법

rinix_x 2024. 9. 9. 11:51

 

프로그래머스에서 무료 강의가 있길래 한번 들어보는 김에 정리 하고자 한다.

 

보니까 따로 유튜브로 제공하고 있었다

 

git이나 github는 협업하면서 사용은 해봤지만, 제대로 사용한 적이 없는 거 같아서 이렇게 정리를해본다.

 

git은 너무 어렵고 기능이 많고, 왜 쓰는지 언제 쓰는지 모르는 경우가 많다.

먼저 가장 기본이 되는 명령어로는

git init : git 생성하기
git clone git_path : 코드 가져오기
git checkout branch_name : 브랜치 선택하기
git checkout -t remote_path/branch_name : 원격 브랜치 선택하기
git branch branch_name : 브랜치 생성하기
git branch -r : 원격 브랜치 목록보기
git branch -a : 로컬 브랜치 목록보기

 

WHY GIT?

* 버전관리

 - 결과물에 대한 기록

 - 이전 버전으로 돌아가기 쉬움

 - 버전관리가 잘되었다면, 돌아가는데에 시간을 아낄 수 있음

 

* 협업도구

 - 같이 일하는데 사용되는 도구

 - 매번 저장해서 보내지 않아도 버전관리가 잘되어 있음

 - 같이, 나눠서 일하기 좋음

 

 

명령어 입력방법

1. CLI : Command Line Interface

-  터미널에 직접 명령어를 입력

2. GUI : Graphic User Interface

- 마우스로 클릭해서 명령

 

 

GIT CLONE

먼저 사용하고 싶은 프로젝트의 깃허브 주소를 들어갑니다.

https://github.com/M1zz/TheFirstCommit

강의에서 제공하는 깃허브 주소 입니다. 참고일뿐 각자 만든, 원하는 저장소로 들어가시면 됩니다.

 

사이트에 들어가서 오른쪽 상단에 있는 Fork를 해줍니다. 

클릭하면 오른쪽 이미지 처럼 Create a new fork페이지가 등장하는데,

원하는 Repositoy name 을 지어주고,

Copy the ~ 부분은 branch 없이 main 이나 master부분을 갖고와야하니 check를 해줍니다. 그러고 create fork를 클릭해줍니다.

 

그렇게 하면 끝납니다.

 

 

그러면 이제 제 페이지에 아래 페이지처럼 내용그대로 제 repository에서 볼 수 있게 됩니다.

 

그러고 나서 Git clone을 하여 프로젝트를 사용하면 됩니다.

code를 클릭한 후에 복사를 합니다.

해당 강의에서는 GitKraken Client를 사용하여 사용해주는 보통 터미널을 사용하면 원하는 저장 파일 위치에서

git clone 을 쓰고 ctrl+shift+v를 해주면 복사했던 정보가 붙여넣기가 됩니다.

git clone https://github.com/dPfls1211/TheFirstCommit.git

 

터미널이 없다면 vsc에서 새파일을 열어 Terminal탭에서 new terminal을 하고, 거기서 해당 코드를 사용하면 됩니다

 

COMMIT, PUSH, PULL

commit : 저장

push : 클라우드(저장소) 업로드

pull : 클라우드(저장소)로 부터 다운로드

 

먼저 기본으로는 email과 gitID를 입력해야합니다.

보통은 아래처럼 입력해줍니다.

$ git config --global user.name "myname"
$ git config --global user.email "myname@email.com"

그냥 git config user.name "name" 이런 식으로 입력해도되지만 저장소를 별도로 관리할 필요가 없을 때에는 --global을 붙여서 로그인을 해준다고 생각하시면 됩니다.

git add -A
git commit -m "commit"
git push origin main

 

보통은 add -A를 통해 변한 모든걸 추가해주고 commit으로 설명을 써주고, push를 하여 저장소에 올리면 됩니다.

commit을 할때에 특정 용어를 쓰면서 규칙을 쓰는 곳도 있으니 상황에 따라 내용을 작성해주면 될 것 같습니다.

 

BRANCH, MERGE

branch : 나뭇가지, 

merge : 병합, 합쳐짐

보통 협업 할 때 사용하며

git branch yerin  //branch이름을 yerin으로 사용, 이후 프로젝트 수정

git add -A
git commit -m "commit"
git push origin yerin
git checkout main
git merge yerin
git push origin main
git checkout yerin
git merge main

이런식으로 사용하기도 하는데,

먼저 branch로 가지쳐주고, 프로젝트 진행후에

add -A, commit, push yerin을 통해 변경사항을 올려주고, main이랑 merge를 통해 합쳐주는 건데, 위 코드처럼 쳐도 되고, 페이지에서 pull request를 통해 merge를 하기도 한다.

 

참고로 merge중에 오류가 발생한다면, git pull origin main 을 통해 먼저 main에 대한 데이터를 불러와 합쳐주고 오류난 부분을 수정한 후에 다시 add, commit, push를 입력하여 올려주면 된다.

 

 

 

깃 브랜치 전략

main : 

- 최종수정본

- 안정적

- 커밋이 일어나지 않음

develop :

- pull 받아야하는 브랜치 (개발 시에)

- 여러버그가 존재할 가능성

- feature브랜치를 따야하는 곳

Release : 

- 배포 브랜치

- 버그만 수정하는 곳, 개발 ㄴㄴ

- 개발과 메인에 머지해줘야 함

Feature :

- 개발을 하는데 사용되는 실험실(기능구현) => 개발하다 망하면 버려도 되는 곳

- 브랜치 하나당 기능하나

- 한곳에서 다같이 구현하면 꼬일 수 있어서 쓰는 곳

Hotfix :

- 급하게 수정되어야 하는 이슈

- master까지 갔다가 안정적이지 않다는 걸 알고 수정하는 곳

- 릴리즈와 마찬가지로 데브와 메인에 머지 되어야함

 

 

 

STASH

- 임시 저장을 위한 명령어로, 급하게 브랜치를 바꾸게 될때, 커밋 ->브랜치->커밋 과 같은 반쪽짜리 커밋이 발생한 경우를 방지하기 위함

- 의미없는 커밋 메시지를 만들지않고 여러가지 작업을 임시저장할 수 있음

#원하는 것만 stash
git stash -p 

#새로운 branch에 stash적용
git stash branch "브랜치명"


# 보관되어 있는 stash list 확인
git stash list 

# 개발중이던 소스를 보관
git stash -m '기능 수정중 임시 저장'
 
# -> stash@{0}: On master: 기능 수정중 임시 저장
git stash list 

#명시해서 가져오기(이걸 사용)
git stash pop stash@{0} 

#가져오기
git stash pop 

#삭제하지않고 가져오기
git stash apply 

#특정 stash 삭제
git stash drop stash@{0}  

#모든 stash 삭제
git stash clear 

# 가장 최근 stash를 되돌리는 경우
git stash show -p | git apply --reverse

# 특정 stash를 되돌리는 경우
git stash show -p <STASH_NAME> | git apply --reverse
# * apply한 경우만 가능 pop이나 drop한 경우에는 사용할 수 없다.

 

 

CHERRYPICK

체리픽은 하다가 망했을때, 돌아가기엔 너무 멀 때, 필요한 것만 고를 수 있다. / 브랜치를 버리기엔 필요한 기능이 있을 경우 사용

 => 다른 브랜치에 있는 commit들 중에서 원하는 것만 가져오는 명령어

보통, 작업 브랜치나 배포 브랜치에 안정성이 보장되지 않은 커밋은 제외하고 나머지 커밋을 가져오고 싶은 경우나

hotfix버그를 수정한 코드가 다른 브랜치에 있는데, 다른 브랜치에서 버그 수정 커밋만 가져오고 싶은 경우 사용한다.

 

git커밋에는 그 커밋만 갖고있는 고유한 ID값이 있는데 그걸 이용하면 된다.

git cherry-pick {커밋 ID} ... {커밋 ID}

#master브랜치로 cherry2의 2:cherry-pick커밋을 가져오고 싶다고 할때,
git cherry-pick e1ac4124979w72984294839asdfie21342jf2o
#또는
git cherry-pick e1ac41
#현재 브랜치가 master인 상태에서 사용해야한다.

#충돌난 부분을 해결한 후, 실행하면 마무리 된다.
git cherry-pick --continue
#충돌난 커밋은 제외하고 체리픽한다.
git cherry-pick --skip
#cherrypick 실행전으로 돌아간다.
git cherry-pick --abort

#커밋의 ID를 보는 방법
#커밋 이력 상세조회 최근 커밋이 먼저나오고 스페이스바 누르면 하나씩 보여짐
git log 
#커밋 이력 중 커밋 ID와 타이틀 메시지만 조회
git log --oneline 
#모든 브랜치 커밋이력 조회
git log --oneline --decorate --graph --all 
#모든 브랜치 커밋이력 조회(보기 이쁘게 보여짐)
git log --pretty=oneline --graph --all

 

 

컨플릭트 / 머지

머지는 브랜치를 합치는 것으로, 여러명의 코드가 한곳에 있도록 도와준다.

컨플릭트는 머지하는 중에 발생하는 오류로 볼 수 있다. 보통 충돌날 경우 발생한다.

 

merge할 때 두 버전이 같은 곳을 수정해서 발생했다면, 수동으로 고쳐주어야한다.

git이 두개의 버전을 merge할 때의 결과물을 보여주기 때문에 수동으로 원하는 부분을 가져와 고쳐주면 된다.

 

 

REBASE

결과는 같지만, merge와는 다른 이력관리에 유용한 명령어

두 개의 공통 Base를 가진 브랜치에서 한 브랜치의 Base를 다른 브랜치의 최신 커밋으로 브랜치의 Base를 옮기는 작업

- 공유 브랜치의 최신 변경사항을 즉각 반영할 수 있다.

- rebase는 커밋이력을 남기지 않아 commit history가 깔끔해진다.

git checkout feature
git rebase develop

 

이렇게 사용할 경우, feature의 base를 develop의 최신 commit으로 옮기게 되며 좀 더 깔끔한 그래프를 볼 수 있다.

단점으로, merge는 충돌이 발생하면 한번만 처리하면 되지만, 브랜치의 각각의 commit마다 충돌 처리를 해줘야한다.

 

 

UPSTREAM

다른 개발자의 원격 저장소에 있는 변경사항을 가져오는 기능이다.

#로컬 저장소에 upstream 원격저장소를 추가
git remote add upstream {원격 저장소 URL}
#upstream원격 저장소의 변경사항을 로컬 저장소로 가져옴
git fetch upstream
#가져온 upstream 변경사항을 로컬 브랜치에 병합합니다.
git merge upstrema/{브랜치 이름}
#upstream원격 저장소 설정을 제거
git remote remove upstream

 

충돌이 발생할 수 있으므로 병합 진행전에 변경사항을 잘 확인해야한다.

 

 

 

 

 

 

 

 

 

반응형