Git 명령어
git status: git 워킹트리의 상태를 보여줌
git init: 로컬 레파지토리 생성
git add 파일: 커밋할 파일을 스테이지에 추가
git commit -m “메세지” : 커밋 메세지와 함께 커밋. 첫 커밋시에는 아래 계정정보 입력이 먼저 필요
- git config --global user.email "you@example.com" :계정정보 입력
- git config --global user.name "Your Name" :계정정보 입력
git log: 로그 보기
git log –oneline –graph –decorate -all: 모든 브랜치를 보기쉽게 보여줌
git checkout 체크썸7자리: 해당 체크썸으로 이동
git remote add 원격저장소명 git주소: git주소 원격저장소 등록. 원격저장소명은 일반적으로 origin 사용
git push: 현재 브랜치를 원격저장소의 브랜치에 반영
git push 원격저장소명 브랜치명: 원격저장소명의 브랜치에 반영
git clone git주소 . :git주소의 코드를 현재위치에 복사. 현재위치가 아닌 다른 위치에 저장할 경우 .에 해당 경로를 명시
git pull 원격저장소명 브랜치명: 원격저장소명의 브랜치 코드를 로컬저장소에 반영
- git fetch + get merge
git fetch [원격저장소별명] [브랜치이름]: 원격 저장소의 브랜치와 커밋을 로컬 저장소에 반영
git merge [브랜치이름]: 지정한 브랜치와 현재 브랜치를 합치기
Git 개념
git 파일의 상태
- untracked : 추적 안됨. 한 번도 커밋되지 않은 파일
- tracked
- staged : untracked 파일을 add 명령어로 스테이지에 업로드한 상태
- unmodified : 스테이지에 업로드 된 파일을 commit 명령어를 수행한 상태
- modified : 한 번 이상 커밋한 파일에 수정이 발생한 상태
HEAD : 현재 브랜치 혹은 커밋을 가리키고 있는 포인터
병합(merge) 종류
- merge commit: 다른 내용의 commit를 병합하여 새로운 커밋 생성
- fast-forward:부모 commit을 기반으로 단순한 수정과 추가만 발생한 경우. 빨리 감기를 해서 해당 브랜치를 이동하기만 하면 됨
- conflict: commit이 동일한 부분에 변경이 발생하여 브랜치를 머지할 때 충돌이 발생.
- 해결방법
- checkout으로 master가 아닌 A브랜치로 이동
- master가 있는 commit을 선택 후 merge 선택(origin/master 가아닌 로컬 master)
- 충돌 발생. 차이점을 확인 후 저장. 변경사항을 commit 하면 새로운 commit이 생성되면서 충돌 해결
- push하여 origin/A에도 반영
- A브랜치에서 충돌 해결을 확인하였으므로 master 브랜치로 checkout
- A브랜치가 있는 commit으로 merge 시도
- master 브랜치도 A브랜치가 있는 commit으로 병합 완료
- push를 눌러 origin/master(원격저장소)에도 반영
- 해결방법
fork: 다른 원격 저장소를 내계정으로 통째로 복제
풀 리퀘스트
- 병합을 요청
- github 페이지에서 Pull requests 페이지 > New Pull request > base와 compare 브랜치 설정
- compare 브랜치를 master 로 병합 요청하는 것임
- fork 한 원격저장소가 있다면 원본저장소로 풀 리퀘스트 요청할 수 있음.
- fork한 레포지토리의 github 페이지에서 Pull requests 페이지 > New Pull request > base와 compare 브랜치 설정. compare 브랜치를 master 로 병합 요청하는 것임
rebase
- base를 다시 설정하는 것
- base로 설정할 커밋을 선택하면 현재 head의 변경사항을 선택한 커밋의 다음으로 새로 연결 시켜줌. 다만 충돌이 있는 경우는 충돌을 해결해야함
- 사용하는 경우는, 충돌 해결을 위해 merge를 하면 새로운 커밋이 새로 생겨남. 변경사항은 1개인데 충돌 해결을 위한 커밋이므로 불 필요한 커밋이라고 볼 수 있음. 이러한 현상이 싫다면 rebase를 써서 현재 head의 변경사항을 선택한 커밋 다음으로 연결하면 깔끔하게 merge 커밋 없이 연결이 됨
- 단 rebase를 한 경우 충돌이 났을 때는 수동으로 충돌난 코드를 수정한 것이기 때문에 push할 때 force push로 원격저장소에 반영해야할 수 있음
- 원격저장소에 푸시한 브랜치를 rebase하게 될 경우 다른 사용자가 해당 브랜치를 머지하면 히스토리가 꼬여서 복구하기가 어려움. 그렇기 때문에 원격 저장소에 푸시하지 않은 로컬의 브랜치들에만 사용을 권장
amend
- 커밋 또는 푸시 내용을 수정. 추가적인 커밋을 만들지 않고 이전에 커밋한 내용을 수정할 수 있음
- 커밋시 amend 옵션을 선택하면 마지막으로 커밋한 내용을 수정할 수 있음
cherry-pick
- 다른 브랜치의 커밋 하나만 현재 브랜치에 반영
- cherry-pick한 커밋은 다른 브랜치에서 선택한 커밋과 ID가 다름. 즉 다른 커밋
- 반영하고 싶은 브랜치의 커밋을 선택 후 cherry-pick을 누르면, 현재 브랜치에 cherry-pick한 내용과 커밋 내용이 새롭게 추가
reset
- 특정 커밋으로 현재 브랜치를 되돌리기
- soft: 특정 커밋으로 되돌리고 되돌려진 변경사항들은 스테이지에 추가된 상태로 둔다
- mixed: 특정 커밋으로 되돌리고 되돌려진 변경사항들은 스테이지에 추가되지 않은 상태로 둔다.
- hard: 특정 커밋으로 되돌리고 되돌려진 변경사항들은 버린다.
- hard reset 등을 한 경우에는 원격저장소에 반영하려면 로컬 저장소는 과거 상태이기 때문에 force push를 수행해야 원격저장소 반영이 가능
revert
- 선택한 커밋의 변경사항을 되돌려서 새로운 커밋을 생성
- 단, revert한 이력도 남음
stash: 커밋하지 않은 변경사항을 잠시 저장
Git 참고사항
Github 에서 새로운 repository 생성 방법
- Github에서 원격 저장소 만들고 내 로컬에 클론
- 내 로컬에서 로컬저장소를 먼저 만들고 Github에 원격저장소를 만들어 로컬저장소에 원격저장소 주소를 remote add