기타

[Git] Learn Git Branching사이트로 Git 기본 개념 다지기 - main

huiyu 2017. 3. 12. 13:38

업무나 프로젝트 진행시 사용하는 GIT

기능은 많다하나 매일 쓰던기능만 쓰고, 제대로 알지 못하고 써서 공부가 필요하던 중 Git을 비주얼로 직접 보면서 공부할 수 있는 사이트를 찾게되었습니다. 처음 접속하면 영어로 뜰 수 있는데 우측하단에 지구모양 버튼을 클릭하면 한국어로도 학습이 가능합니다.

http://learngitbranching.js.org/



위 사이트에서 처음 접속하면 아래와 같이 팝업으로 공부할 메뉴들이 나오게 됩니다.
메뉴로는 메인/원격으로 나뉘며, 메인만 해봐도 Git을 잘 모르던 사람도 기본 개념을 익히면서 유용하게 Git을 활용할 수 있을 것 같네요.
메인만 학습할때 약 2시간 이내에 학습이 가능합니다.


전체적으로 학습하는 내용을 보면, 아래와 같이 이루어져있습니다.

 - commit
 - branch
 - merge
 - rebase
 - HEAD
 - 상대참조 ^, ~ 연산자
 - reset/revert
 - cherry-pick
 - interactive rebase (rebase -i)
 - tag
 - 그리고 위 명령어들을 이용한 응용문제들


사이트 내 연습모드에서 활용할 수 있는 git 명령어는 아래와 같습니다.

  - commit
  - branch
  - checkout
  - cherry-pick
  - reset
  - revert
  - rebase
  - merge


사이트의 전체적인 학습법은 기능에 대한 간단한 설명->예제 이미지 보여줌->연습문제 풀이 로 진행되게 됩니다.
main의 기본적인 학습 내용은 아래와 같습니다.


git commit

처음 배우게 되는 것은 git의 commit, git의 commit은 디렉토리에 있는 파일들의 변경사항을 기록하는 것을 말합니다.
git은 최대한 가볍게 유지하는 특성을 갖고 있어 이전버전과 다음 버전의 변경내역인 스냅샷만을 저장하고 있다고 합니다.


그래서 보통 커밋을 할때 디렉토리 전체를 복사하지 않고 commit을 하게 되면, 이전의 부모 commit을 가르키게 됩니다.
아래 그림의 C1이 C0를 가르키는 것과 같이..


여기서 git commit을 하게 되면 새로운 C2가 생기며 C1을 가르키게 됩니다.
C2에서는 C1과 다른, C1이후의 변동사항이 기록되는 것입니다.


git branch

우선 branch는 "하나의 커밋과 그 부모 커밋들을 포함하는 작업 내역"이라고 알아두고, 예제를 봅니다.

'git branch newImage'를 통해 새로운 newImage라는 브랜치 생성,
현재 master라는 브랜치가 C1을 가르키고 있어 같은 위치에 생성됩니다.


이상태에서 git commit을 하게 되면 C2라는 새로운 commit이 생기고 master가 이를 가르키게 됩니다.
그러나 새로 생성한 newImage 브랜치는 그대로 C1에 있는데,이는 (*)가 master를 가르키고 있어, 현재 브랜치가 master에 있기 때문입니다.


만약 새로 생성한 newImage 브랜치에서 commit을 하고 싶다면 "git checkout" 명령어를 통해 브랜치를 변경하면 됩니다.
git checkout newImage; git commit;


git merge

다음 따로 생성된 브랜치들을 합치는 명령어인 merge


아래 하나의 부모로부터 갈라져 나온 두개의 브랜치가 있습니다.
이 두개의 브랜치를 합치고 싶을 때 merge를 사용합니다.


master 브랜치에서 git merge bugFix를 하게 되면, 아래와 같이 새로운 커밋이 두 부모가 있던 커밋을 가리키게 됩니다.


이제 bugFix에서 master를 합쳐봅니다.


git rebase

브랜치끼리 작업을 합치는 두번째 방법, 커밋들을 모아서 복사한 뒤 다른 곳으로 떨궈? 놓는다고 합니다.
rebase를 사용하면 커밋들의 흐름을 한줄로 한 수 있는 장점을 갖고 있습니다.


두개의 브랜치가 나눠져있습니다.
C1에서 C2, C3라는 기능을 각각 따로 따로 개발을 한 경우입니다.
이제 bugFix브랜치에서의 작업을 master 브랜치 위로 옮겨 놓게 되면,
실제로는 따로 개발했지만 마치 순서대로 개발한 것처럼 보이게 됩니다.


bugFix가 현재 브랜치인 상태에서 git rebase master 명령어 실행하게 되면,

master가 그대로 남아있는데, master를 선택하고 git rebase bugFix 를 실행합니다.
아래와 같이 깔끔하게 정리가 됩니다.


HEAD

다음 개념은 HEAD, HEAD란 현재 체크아웃된 커밋을 가르키는 것으로, 즉 현재 작업중인 커밋을 말합니다.
HEAD는 항상 작업트리의 가장 최근 커밋을 가리키며, 작업트리에 변화를 주는 git 명령어들은 대부분 HEAD를 변경하는 것으로 시작됩니다.


HEAD 분리하기, HEAD를 분리하는 것은 HEAD를 브랜치 대신 특정 커밋에 붙이는 것을 의미합니다. 
일반적으로 HEAD는 브랜치를 가리키는데 명령을 사용하기 전 모습은

HEAD->master->C1인데,
git checkout C1을 하게 되면
HEAD->C1
과 같이 가르키게 됩니다.


상대참조

Git의 상대참조란 우리가 기억하는 지점(브랜치나 HEAD)을 기준으로 다른지점으로 이동하는 작업을 말합니다.
여기서는 한 커밋위로 올리는 ^, 한번에 여러커밋을 올리는 ~<num> 연산이 있습니다.


이렇게 C2를 카르키는 master브랜치에서 한 커밋 위로 이동하고 싶다면,


git checkout master^
C1으로 HEAD가 이동한걸 볼수있습니다.
또한 git checkout master^^를 통해 부모의 부모 커밋으로도 이동이 가능합니다.


상대참조는 브랜치 이름 외에도 HEAD를 통해서도 이동이 가능합니다.
git checkout HEAD^


이렇게 ^연산자를 통해 계속 올라갈 수도있지만 한번에 올라가는 갯수를 지정해주는 ~연산자도 있습니다.


git checkout HEAD~4


브랜치 강제로 옮기기

-f옵션을 통해 브랜치를 통정 커밋에 직접 재지정할 수 있습니다.


git branch -f master HEAD~3


git reset

git에서 작업한 내용 되돌리기


git reset HEAD~1


git cherry-pick

특정 커밋들을 가져온다.


master 브랜치(현재 C5 커밋)에서 C2와 C4의 커밋을 가져오고 싶다.

git cherry-pick C2 C4


이런식으로 가져오게 됩니다.


큰 개념들은 여기까지 학습을 하고 이외에 이런명령어들을 응용한 응용문제 풀이들이 사이트에 있습니다.
쉬운문제부터 복잡한 응용문제까지..

위 내용들만 학습하셔도 git의 기본적인 부분은 알게되면서 자신이 원하는대로 사용이 가능합니다.
직접 사이트에서 처음부터 차근차근 학습하셔 보시길 추천드립니다.


728x90
반응형