Git & Github 사용법

    다음은 "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 할 것인지 결정)

     

    반응형

    댓글