이 글은 Git은 뭐고, GitHub는 또 뭔가요?를 보고 오셨다는 전제하에 쓰여졌습니다.
친구집에서 친구랑 같이 코딩하고 코드를 깃허브에 올렸다고 가정합시다. 이제 집에 와서 친구집에서 아직 다 못한 작업을 이어서 하고 싶은데, 이럴경우 원격 저장소의 작업 내용을 내 로컬 저장소로 가져와야 하는데 이때 사용하는 명령어가 git clone입니다.
원격 저장소의 주소를 복사하고 다음과 같이 사용하면 됩니다.
git clone 원격 저장소 주소
만약 특정 디렉토리에 저장하고 싶다면 다음과 같이 디렉토리명을 적어주면 됩니다.
git clone 원격 저장소 주소 디렉토리명
개발자들이 개발을 할때, 기본이 되는 master 브랜치에서만 작업하지 않습니다.
필요에 따라 여러 브랜치를 만들고 그 브랜치에서 작업하고 다른 브랜치와 합치는 방식으로 개발을 진행합니다. 브랜치를 생성하는 명령어는 다음과 같습니다.
git branch 생성할 브랜치명
브랜치를 삭제하는 명령어는 다음과 같습니다.
git branch -d 삭제할 브랜치명
feature/practice
는 다음과 같이 만들수 있습니다.
git branch
로 생성된 브랜치와 현재 위치한 브랜치를 확인 할 수 있습니다.
생성된 feature/practice
를 확인할 수 있고, master에 별표가 붙은걸 보니 현재 브랜치가 master 브랜치임을 확인 할 수 있습니다.
git checkout 이동할 브랜치명
이제 feature/practice
로 이동해 봅시다.
터미널에서 브랜치변경을 확인할 수 있습니다.
git branch
로 확인해 보면,
feature/practice
에 앞에 별표가 있는것을 확인 할 수 있습니다.
A 개발자와 B 개발자가 협업을 하는데, A가 구현한 기능을 깃허브에 push했다고 합시다.
B는 A가 구현한 기능을 바탕으로 다음 기능을 구현한다고 하면,
원격 저장소에 있는 최신 코드들을 B의 로컬 저장소에 가져와야 합니다.
git pull은 원격 저장소의 변경된 코드들을 가져와서 병합하는 명령어 입니다.
git pull origin master
여기서 origin은 원격 저장소를 뜻하며 뒤에 master는 원격저장소의 master 브랜치를 뜻합니다.
따라서 git pull origin master를 하면 원격저장소의 master 브랜치에 있는 최신 코드를 내 로컬 저장소에 가져와 병합하겠다는 명령어입니다.
다시 master 브랜치로 이동하고, test.txt를 열어 다음과 같이 적은후 저장하겠습니다.
그리고 git add .
(여기서 .을 사용하면 한번에 전체 파일을 스테이징 할 수 있습니다.)를 하고 다음과 같이 커밋을 하겠습니다. git commit -m "두번째 커밋"
이후 feature/practice
로 이동해서, test.txt를 열어보면 다음과 같을 겁니다.
master 브랜치의 test.txt에 적어놨던 merge practice가 보이지 않습니다.
master 브랜치의 최신 내용을 feature/practice 브랜치에 가져와 병합하는 명령어는 다음과 같습니다.
git merge 병합할 브랜치명
저희는 feature/practice에서 master 브랜치의 최신 정보를 가져와 병합할것이기에 다음과 같이 적어줍니다.
이제 test.txt을 열어보면 merge practice가 보입니다.
현재 위치한 브랜치에서 작업을 하다가 다른 브랜치에서 긴급하게 작업을 해야할 경우,
git checkout으로 브랜치를 이동하려고 해도, 수정중인 파일이 있어서 커밋 하기전에는 브랜치 이동이 안되는 경우가 발생합니다. 이럴때 사용하는 명령어가 git stash
입니다.
git stash
git stash
는 커밋하지 않고 작업하던 파일을 잠시 감추는 명령어 입니다.
git stash list
git stash list
는 git stash
로 감춘 파일들의 목록을 확인하는 명령어 입니다.
이제 다른 브랜치에서 작업을 끝내고 다시 원래 작업하던 브랜치로 돌아와
감추어두었던 파일을 가져와 작업을 해야합니다.
git stash pop
git stash pop
은 가장 최근에 git stash로 감춘 파일을 불러오는 명령어 입니다.
다만 stash list에서 삭제되기 때문에 stash list에서 삭제되기를 원치 않으신다면
git stash apply를 사용하시면 됩니다.
git stash apply
stash list에 있는 특정 stash를 제거하고 싶다면 다음과 같이 사용합니다.
git stash drop stash명
(stash명은 다음과 같은 꼴로 되어 있습니다. stash@{0}, stash@{1}, stash@{2} ... )
git cherry-pick 커밋번호
git cherry-pick
은 다른 브랜치의 특정 커밋을 가져오고 싶을때 사용하는 명령어 입니다.
브랜치를 생성해서 단위 기능을 구현하고 master 브랜치에 합치는 방법에는 크게 두가지 방법이 있습니다. 하나는 git merge
이고, 나머지 하나는 git rebase
입니다.
git rebase
를 사용하는 방법은 다음과 같습니다.
git rebase -i HEAD~rebase할 커밋수
예를들어서 다시 master 브랜치로 이동해 test.txt에 한 문장 쓰고, 커밋하고
이렇게 반복해서 다음과 같이 되었다고 하자
feature/practice
로 이동해서 git rebase -i HEAD~5
를 입력하면 다음과 같이 나옵니다.
(merge이후로 커밋을 5번 했습니다.)
pick은 하나만 남기고 전부 squash하겠습니다.
:wq
로 저장하고 나오면 다음과 같이 그동안의 커밋 메세지들을 확인 할 수 있습니다.
남길 커밋메세지 빼고 전부 주석처리(#) 하거나 지워줍니다.
이제 :wq
로 저장하고 나오면 rebase가 되었습니다.
git log
로 확인해보면
남길 커밋메시지만 남은것을 확인 할 수 있습니다. 마지막으로 test.txt를 열어서 확인해보면
master 브랜치의 최신 내용들이 반영된것을 확인 할 수 있습니다.
conflict를 해결하고, 다음과 같이 터미널에 입력해 줍니다.
git rebase --continue
conflict 해결이 안되어 rebase를 중단하고 싶다면 다음과 같이 입력해 줍니다.
git rebase --abort
merge와 rebase는 브랜치를 합친다는 공통점을 가지고 있지만, 다음과 같은 차이점이 있습니다.
merge의 경우, master 브랜치의 B
지점에서 feature 브랜치가 생성되고 단위 기능을 구현하는데, 단위 기능을 구현하고 master 브랜치에서 feature 브랜치를 merge
하면, B
지점에서 분기되었다는 이력과 수 많은 commit 메세지가 그대로 남게 됩니다.
그러나 rebase의 경우,
B
지점에서 feature 브랜치를 생성하고, 단위 기능 구현후 rebase
하게 되면 base가 B
에서 C
로 이동하고 C
지점을 기준으로 commit 메세지가 재정렬하게 되어, git log들이 줄어들고 Git History가 깔끔해지게 됩니다.