22sook00 logo
SookDev

git 공부 모음 zip

tag
git
deploy
date
Apr 29, 2022
깃은 분산 버전 관리 시스템으로, 빠르고 팀의 규모에 상관없이 잘 동작하도록 설계되었다.

🧟‍♀️ .gitignore

git이 추적하지 않을 디렉토리 및 파일을 명시하기 위해, .gitignore 파일을 생성 후 추적하지 않을 파일을 명시한다.
gitignore.io: git 예시 모음 - https://www.gitignore.io/

작업 도중 .gitignore 파일을 만들었을 경우

깃허브에 올라간 파일들 삭제하기
git rm -r --cached . git add . git commit -m "Add gitignore" git push

🛁 git 관리

git config : 사용자 정보 지정

git config --global color.ui true git config --global user.name "Sook" git config --global user.email "22sook00@EMAIL.com"

🔐 SSH Key

Github와 연동등에 사용 - https://github.com/settings/keys
# ssh key 생성 ssh-keygen -t rsa -b 4096 -C "22sook00@EMAIL.com" # ssh key 확인하기 cat ~/.ssh/id_rsa.pub #-> 복사해서 Github ssh key 세팅에 붙여넣기 # ssh 작동 확인하기 ssh -T git@github.com #-> Hi excid3! You've successfully authenticated, but GitHub does not provide shell access.

git status, log, diff

# git 작업폴더 상태 확인 git status # Log 보기 git log # commit 간 차이점 모두 보기 git log -p # 모든 브랜치 그래프로 보여주기 git log --oneline --graph --all --decorate # branch간 log 비교하기 git log -p master..exp git log -p exp..master # commit 아이디를 사용해 차이점 보기 git diff commit_id..commit_id # 각 branch간의 변경사항 비교 git diff <source_branch> <target_branch> git diff master..exp
 

🏞 Working Area: init, clone

# 프로젝트를 git repository로 생성하기 cd project git init # 원격 repository 클론하여 작업폴더로 만들기 git clone https://github.com/username/project-name.git project-name cd project-name

💬 Stage Area: add, commit, checkout

# 선택적으로 stage에 올리기. add changes to INDEX git add index.html # 모든 파일 스테이징. add all changes to INDEX git add * git add . git add -A # 언스테이징 (Mixed reset) git reset file.txt # 변경사항 commit git commit -m "Fix typo in index.html" # 체크아웃 - 커밋간 체크아웃 git checkout 5813b5 ## 최신 커밋으로 체크아웃하기 git checkout -

Remote Repository: remote, push, pull

# 로컬저장소에 origin이라는 이름으로 원격저장소의 주소를 알려주눈 작업 git remote add origin https://github.com/mhjo/test_mhjo.git # remote URL을 https에서 ssh로 변경하기 git remote set-url origin git@github.com:USERNAME/REPOSITORY.git # remote 저장소 목록보기 git remote -v # origin 저장소의 master 브랜치를 로컬 저장소의 master 브랜치의 업스트림으로 지정함 git push -u origin master # --set-upstream # 로컬저장소에 있는 커밋들을 원격저장소에 올리기 git push origin master # local의 master 브랜치를 heroku remote repository로 push git push heroku master # 원격저장소 origin의 변경사항을 local repository에 업데이트 git pull origin master git pull # fetch 후 merge하기 ## fetch: 원격저장소에서 변경사항을 가져오지만 HEAD에 merge하지 않음 git fetch git merge origin/master

Revert: 변경사항을 되돌리는 커밋 만들기

# 지정한 commit 해시버전을 최상단 커밋으로 올리면서 돌아가기, 즉 히스토리 남기기 git revert commit_hash # 마스터 브랜치에 있는 기능 하나 취소하기 # 예시) c1 <- f1 <- c2 <- f2 <- c3 (master) git revert f2 git revert f1 # ---> c1 <- f1 <- c2 <- f2 <- c3 <- rf2 <- rf1 (master)

Reset: 되돌리기

  • Hard: 히스토리 되돌리기
  • Soft: 원하는 커밋으로 이력을 되돌리지만 작업 내역은 남긴다.
  • Mixed: 인덱스만 리셋. 언스테이징
# 예전 Commit 해시버전으로 돌아가기 (사용자제) git reset commit_id --hard

Branching

  • 브랜치는 물리적인 요소가 아니라 단순한 포인터이다.
  • 우리가 커밋을 할 때마다 master 브랜치의 포인터는 최신 커밋을 가리키도록 움직인다.
  • 브랜치를 생성하면 브랜치를 생성한 커밋을 기준(base)으로 새로운 브랜치가 생성된다.
  • HEAD: 브랜치나 커밋을 가리키는 포인터로써, HEAD를 다른 커밋을 가리키게 하여 브랜치를 전환하거나 과거의 커밋을 볼 수 있다.

브랜칭 전략

  1. master 혹은 develop 브랜치에 직접 커밋을 올리지 않는다.
  1. 기능 개발 시, develop 브랜치를 기준으로 feature/기능이름 브랜치를 만들어 작업한다.
  1. 기능 개발이 끝나면 작업자는 원격저장소에서 Pull Request를 요청한다.
  1. feature 브랜치 PR은 리뷰 후 develop 브랜치에 머지한다.

Branch: 분기

# 새로운 branch 생성 후 바로 체크아웃 하기 git checkout -b <branch> # branch 목록보기 git branch # 새로운 branch 생성 git branch feature/exp # branch 간 스위치하기 git checkout <branch> # branch 삭제하기 git branch -d <branch> # remote repository로 branch를 push 하기 git push origin <branch>

Merge: 병합

  • Fast-forward: 빨리감기 병합. 베이스 브랜치에서 분기 후 작업내용을 머지하면 단순한 수정본이므로 FF됨
  • Merge commit: 새로운 상태를 저장하면 병합 커밋이 생성됨
  • Conflict: 충돌
# feature/exp 브랜치를 develop 브랜치에 합치기 git checkout develop git merge feature/exp

rebase 머지

현재 브랜치의 새로운 키밋을 대상 브랜치 위로 재배치하기
# 빨리감기 가능한 상황에서 rebase 하기. 머지와 같음. git checkout feature git rebase master # 변경사항 없음 git checkout master git rebase feature git push git branch -d feature # 브랜치 삭제

충돌 발생시

가운데 ====== 를 기준으로 HEAD 부분의 현재 체크아웃된 브랜치의 내용과,
exp 부분의 merge 한 부분의 차이점을 보여준다.
<<<<<<< HEAD function a(master) {} ======= function a(exp) {} >>>>>>> exp

Pull Request - 현업에서 머지하기

  • develop 브랜치에서 분기한 feature/기능 브랜치에서 작업한 내용을 커밋하고 푸시한다.
  • 원격저장소에서 Compare & Pull Request 버튼을 눌러 PR 메시지를 작성한다.
    • base: 병합된 커밋이 들어갈 브랜치
    • compare: base브랜치에 반영하고 싶은 브랜치
    • 내용: 스크린샷, 테스트 방법 등 내용 작성
    • Reviewers: 리뷰어
    • Assignees: 담당자. 보통 자기 자신.
    • Labels: 버그, 기능추가, 핫픽스 등의 라벨
  • 머지가 완료되면 로컬저장소에서 fetch하여 반영 상태를 확인한다.
  • develop 브랜치로 checkout한 뒤, pull하여 변경 내용을 가져온다.

Tagging

태그도 특정 커밋을 가리키는 포인터의 일종.
### 태그를 붙일 master 혹은 release 브랜치에서 작업한다. # 주석있는 태그 (annotated tag) 생성하기 git tag -a -m "Tag Description" v0.1 # tag 내용 보기 git tag -v v0.1 # remote에 release버전 추가하기 (tag push하기) git push origin v0.1 git push --tags

Hotfix 전략

  1. (옵션) 오류 없는 버전으로 롤백
  1. master 브랜치로부터 hotfix 브랜치 생성
  1. 소스코드 수정 및 테스트
  1. master 브랜치로 FF 병합 및 배포
  1. 개발중인 브랜치에 병합 (충돌 가능성)
# master에서 hotfix 브랜치 생성, 체크아웃 git checkout -b hotfix master ### 코드 수정 git commit # 빨리감기 병합 git checkout master git merge hotfix git push # 개발 중 브랜치에 병합 - 3way merge git checkout feature git merge master git add file.txt git commit

Stash

branch에서 작업도중, 다른 branch로 체크아웃해야 하는 상황, 하지만 현재 branch의 작업이 끝나지 않아 commit 할 수 없을 때 임시로 branch 작업 내용을 보존하기 위해 사용한다.
# stash 하기 git stash # 복원하기 git stash apply

Amend

  • 커밋에 새로운 내용 추가

Cherry-pick

특정 브랜치의 커밋 피킹해서 다른 브랜치로 가져오기

Fork를 이용한 협업

  • 5명 이하 개발자가 협업한다면 브랜치를 나누어 작업하는 것이 효율적
  • 대규모 개발자가 협업을 해야한다면 포크하여 작업하는 것이 효율적 (오픈소스 프로젝트)
  • Fork - 원본저장소의 프로젝트를 내 프로젝트로 만든다.
    • 원본저장소에 영향을 미치지 않음.
    • 따로 원본저장소의 주소를 추가해야 한다.

리모트 추가

# 포크한 저장소에서 원본저장소의 히스토리도 함께 보기 ## upstream: 원본저장소를 지칭하는 관용적 닉네임 git remote add upstream <url> # 페치해서 upstream 커밋 히스토리 가져오기 ...

원본저장소에 PR 보내기

  1. 포크한 원격저장소에서 New Pull Request를 생성한다.
      • base: 원본저장소 <- head: 포크한 저장소
  1. 원본저장소 관리자는 PR 탭에서 보내온 PR을 확인한다.
      • Approve, Submit Review를 클릭 해 승인한다.
      • Merge PR을 클릭 해 머지한다.

Rebase: 병합 충돌 시 병합 커밋 이력 조작하기

rebase: 커밋의 베이스를 떼서 다른 곳에 붙이는 것. branch를 하나로 유지할 수 있다.
    /---3   <-원본저장소 1---2-|-4---5   <- 포크한 저장소 # 4, 5번을 떼내서 3번 뒤에 붙인다.     /---3---4----5 1---2-|
주의! 실수할 경우 로컬저장소는 삭제하고, 포크한 저장소를 클론 받아 작업하는 것이 낫다. 브랜치를 푸시했다면 리베이스 하지 말것.커밋을 하나씩 비교하면서 충돌여부를 확인하므로 충돌이 여러번 날 수도 있다.혼자 작업하는 브랜치에서만 작업하고, 작업 후 강제 푸시 할 것.
# 충돌 해결 git checkout feature git rebase master git push # TODO 갑자기 푸시??? git add file.txt git rebase --continue git checkout master git merge feature # 병합 커밋이 보기 싫을 때 git pull # 병합 커밋 생성됨 git reset --hard HEAD~ # 병합 커밋 되돌리기 git reabase origin/master git push

git을 이용한 작업 관리

pull -> (coding) -> commit -> pull -> push