로컬 레포지토리와 연결할 유저 정보를 설정한다.
# 버전 히스토리를 식별할 때 사용할 이름을 설정
$ git config --global user.name "[firstname lastname]"
# 각 기록과 연결할 이메일 주소를 설정
$ git config --global user.email “[valid-email]”
레포지토리를 초가화하거나 존재하는 레포지토리를 클론할 수 있다.
# 현재 디렉토리를 기준으로 Git 저장소가 생성
$ git init
# URL을 통해 리모트 레포지토리를 로컬 레포지토리에 복제
$ git clone [url]
변경된 파일을 쉬운 예시로 무대에 올리는 것과 같다.
# 다음 커밋을 위해 현재 디렉토리에서 수정된 파일을 확인
$ git status
# 다음 커밋을 위해 파일을 추가 (stage)
$ git add [file]
# 추가한 파일을 언스테이징. 변경 사항은 유지된다
$ git reset [file]
# 스테이지되지 않은 변경 사항을 보여준다
$ git diff
# 스테이지했지만 커밋하지 않은 변경 사항을 보여준다.
$ git diff --staged
무대에 올린 (변경된 파일들을) 스냅샷을 생성한다.
# 스테이지된 컨텐츠를 메시지와 함께 커밋
$ git commit -m “[descriptive message]”
이 때, 새로운 브랜치로 Git이 바라보는 곳, HEAD를 변경하는 작업을 switch라고 부른다. 브랜치를 생성할 때는 생성(create)의 의미로 -c
를 붙여줘야 하고, 기존에 있는 브랜치 간의 이동은 붙이지 않아도 된다.
# 브랜치 목록을 보여준다. '*'표시는 현재 작업중인 브랜치
$ git branch
# 브랜치 만들고 동시에 checkout
git switch -c [new-branch-name]
# checkout이라는 명령어로도 위와 동일
git checkout -b [new-branch-name]
# 기존에 있던 main 브랜치간의 전환은 이래와 같이
git switch main
git checkout main
기능 개발이 끝나면 브랜치를 main 브랜치와 합칠 수 있다.
# 기능 개발이 진행
git commit -m "기능1의 세부 기능1"
git commit -m "기능1의 세부 기능2"
git commit -m "기능1 개발 완료"
# 머지할 main 브랜치로 전환
git switch main
# main 브랜치로 feat/todo 브랜치를 병합
git merge feat/todo
실제 개발에서는 로컬에서 merge하기 보다는 pull request기능을 이용하는 경우가 많으니
다음과 같이 push한 후에 PR 요청을 한다.
# 기능 개발이 진행
git commit -m "기능1의 세부 기능1"
git commit -m "기능1의 세부 기능2"
git commit -m "기능1 개발 완료"
# Github 원격 리포지토리로 푸시
git push origin feat/todo
# Github에서 Pull Request 진행
# 현재 브랜치의 모든 커밋 히스토리
$ git log
머지된 feature 브랜치는 이미 dev 브랜치에 기록이 남아있기 때문에 굳이 남겨둘 이유가 없어 삭제를 권장한다. 원격 리포지토리에서 PR이 성공적으로 마무리되면, 아래 브랜치를 삭제하는 버튼을 눌러 쉽게 삭제할 수 있다.
로컬 리포지토리에서 브랜치 삭제는 git branch -d [브랜치명]
으로 할 수 있다.
git branch -d [branch-name]
Git은 원활한 버전 관리를 위해서, 브랜치가 합쳐지지 않으면 삭제하지 못하도록 설정이 되어있다. 하지만 종종 다 만들지 못한 기능의 기록을 삭제하고 싶을 때 -D 옵션을 쓰면 삭제할 수 있다.
git branch -D [branch-name]
# 브랜치B에 없는 브랜치A의 모든 커밋 히스토리를 보여준다
$ git log branchB..branchA
# 해당 파일의 변경 사항이 담긴 모든 커밋을 표시 (파일 이름 변경도 표시)
$ git log --follow [file]
# 브랜치A에 있지만 브랜치B에 없는 것의 변경 내용(diff)을 표시 (branch간 상태 비교)
$ git diff branchB...branchA
특정 레포지토리의 업데이트 사항을 검색하여 로컬 레포지토리를 업데이트할 수 있다.
# url을 통해 특정 리모트 레포지토리를 별칭으로 추가
$ git remote add [alias] [url]
# 별칭으로 추가한 리모트 레포지토리에 있는 모든 브랜치 및 데이터를 로컬로 가져온다
$ git fetch [alias]
# 리모트 브랜치를 현재 작업중인 브랜치와 병합하여 최신 상태로 만든다
$ git merge [alias]/[branch]
# 로컬 브랜치의 커밋을 리모트 브랜치로 전송
$ git push [alias] [branch]
# 리모트 레포지토리의 정보를 가져와 자동으로 로컬 브랜치에 병합
$ git pull
브랜치 또는 커밋을 수정하거나 커밋 히스토리를 지울 수 있다.
# 특정 브랜치의 분기 이후 커밋을 현재 작업중인 브랜치에 반영.
$ git rebase [branch]
# 득정 커밋 전으로 돌아가며 스테이지된 변경 사항을 모두 지운다
$ git reset --hard [commitish]
브랜치를 전환하기 위해 변경되었거나 추적중인 파일을 임시로 저장할 수 있다.
# 수정하거나 스테이지된 변경사항을 스택에 임시 저장하고 현재 작업 내역에서 지운다
$ git stash
# 스택에 임시 저장된 변경사항의 목록을 보여준다
$ git stash list
# 스택에 임시 저장된 변경사항을 다시 현재 작업 내역에 적용
$ git stash apply
# 스택에 임시 저장된 변경사항을 다시 현재 작업 내역에 적용하고 스택에서 삭제
$ git stash pop
# 스택에 임시 저장된 변경사항을 삭제
$ git stash drop