이번 포스팅에서는 깃(Git)의 협업을 위한 명령어에 대하여 공부를 해보고자 한다.
충돌 해결하기
같은 내용을 여러 브랜치에서 변경한 뒤, 머지하는 경우에는 충돌이 발생한다.
git 저장소는 원격 서버(remote)와 로컬(local)에 둘 다 존재한다.
원격 저장소의 정보는 git remote 명령으로 등록하고 확인할 수 있다.
remote
리모트 저장소는 인터넷이나 네트워크 어딘가에 있는 저장소를 말한다.
저장소는 여러 개가 있을 수 있는데 어떤 저장소는 읽고 쓰기 모두 할 수 있고 어떤 저장소는 읽기만 가능할 수 있다.
간단히 말해서 다른 사람들과 함께 일한다는 것은 리모트 저장소를 관리하면서 데이터를 거기에 Push 하고 Pull 하는 것이다.
리모트 저장소를 관리한다는 것은 저장소를 추가, 삭제하는 것뿐만 아니라 브랜치를 관리하고 추적할지 말지 등을 관리하는 것을 말한다.
push
git push origin feature-add-menu
fetch
로컬에는 없지만, 리모트 저장소에는 있는 데이터를 모두 가져오지만 자동으로 Merge 하지 않는다.
로컬에서 하던 작업을 정리하고 나서 수동으로 Merge 해야 한다.
리모트 저장소의 모든 브랜치를 로컬에서 접근할 수 있어서 언제든지 Merge를 하거나 내용을 살펴볼 수 있다.
워킹 디렉터리의 파일 내용은 변경되지 않고, git merge를 해야 합쳐진다.
git fetch origin
pull
리모트 저장소 브랜치에서 데이터를 가져올 뿐만 아니라 자동으로 로컬 브랜치와 Merge 시킬 수 있다.
Clone 한 서버에서 데이터를 가져오고 그 데이터를 자동으로 현재 작업하는 코드와 Merge 시킨다.
커밋 수정하기
커밋과 관련된 팁
SHA-1 해시값으로 되어있는 커밋, 전체가 아닌 일부만 사용해도 된다
commit 8984de38057a0cd157f978ff16d8a56e53fc9d53 = 8984d
한 번에 한 커밋 위로 움직이는 ^ : git checkout main^
한 번에 여러 커밋 위로 움직이는 ~<num> : git checkout main~1
git branch -f main HEAD~3
reset
브랜치가 예전 커밋을 가리키도록 옮긴다.
커밋을 안 했던 것처럼 바꾸기 때문에 이전 히스토리가 바뀐다.
reset 명령이 HEAD, Index, Working Directory를 조작하는 동작
1단계: HEAD 이동
HEAD는 계속 현재 브랜치를 가리키고 있고, 현재 브랜치가 가리키는 커밋을 바꾼다.
HEAD가 master 브랜치를 가리키고 있다면(즉 master 브랜치를 Checkout 하고 작업하고 있다면) git reset 9e5e6a4 명령은 master 브랜치가 `9e5e6a4`를 가리키게 한다.
reset 명령에 커밋을 넘기고 실행하면 언제나 이런 작업을 수행한다.
reset --soft 옵션을 사용하면 딱 여기까지 진행하고 동작을 멈춘다.
2단계: Index 업데이트 (--mixed)
git status 명령을 실행하면 Index와 reset 명령으로 이동시킨 HEAD의 다른 점이 녹색으로 출력된다.
reset 명령은 Index를 현재 HEAD가 가리키는 스냅샷으로 업데이트할 수 있다.
--mixed 옵션을 주고 실행하면 reset 명령은 여기까지 하고 멈춘다.
reset 명령을 실행할 때 아무 옵션도 주지 않으면 기본적으로 --mixed 옵션으로 동작한다(예제와 같이 git reset HEAD~ 처럼 명령을 실행하는 경우).
3단계: 워킹 디렉터리 업데이트 (--hard)
reset 명령은 워킹 디렉터리까지 업데이트한다. --hard 옵션을 사용하면 reset 명령은 이 단계까지 수행한다.
reset 명령을 통해 git add 와 git commit 명령으로 생성한 마지막 커밋을 되돌리고, 워킹 디렉터리의 내용까지도 되돌린다.
--hard 옵션은 reset 명령을 위험하게 만드는 유일한 옵션이기 때문에 매우 매우 중요하다.
Git에는 데이터를 실제로 삭제하는 방법이 별로 없는데 그중 하나다.
reset 명령을 어떻게 사용하더라도 간단히 결과를 되돌릴 수 있지만, --hard 옵션은 되돌리는 것이 불가능하다.
revert
reset처럼 히스토리를 바꾸는 것이 아니고, 커밋의 내용을 되돌리는 커밋을 새로 만든다.
원격 저장소에 삭제하고 싶은 내용을 Push 했더라도 revert 커밋을 추가해주기만 하면 된다.
cherry-pick
커밋 정리가 점점 복잡해질 때 아주 유용한 명령어로 다른 브랜치에 있는 커밋을 선택하여 내 브랜치에 적용시킬 때 사용한다.
merge하지 않을 브랜치에서 원하는 커밋만 쏙쏙 뽑아온다.
HEAD 아래에 다른 커밋들에 대한 복사본을 만든다.
git cherry-pick <commit1> <commit2> ....
cherry-pick은 같은 내용을 같고 있는 커밋을 여러 개 생성하기 때문에 꼭 사용해야만 할 때 진행하는 것이 좋다.
rebase -i (interactive rebase)
HEAD로부터 몇 개의 커밋 범위를 정하여 rebase 할 수 있다.
cherry-pick은 원하는 커밋의 커밋 아이디를 알아야 가능하지만 rebase -i는 편집기에서 커밋을 선택할 수 있기 때문에 범위만 알면 수정이 가능하다.
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
남들과 공유하는 커밋은 가급적 rebase하지 않는 게 좋다.
git pull 할 때, --rebase 옵션을 사용해 rebase를 하고 머지하는 것이 좋다.
stash
아직 마무리하지 않은 작업을 잠시 저장할 수 있도록 하는 명령어다.
아직 완료하지 않은 작업을 commit하지 않고 나중에 다시 꺼내와 마무리할 수 있다.
git stash 명령을 사용하면 워킹 디렉터리에서 수정한 파일들만 저장한다.
'Git & GitHub' 카테고리의 다른 글
[Git & GitHub] 혼자하는 간단한 실습 (0) | 2022.11.10 |
---|---|
[GitHub] 깃허브(GitHub)란? (0) | 2022.11.09 |
[Git] 깃(Git) 협업을 위한 명령어(1) (2) | 2022.11.06 |
[Git] 깃(Git) 기본 명령어 (0) | 2022.11.05 |
[Git] 깃(Git) 기본 설정 (0) | 2022.11.04 |