Git
- 형상 관리 시스템(Version Control System)
- 분산 버전 관리 시스템(DVCS)
- 여러 개발자가 하나의 소프트웨어 개발 프로젝트에 참여할 때, 소스 코드를 관리 도구로 사용
- git process
origin
- 로컬(local) 저장소와 연결되어 있는 원격(remote) 저장소의 이름(별칭: alias)
- origin 외에 다른 이름으로 부여할 수 있다. (default 값으로 origin 부여)
- origin이라는 이름의 원격 저장소 등록하기
- git remote add origin
- git clone (자동으로 origin이라는 이름의 원격 저장소가 등록)
- git remote add origin
master & main
- 브랜치 중 가장 중심이 되는 기본적인 branch (default branch)
- default branch 명을 master 에서 main 으로 변경할 수 있다.
branch
- 협업 시 여러 개발자들이 동시에 다양한 작업을 할 수 있도록 만들어 주는 기능
- 브랜치(branch)를 통해서 하나의 프로젝트를 여러 갈래로 나누어서 관리
- 각각의 독립된 branch에서 작업 후 원래 버전과 비교하여 또 하나의 새로운 버전을 생성
HEAD
- HEAD 포인터는 현재 checkout된 branch를 가리킨다.
- branch는 각 최신 commit의 해쉬 주소를 담고 있다.
- 그러므로 git checkout 명령어를 통해서 HEAD 포인터를 옮겨 branch를 이동할 수 있고
- 그 branch는 최신 commit에 대한 해쉬값을 가지고 있으므로 해당 branch의 괴거 commit들을 탐색할 수 있다.
ISSUE
- 프로젝트의 기획, 추가 기능, 버그와 수정 사항 등
- 모든 활동 내역에 대해서 이슈를 등록하고 등록한 이슈를 기반으로 작업을 진행할 수 있다.
- 해결된 이슈는 Close issue 버튼을 눌러서 닫아주어야 한다.
- 기능
- Assigness : 해당 이슈의 담당자
- Lebels : 해당 이슈의 성격
- Milestone : 해당 이슈가 속한 파트, 유사한 이슈들을 모아 관리 할 수 있다.
- Development : 해당 이슈와 연관된 Pull request 링크
conflict
- 충돌이나는 상황
- branch1과 branch2로 브랜치를 나누어서 작업을 한다고 가정할 때 두 브랜치가 같은 라인 코드를 수정 후 커밋한다.
- 작업이 모두 끝나면 master에서 두 브랜치들을 merge 한다.
- master는 두 브랜치가 동일한 라인에 코드를 수정했으니 어떤 코드를 결정해줘야 할지 모르기 때문에 conflict가 발생한다.
명령어
git init
- 새로운 로컬(local) 저장소를 생성(초기화)
- .git 디렉토리가 생긴다.
- git clone 명령어를 통해 원격(remote) 저장소를 로컬(local)에 복제해와서 사용하기 때문에 잘 사용하지 않음
git remote
- 로컬 저장소에서 원격 저장소 등록 및 해제에 사용
- git remote add **<원격 저장소="" 명="">
:** 원격 저장소(remote) 등록 원격>- 예) git remote add origin git@github.com:url.git
- git remote remove **<원격 저장소="" 명=""> :** 원격 저장소(remote) 해제
원격>
- 예) git remote remove origin
- git remote -v : 원격 저장소 리스트 확인
git add
- git add . : 작업 디렉토리 내의 모든 변경 내용을 스테이징 영역으로 이동
- 작업 디렉토리 상의 변경 내용을 스테이징 영역(staging area)에 추가하기 위해 사용
- 다음 변경(commit)을 기록할 때까지 변경 분을 모아 놓기 위해서 사용
- 스테이징 영역(staging area)
- 작업 디렉토리(working directory)와 git 저장소의 변경 이력 사이에 징검다리 역할
git status
- 작업 디렉토리와 스테이징 영역(staging area)의 상태를 확인하기 위해 사용
- 3개의 영역으로 구분
- Changes to be committed : 스테이징 영역에 넘어가 있는 변경 내용
- Changes not staged for commit : 아직 작업 디렉토리에 있는 변경 내용
- Untracked files : 아직 작업 디렉토리에 있고, git 저장소에서 관리한 적이 없는 새로운 파일
git commit
- 파일 및 폴더의 변경 사항(git add를 통해 staging area에 생긴 내용)을 저장소에 기록하는 것
- git commit -m “commit message” : 커밋과 동시에 간단한 커밋 메시지를 작성
- git commit –amend : 커밋의 내용을 덮어씀
git log
- 커밋 변경 사항을 추적
- git log –oneline –graph : 커밋 로그를 한 줄 그래프 형식으로 보여줌
git branch
- branch를 관리할 때 사용
- git branch : 로컬(local) 저장소에서 현재 위치한 브랜치 확인
- git branch -r : 원격(remote) 저장소의 브랜치 확인
- git branch -v : 브랜치의 마지막 커밋 메시지 확인
- **git branch -d
** : 브랜치 삭제 (강제 삭제는 -D) - **git branch
** : 브랜치 생성
git checkout
- branch를 이동할 때 사용
- **git checkout
** : 해당 브랜치로 이동
git switch
- git 2.23 version부터 git checkout을 대신하여 switch를 사용
- **git switch
** : 해당 브랜치로 이동 - **git switch -c
** : 브랜치를 만들고 해당 브랜치로 변경 - **git switch -t origin/<원격브랜치명>** : 원격 브랜치와 같은 이름으로 로컬 브랜치를 생성 후 이동원격브랜치명>
git push
- 로컬(local) 저장소에서 commit한 내용들을 원격(remote) 저장소로 이동
- **git push -f
** - git push -f origin [branch-name]
- origin의 해당 branch로 강제 커밋(Force Push)
- **git push -u
** - git push -u origin master
- 원격(remote) 저장소의 어느 브랜치에 커밋을 올릴 것인지 설정하고 반영
- origin의 master 브랜치로 푸시를 진행
- 원격 저장소에 master 브랜치가 없다면 자동 생성
- 이후 푸시에서는 간단히 git push 명령어 만으로 반영 가능
- 이후 간단히 git pull 명령어 만으로 origin 이라는 원격 저장소의 master 브랜치를 로컬 저장소의 master 브랜치로 merge 가능
git pull
- 원격(remote) 저장소의 변경된 데이터를 가져올 때 사용(Update)
- **git pull
** - git pull origin master
- 원격(remote) 저장소의 master 브랜치의 내용들을 가져옴
git reset
- commit을 취소할 때 사용(이력을 남기지 않음)
- reset 옵션
- –soft : commit된 파일들을 staging area로 돌려놓음 (add 한 상태)
- –mixed (default) : commit된 파일들을 working directory로 돌려놓음 (add 하기 전)
- –hard : git add를 통해 추적되고 있는 tracked 파일들을 working directory에서 삭제함
- Untracked 파일들은 삭제하지 않으며, 해당 옵션 사용 시 복구는 불가능함
- **git reset
- 다음과 같이 1a → 2b → 3c 차례로 커밋을 하였고, 3c 커밋을 취소하고 싶다면?
- git reset –hard 2b (HEAD가 이전 커밋(2b)를 가리키도록 한다)
- **git reset
-
**git reset
git revert
- commit 내용을 되돌릴 때 사용(이력을 유지함)
- commit을 원격 저장소에 push 해버린 경우, 로컬 저장소에서 commit을 reset 해버리면 원격 저장소와 상태가 틀어져버린다.
- 혼자의 경우 force push를 이용할 수 있지만, 협업의 경우 못하기 때문에 revert를 사용한다.
- git revert [commit ID] : 해당 커밋을 되돌림
- 다음과 같이 1a → 2b → 3c 차례로 커밋을 하였고, 3c 커밋을 없애고 2b 커밋으로 되돌리고 싶다면?
- git revert 3c (3c 커밋을 되돌리는 revert commit이 추가로 생성된다)
git merge
- 브랜치를 병합할 때 사용
- **git merge
** : 해당 브랜치의 전체 이력을 현재 브랜치와 병합 - **git merge –squash
** - 해당 브랜치의 커밋을 하나로 압축하여 다른 브랜치의 최신 커밋 하나로 만드는 방법
- 이것저것 실험해 봐야 하는 새로운 기능을 만들거나 버그를 수정할 때 유용
- 협업을 위해 master 브랜치에서 contact 브랜치를 분기
- contact 브랜치에서 작업을 끝낸 후 2개의 커밋이 발생
- master 브랜치로 이동 후 git merge –squash contact 사용
- 두 개의 커밋이 master 브랜치에 한 개의 커밋으로 밀어 넣어짐
- master 브랜치에 밀어 넣어진 내용은 스테이징되어 커밋할 준비(add 상태)가 된다.
- 그러므로 따로 master 브랜치에서 commit이 필요하다.
git rebase
- 브랜치를 병합할 때 사용 (베이스를 다시 설정하는 작업)
- **git rebase
** : 해당 브랜치의 최신 변경 이력을 가져와 병합 - 최신 변경 사항을 즉각 반영하기 쉽다.
- commit 이력을 남기지 않으므로 commit History가 깔끔해진다.
git-flow
를 사용할 때Rebase and Merge
전략으로 깔끔한 History로 작업할 수 있습니다.- rebase 를 하는 상황
- dev branch 에서 feature branch 로 분기하여 작업 진행
-
dev branch 에서 다른 개발자의 작업으로 인해서 새로운 commit 이 발생
-
feature branch 에서 작업하고 있는 동안 dev 에 적용된 새로운 commit 들을 나의 feature branch 에 적용하고 싶을 때 $ git rebase dev 를 사용
- 충돌(conflict) 발생 시 해결 방법
- 충돌이 생기면, conflict 을 해결하거나 rebase 를 취소할 수 있도록 rebase 가 잠시 멈춘다.
- git status 명령으로 충돌이 생긴 파일들의 목록을 보여준다.
- rebase 취소 시 git rebase –abort 진행
- conflict 수정 시 해당 파일 수정 후 git rebase –continue 진행
- rebase 는 commit 을 하나 하나를 따로 merge 하기 때문에 이 과정을 반복할 수도 있다.
git cherry-pick
- 해당 브랜치에서 하나의 커밋을 가져와서 현재 브랜치에 적용하는 방법
- **git cherry-pick
** : 개별적인 커밋을 밀어 넣을 수 있음 - 전체 합치기가 적합하지 않은 경우 사용
- cherry-pick은 선택한 커밋의 변경 사항을 가지고 새로운 커밋을 생성
- 선택하려는 커밋이 여러 개라면 커밋을 이어서 작성 (git cherry-pick 9941f44 480b6bb)
- cherry-pick을 사용할 commit이 있는 브랜치로 이동하여 커밋명 찾음
- master 브랜치로 이동한 후 cherry-pick 명령어 실행
- git cherry-pick 9941f44
- master 브랜치에 밀어 넣어진 커밋 내용은 스테이징되어 커밋할 준비(add 상태)가 된다.
- 그러므로 따로 master 브랜치에서 commit이 필요하다.
git clone
- 원격(remote) 저장소의 파일들을 로컬(local) 저장소로 가져올 때 사용
- **git clone
** - git clone [원격 저장소 주소] [로컬 복제할 위치(생략하면 현재 위치)]
- SSH 프로토콜을 통해 클론 시 SSH 키를 등록해야 한다.
- SSH 키(공개 키, 개인 키) 등록 방법
## 명령어 취소
commit 취소
- git reset –soft HEAD^
- 수정한 내용은 그대로 두고 HEAD 를 한 단계 위로 조정하여 바로 이전 작업 취소
pull 취소
- git reset –hard ORIG_HEAD
merge 취소
- git reset –merge ORIG_HEAD
- ORIG_HEAD는 이전 작업한 곳의 HEAD를 의미
add 취소
- git reset HEAD