DevOps/Git&Github

Git & Github 사용법

호르몬 2024. 9. 24. 20:17

다음은 "Coding Apple"의 Git & Github 관련 강의를 듣고 요약 정리한 내용들 입니다.

(Mac OS 기준으로 작성되었음을 알려드립니다.)

 

 

[ Lecture 1 : git 설치법 ]

 

■ Git

파일 변경내역을 보존하고 관리하는 도구

 

■ MacOS

1. Homebrew 다운로드

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

(시키는거 잘 따라하면 됨)

 

2. Terminal

(1) brew install git

(2) git config --global init.defaultBranch main

 

3. Visual Studio Code

(1) shift + cmd + p

(2) Install “code” from VSCode commander 검색 후, 클릭

 

4. Terminal

(1) git config —global core.editor “code —wait” (선택사항)

→ git의 기본 에디터가 Vim + Bash 말고 VSCode로 변경

(2) Git 다운로드 확인

터미널: git —version

 

5. Git 유저 이름 세팅

git config --global user.email “hormonic@github.com

git config --global user.name “hormonic”

 

 

[ Lecture 2 : git add & commit ]

 

■ git init

터미널 작업 폴더 경로에서 git init 을 입력하면 git 이 해당 작업 폴더를 인지

 

■ git add : staging area에 추가

특정 파일 추가 : git add temp.txt

경로 내 변경 파일 전부 추가 : git add .

 

■ git commit : repository에 추가

추가한 파일을 github 레포에 반영

작업 단위 별로 해주는 것이 바람직함 (기능 개발, 수정 등)

 

■ git status

경로에서 어떤 파일이 수정됐는지, 어떤 파일들을 staging 해놨는지 확인 가능

 

■ git log

Commit 한 내역을 확인

cf) 한 줄로만 출력: git log —oneline —all

cf) 브랜치 반영(그래프 형식): —graph 추가

 

 

[ Lecture 3 : git commit diff 쉽게 하는 법 (VSCode) ]

 

■ VSCode Git 기능

(1) + 버튼 : git add

(2) - 버튼 : git add 취소

(3) ✓ 버튼 : git commit (하단에 메세지 입력창 있음)

 

■ git diff (잘 사용 안함 -> git difftool)

최근 commit 과 현재 파일의 차이점 확인 가능

(스크롤: j, k  /  나가기: q)

 

■ git difftool

git diff 개선 버전

 

■ git difftool {COMMIT_ID}

git log 를 통해서 커밋 아이디를 확인하고 비교해볼 수 있음

 

■ git difftool {COMMIT_ID1} {COMMIT_ID2}

1과 2를 비교 가능

 

■ Extension 활용

git graph 같은 확장 프로그램 다운로드 하면 Vim 이 아니라 더 나은 GUI 로 git log 및 git diff 손쉽게 확인 가능

 

 

[ Lecture 4 : git branch 만들기 ]

 

■ 브랜치 만들기

git branch jm

→ jm 이라는 브랜치 생성

 

■ 브랜치 전환

git switch jm 또는 git checkout jm

 

■ 브랜치 합치기

기준이 되는 브랜치에서 git merge {BRANCH_NAME} 선언

cf) conflict 안나게 주의! (여러 브랜치에서 동일한 코드라인을 다르게 수정할 시, 충돌 일어남)

 

 

[ Lecture 5 : 다양한 git merge 방법 ]

 

■ git merge 방법

● 3-way

                — commit2-1 —

commit2 — commit3 —— commit4

 

● fast-forward

                — commit2-1 — commit3

commit2 —

 

● rebase

3-way merge → fast-forward merge 로 변경

 

*사용 이유

간단하고 짧은 브랜치들에 적용하면 git log & history 출력 시 깔끔해짐 but conflict 많이 발생

 

*사용 방법

(1) ‘새로운 브랜치’에서 git rebase {MAIN_BRANCH_NAME}

(2) 메인 브랜치로 이동 후, git merge {NEW_BRANCH_NAME}

 

● squash

서브 브랜치들의 커밋로그가 메인 브랜치 로그에 합쳐지지 않도록 연결고리를 끊고 내용만 합친 커밋을 생성

 

*사용 방법

Git merge --squash {BRANCH_NAME}

 

■ 브랜치 삭제

git branch -d {BRANCH_NAME}

cf) merge 안한 브랜치 삭제

git branch -D {BRANCH NAME}

 

 

[ Lecture 6 : git revert, reset, restore ]

 

■ git 은 버전 관리 프로그램이기 때문에 파일 복구, commit 복구, 과거 이동 가능

 

■ git restore

 

● 최근 커밋으로 복구: git restore {FILE_NAME}

 

● 최근 커밋 시점으로 복구: git restore {FILE_NAME}

 

● 특정 커밋 시점으로 복구: git restore --source {COMMIT_ID} {FINE_NAME}

 

● staging 취소: git restore --staged {FILE_NAME}

 

■ git revert

‘특정 커밋에서 작업한 내용들’을 제거한 새로운 커밋 생성

git revert {COMMIT_ID}

→ Vim 에디터에서 커밋 메세지 입력 (i, :wq)

cf) commit 여러개 취소 가능

git revert {COMMIT_ID1} {COMMIT_ID2} …

cf) 최근 commit 취소 가능

git revert HEAD

cf) Merge 로 생성된 Commit 도 취소 가능

 

■ git reset (협업 시, 사용 지양)

과거 특정 커밋 시점으로 되돌리기

(1) 리셋 - 변동사항 지우고 스테이징도 안함

git reset--hard {COMMIT_ID}

(2) 리셋인데 변동사항 지우지 말고 스테이징 함

git reset --soft {COMMIT_ID} 

(3) 리셋인데 변동사항 지우지 말고 unstage 함

git reset —mixed {COMMIT_ID}

 

 

[ Lecture 7 : git push ]

 

■ 로컬 → 원격 저장소 백업

(1) 로컬 저장소 repository 로 등록

로컬 저장소 경로에서 git init

(2) 메인 브랜치명 변경

git branch -M main

(3) 파일 staging

git add .

(4) repository에 추가

git commit -m “msg”

(5) 원격 저장소 추가

git remote add {ALIAS} {REPO_URL}

(6) 원격 저장소에 로컬 저장소 데이터 백업

git push {ALIAS} main

(-u 옵션 붙히고 한 번 커밋하면 원격 저장소 주소를 기억해서 다음부터는 git push만 쳐도 됨)

 

cf) 레포지토리 팀원 추가

Repository - Settings - Access - Collaborators - Add people

 

 

[ Lecture 8 : git clone, pull ]

 

■ git clone {REPO_URL}

원격 저장소 소스코드 받기

 

■ git push 정책

원격 레포지토리에 변동사항이 있을 경우(팀원이 push 해놓은 경우 등), pull 한 다음에 push 할 수 있음

→ 원격 저장소 최신 내용이 로컬 저장소에 있을 때만 git push 가능

 

■ git pull {REPO_URL} {BRANCH_NAME}

로컬 저장소에 원격 저장소 내용을 동기화

git pull = git fetch + git merge (conflict 발생 가능)

  • git fetch : 원격 저장소 신규 commit 가져오기
  • git merge : 해당 브랜치에 합치기

 

 

[ Lecture 9 : branch로 협업 (pull request) ]

 

■ 브랜치 협업

branch 만들어서 개발하고 merge 하는게 바람직함

 

■ git push {ALIAS} {BRANCH_NAME}

로컬 환경에서 브랜치 만들고 원격에도 새로운 브랜치로 push 하기

 

■ Pull requests : Merge 요청

Pull requests - New pull request - base & compare 선택 - (Commit 내역 확인) - Create pull request - (공동 작업자 모두 검토 및 댓글 남길 수 있음)

 

cf) Conflict가 났을 경우, Merge pull request 버튼이 비활성화 되고 Resolve conflicts 버튼이 생김

→ 클릭해서 확인 및 수정하고 'Mark as resolved' - 'Commit merge' 버튼 클릭

 

■ Merge pull request 종류 선택 가능

(1) Create merge commit

새로운 merge commit을 하나 생성해주는 3-way merge를 실행

- main 브랜치 조회시 합쳐진 브랜치의 commit 내역도 전부 나옴  

- 터미널에 git log --oneline --graph 해보면 합쳐진 브랜치도 그림으로 나옴 

- Commit 내역이 많으면 복잡하고 더러워보일 수 있음

 

(2) Squash and merge

- 합쳐질 브랜치의 commit 내역을 하나로 합쳐서 main 브랜치에 신규 commit을 생성

- git log --oneline --graph 해보면 합쳐진 브랜치 안나옴 

- commit을 하나로 합쳐서 main 브랜치로 순간이동 시켜주는 행위라 로그가 깔끔함

 

(3) Rebase and merge

- 합쳐질 브랜치를 main 브랜치 최신 commit으로 rebase하고나서 fast-forward merge 비슷한걸 함

- 결과는 squash and merge와 비슷한데 합쳐질 브랜치의 commit 내역이 전부 보존

 

 

[ Lecture 10 : git flow / trunk-based 브랜치 전략 ]

 

■ GitFLow 전략

main, develop, feature, release, hotfix

 

■ Trunk-based 전략

  • 브랜치 하나만 잘 관리
  • feature 브랜치만 만들어서 개발하고 main 브랜치에 병함
  • CI/CD 방식으로 개발하는 곳들도 trunk-based 개발 방식을 적용

 

 

[ Lecture 11 : git stash : 코드 잠깐 보관하기 ]

 

■ git stash

임시 보관함에 최근 커밋 이후 변경 내역을 보관

(staging 안해놓은 새로운 파일은 stash 안됨)

  • 코드를 주석처리하는 것과 용도가 비슷하지만 commit에 반영되기 때문에 주석처리한 내용 커밋하기 싫을 때 git stash 사용하면 유용
  • 새로운 임시 브랜치 만들어서 보관하는 것과 다를게 없음

 

cf) 메모도 가능 : git stash save "msg"

 

■ stash 관련 명령어

  • git stash list : stash 한 것들 목록으로 확인
  • git stash pop : 가장 최근에 보관했던 코드부터 불러옴
  • git stash drop {INDEX_NUM} : 특정 stash 삭제
  • git stash clear : 모든 stash 삭제
  • git stash -p : 일부 코드만 stash (파일을 순회하면서 stash 할 것인지 결정)

 

반응형