Study Programming/Git

Git 브랜치(Branch) 다루기1 - 목록, 생성, 이동, 커밋 확인, 히스토리

네모메모 2021. 7. 29. 17:30
반응형

 

 


브랜치 목록 : $ git branch

- 로컬 저장소의 모든 브랜치 목록을 보여준다. ('*' 표시가 붙은 것이 현재 작업하는 브랜치)

- ex1) 커니코틀린 샘플예제 브랜치를 clone해 온 로컬에서 'java' 브랜치 생성한 경우

$ git branch
* java
  master

 

 

   

- '-a' 옵션 : 원격 브랜치를 포함한 모든 브랜치 목록을 확인 

$ git branch -a

   ㄴ> ex2) ex1에서 커니코틀린 샘플예제의 원격 브랜치까지 모두 조회 시

$ git branch -a
* java
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/arch-components-lifecycle
  remotes/origin/arch-components-room
  remotes/origin/arch-components-viewmodel
  remotes/origin/dagger-step-1
  remotes/origin/dagger-step-2
  remotes/origin/java
  remotes/origin/kotlin-step-1
  remotes/origin/kotlin-step-2
  remotes/origin/kotlin-step-2_cache-on-viewholder
  remotes/origin/master
  remotes/origin/rxjava
  remotes/origin/rxjava-rxbinding

 

 

 


 

브랜치 생성 : $ git branch <BranchName>

-  ※주의) '$ git branch' 명령은 브랜치를 생성만 하고 브랜치를 옮기지 않는다,

              새로 만든 브랜치도 지금 작업하고 있던 마지막 커밋을 가리킨다.
             

- ex1) testing 브랜치 생성

$ git branch testing

  ㄴ>  '그림 12. 한 커밋 히스토리를 가리키는 두 브랜치'
      


 

다른 브랜치로 이동 : $ git checkout <BranchName>

 -  '$ git checkout <이동할 브랜치명>' 명령으로 다른 브랜치로 이동가능

     ( '이제부터 이 브랜치를 사용할거야!'라고 선언하는 것이 'checkout'이다 )


 -  ※주의) 위 명령어 사용 시 당연히 로컬 브랜치를 가리키는 'HEAD’가 이동된다.


 -  ※주의) 브랜치를 이동 시 내 로컬의 워킹 디렉토리의 파일들이 '이동할 브랜치에서 가장 마지막 스냅샷'으로 변경된다.

   ㄴ> Git은 자동으로 워킹 디렉토리에 파일들을 추가하고, 지우고, 수정해서 Checkout 한 브랜치의 마지막 스냅샷으로 되돌려 놓는다

   

 -  주의) "아직 커밋하지 않은 파일이 Checkout 할 브랜치와 충돌 나면 브랜치를 변경할 수 없다."

      파일 변경시 문제가 있어 브랜치를 이동시키는게 불가능한 경우 Git은 브랜치 이동 명령을 수행하지 않는다.
      (이런 문제를 다루는 방법은(주로, Stash이나 커밋 Amend에 대해) 나중에 Stashing과 Cleaning을 통해 가능하다고 함)
      브랜치를 변경할 때는 워킹 디렉토리를 정리하는 것이 좋다. 

 

 


 - ex3) testing 브랜치로 이동

$ git checkout testing

 

ㄴ> 'HEAD'는 이제 testing 브랜치를 가리킨다 >> 그림 14


ex4) ex1~3 수행 후 새로 커밋을 한 번 수행 >> 그림 15. HEAD가 가리키는 testing 브랜치가 새 커밋을 가리킴

$ vim test.rb
$ git commit -a -m 'made a change'

ㄴ> 새로 커밋해서 testing 브랜치는 앞으로 이동했다. 하지만, master 브랜치는 여전히 이전 커밋을 가리킨다. 


 - ex5) ex4 상태로 master 브랜치로 이동

$ git checkout master

 

ㄴ> master 브랜치가 가리키는 커밋을 'HEAD'도 가리키게 하고, "'워킹 디렉토리'의 파일도 그 시점으로 되돌려진다." 

      그림 16. HEAD가 Checkout 한 브랜치로 이동함
ㄴ> 앞으로 커밋을 하면 다른 브랜치의 작업들과 별개로 진행되기 때문에 testing 브랜치에서 임시로 작업하고 

      원래 master 브랜치로 돌아와서 하던 일을 계속할 수 있다.

 - ex6) ex5 상태로 파일을 수정하고 다시 커밋을 해보자.

$ vim test.rb
$ git commit -a -m 'made other changes'

ㄴ> >> 그림 17. 갈라지는 브랜치

 

 

 


 

브랜치 생성 및 이동 : $ git checkout -b <BranchName>

   - 브랜치 이동하는 '$ git checkout' 명령에 '-b 옵션' 사용하면 브랜치 생성 후 생성된 브랜치로 이동(Checkout)한다.

   - cf) 브랜치 생성하는 '$ git branch <BranchName>'은 생성만 하고 이동은 하지 않는다!!

 

- '-b' 옵션 : 브랜치를 생성하고 생성된 브랜치로 이동(Checkout)한다.

$ git checkout -b <BranchName>

   ㄴ> 'HEAD' 는 새로 생성된 브랜치를 가리킨다

 

 


 

브랜치가 가리키는 커밋 확인: $ git log --decorate

-  '$ git log'명령어에 '--decorate 옵션'을 사용하면 쉽게 브랜치가 어떤 커밋을 가리키는지도 확인 가능하다.

-  ex2) 

$ git log --oneline --decorate
f30ab (HEAD -> master, testing) add feature #32 - ability to add new formats to the central interface
34ac2 Fixed bug #1328 - stack overflow under certain conditions
98ca9 The initial commit of my project

 

ㄴ> 'master' 와 'testing' 이라는 브랜치가 f30ab 커밋 옆에 위치하여 이런식으로 브랜치가 가리키는 커밋을 확인할 수 있다. 

        >> 그림 13. 현재 작업 중인 브랜치를 가리키는 HEAD

 

 

 


 

현 브랜치 히스토리 조회 (= 일종의 현재 브랜치 족보 조회)
  : $ git log --oneline --decorate --graph --all

 -  현재 브랜치가 가리키고 있는 히스토리가 무엇이고 어떻게 갈라져 나왔는지 보여준다.

 - 가장 이전 커밋부터 맨 아래서 위로 출력된다. (아래(가장예전)서부터 위(최신)로 가는 방향이 시간순)

 

- Ex) 현재 그림 17. 갈라지는 브랜치와 같은 상태일 때 브랜치 히스토리 조회

$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) made other changes
| * 87ab2 (testing) made a change
|/
* f30ab add feature #32 - ability to add new formats to the
* 34ac2 fixed bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project

ㄴ> 7line : 최초 커밋은 맨 아래라인의 98ca9

ㄴ> 7-5line : 98ca9 -> 34ac2 -> f30ab 로 하나의 브랜치에서 커밋되다가

ㄴ> 5-2line : f30ab 커밋 후 브랜치가 나뉘어졌다.

ㄴ> 3line : 87ab2는 'testing'브랜치에서 커밋

ㄴ> 2line : c2b9e는 'master'브랜치에서 커밋

 

 

 



∴ 하나의 프로젝트가 서로 독립적인 여러 브랜치로 갈라져 각자 작업된 커밋사항은 각 브랜치에 존재한다. 
  ㄴ>> Git 사용자는 이렇게 커밋 사이를 자유롭게 이동하다가 때가 되면 두 브랜치를 Merge 한다. 

         간단히 $ git branch, $ git checkout, $ git commit 명령을 써서 말이다.

 

 

 

 

 

 

 


 

END!


스터디 도움 참조 블로그 (References)

- 3.1 Git 브랜치 - 브랜치란 무엇인가
https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

- 누구나 쉽게 이해할 수 있는 Git 입문
https://backlog.com/git-tutorial/kr/

Git 헷갈리는 개념잡기2

- git--distributed-even-if-your-workflow-isnt (Pro Git Book)
https://git-scm.com/book/en/v2

- 브랜치 명령어
https://backlog.com/git-tutorial/kr/reference/branch.html

 

 

 

 

 

 

 

 

 

반응형