다양한 command 명령어가 있지만 개인적으로 자주 쓰는 명령어가 있고 사용을 전혀 하지 않은 명령어도 있습니다.
사용빈도 |
Command |
프로젝트 시작시 |
clone / init |
자주 |
pull / commit / add / push / remote / branch / checkout / status stash / merge / rebase / log / diff / revert / reset / fetch |
가끔 |
tag |
사용안함 |
mv / rm / bisect / grep / show |
작업을 하고 있었는데 갑자기 급한 이슈가 생겼다면?
잠깐만 지금 상태를 저장해두고 싶을 때가 있나요? 그럴땐 stash를 사용해보세요.
git stash를 사용한다면 작업했던 내용을 잠시 저장해 둘 수 있습니다. 이슈를 해결하고 다시 작업중인 상태로 돌아가고 싶으실때는 git apply를 통해 불러올 수 있죠. stash는 stack으로 이루어져 있기 때문에 맨 마지막 작업을 불러오게 됩니다. apply는 가져오기만하지 그대로 남겨져 있기 때문에 언제든 불러올 수 있죠. 가져오고나서 저장한 내용을 제거 하고 싶다면 pop을 사용하시면 됩니다.
git stash # 변경된 상태를 저장한다.
git stash apply | pop # 변경된 상태를 불러온다. | 불러오고 삭제한다.
git stash -a | # untracked file을 함께 저장
git stash list # 저장된 상태 목록을 본다.
상태를 비교하고 싶을때 diff를 사용합니다. 보통 지금 작업하는 unstage상태와 비교를 하게 되는데요. add를 통해 stage(index)되어있는 파일과 비교하고 싶을때는 --cached 옵션을 사용하면 편리합니다.
또는 커밋과 커밋을 비교할 수 있는데요. 중요한건 첫번째 인자는 과거라고 생각하시고 두번째 인자는 미래라고 생각하시고 쓰시면 될 것 같습니다.
git diff # HEAD와 지금 작업한 내용의 변화
git diff --cached # HEAD와 index에 있는 상태와의 비교
git diff HEAD~1 HEAD # 전커밋과 HEAD를 비교
git diff HEAD HEAD~1 # 위와 같지만 +, -가 반대로 되는 모양을 볼 수 있습니다. (관점 중요)
unstage에 있는 파일을 stage로 옮길때 add를 사용하지만 만약 5개의 파일중 3개만 stage로 옮기고 싶을때는 각각의 필요한 파일들을 일일이 적어줘야 됩니다. git add filename
만약 10개중에 5개라면 또 5개의 이름을 적어야되죠. editor를 사용해서 쉽게 선택해서 stage로 옮길 수 있지만 terminal에서는 힘들죠 이럴때 옵션을 사용하면 편리합니다. 또한 한 파일 안에 chunk단위로 add 할 수 있는 옵션도 있습니다. y, n선택으로 필요한 부분만 stage에 올릴 수 있죠.
git add -i # 간편한 UI로 숫자로 선택할 수 있도록 되어있습니다.
git add -p # chunk단위로 선택해서 stage에 올릴 수 있습니다.
checkout은 쓰는 방식에 따라 의미가 조금 다릅니다.
checkout fileName으로 사용하신다면 수정하기 전으로 돌아가는 의미이지만
checkout hash, branchName, tag를 사용하신다면 HEAD를 해당 커밋으로 이동합니다.
다른 사람의 업데이트 이력을 내 저장소에도 갱신
file |
pull and merge origin/master |
다른파일 |
같은파일 |
file만 수정 |
pull and merge |
문제없이 pull |
Please commit your changes or stash them before you can merge. Aborting |
file을 수정하고 commit |
pull and merge |
바로 commit editor실행되며 merge기본 형식의 message가 미리 적힌 상태 |
CONFLICT (content): Merge conflictm different commits each. both modified: README.md |
both modified
<<<<<<< HEAD (my local branch name)
=======
>>>>>>> 8c25ab8cf03ee6f86da9fcc1b9cdbc78e3f2f826 (commit hash)
로컬 저장소 파일과 원격 저장소 파일이 충돌이 났을 때 저 모양을 볼 수 있다.
===== 로 구분된 윗 부분이 로컬 저장소, 아랫 부분이 원격 저장소의 변경 내용이라는 점!
여기서 직접 수정이 가능하지만 로컬 저장소의 변경사항 또는 원격 저장소의 변경사항을 선택
할 수 있다.
- git checkout --theirs file: 로컬 저장소의 변경사항을 선택 (git checkout -3 file)
- git checkout --ours file: 원격 저장소의 변경사항을 선택 (git checkout -2 file)
직접수정 or 로컬 저장소선택 or 원격 저장소선택 을 하게되면 git status를 쳤을때 아무 변화가 없다.
여기서 commit을 하고 merge작업을 계속하면 된다.
- git commit: commit editor가 실행,
Merge branch 'master' of ...
이런 형식의 message가 미리 적힌 상태이다.
- git commit -m "merge된 commit의 message" : 내가 적은 message로 merge commit이 생성