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 할 것인지 결정)