Git Branch Command
Computer Science/OpenSource+Git

Git Branch Command

# Git에서 Branch가 왜 필요한가?

 : branch를 이용함으로서 development process의 다양한 기능을 따로 개발할 수가 있다. 이를 통해 main branch는 문제가 생긴 코드에서 자유로워진다. 기능은 각 branch에서 따로 개발하고 나중에 merge하게 된다.

 

#Master Branch

 

-> 만약 git에서 version control을 시작하면, default branch는 'master' branch이다.

: master branch는 가장 최신의 commit을 가리킨다. 즉, branch는 commit을 향한 포인터라고 볼 수 있다.

- master branch에 main code를 유지하면서, 우리는 main code를 수정하거나 새로운 feature를 개발할 수 있다.

 

#Branch

 : 독립적으로 개발이 가능한 line을 branch라고 한다. 

-> 각 브랜치는 각각 독립적으로 작용하며, main code/new feature implementation에 branch를 사용할 수 있다. (이후에 merge를 통해서 master branch에 코드를 통합할 수 있다)

 

 

#Setting Practice Environment for Branch

#새로운 디렉토리와 git 환경을 조성한다
mkdir manual
cd manual 
git init
ls -al

#create cal.py
vim cal.py

#staging&commit
git commit -am "create a class fourcal"

git log #이를 통해 Head->master를 향하고 있는걸 확인할 수 있다.

#add method를 더하고 저장한다
vim cal.py
git commit -am "Add a add method in Fourcal"

#sub method를 더하고 stage&commit한다
vim cal.py
git commit -am "Add a sub method in FourCal"

git log

 

HEAD->는 multiple branch들 중에 현재 일하고 있는 branch를 가리킨다.

 

#Create New Branch

# checking all the branches in a git repository
git branch

#create a new branch
git branch safecal #safecal이라는 새로운 branch가 생성되었다.

 

head는 master를 가리키고 있으므로 현재 branch는 master임을 알 수 있다.

#create another branch
git branch morefourcal
git branch #master,morefourcal,safecal 세개가 생성된 것을 확인할 수 있다.

branch는 기존의 master에서 갈라져 나온 것이므로 그때까지의 master branch의 코드나 커밋을 승계한다.

 

#Navigating between branches

#checking all branches 
git log #모든 브랜치에서 마지막 commit이 "add a sub method in fourcal"임을 확인 가능

#adding a new commit to check a change
vim cal.py
git commit -am "Add a mul method in Fourcal"

#checking all branches using the git log command
git log --oneline

- git log --oneline을 통해서 그동안의 commit 내용을 간결하게 확인 가능하다.

-> master branch에서는 mul method를 추가했으므로 mul method가 가장 최근 커밋이다.

-> safecal, morefourcal branch는 생성된 이후부터 독립적인 branch이므로 sub method 추가 이후로 커밋이 존재하지 않는다.

 

#switch branch
git checkout safecal

#checking the current branch using the git log command
git log --oneline

- 지금은 head가 safecal을 향하므로, safecal branch 최신 커밋 add a sub method in FourCal이다. 

- safecal branch의 commit 내용만 표기한다.

(같은 commit을 최신 커밋으로 가리키는 branch는 함께 표기함)

-> 확인해보면 master branch와 다르게 fourcal에 mul method는 존재하지 않는다. master와 safecal branch는 독립적으로 서로 영향을 끼치지 않음을 확인할 수 있다.

 

 

# Commit in New Branch

#Add SafeCal class to cal.py and save it
vim cal.py

#div method의 output을 출력하는 print_safecal.py를 추가한다
vim print_safecal.py

#stage&commit
git add . # . 를 통해 모든 modified file을 추가 가능하다
git commit -m " add a class safecal"

git log --oneline

: 현재 head는 safecal branch를 가리키고 있으며, 해당 branch의 가장 최신 커밋은 "add class safecal"이다.

 

 

#Checking branch information

 

#모든 브랜치의 commit 확인시 --branches 옵션 사용한다.
git log --oneline --branches

 

#commit과 branch들 사이의 관계를 알고싶으면 --graph 옵션을 사용한다
git log --online --branches --graph

: "add mul method" commit의 자식이 "add class safecal", "add mul method"임은 add commit이 더 이전에 생성되었음을 의미한다.

: safecal, master branch가 "add sub method" commit까지만 내용이 같은것은 그 이후에 독립적으로 다른 commit이 이루어져있음을 의미한다.

 

#git log <branch 1>..<branch 2>를 이용해 두 branch사이의 차이 알 수 있다.
git log safecal..master

-> 이를 통해 safecal에는 없고 master branch에만 있는 커밋을 확인할 수 있다.

 

#Merging Branches

: Branch를 merging하는데 세가지 케이스가 있다
-> 아예 다른 파일을 병합/ 같은 코드의 다른 위치 수정하여 병합/ 같은 코드의 같은 위치 수정후 병합

- Merging different files

#create new directory in home directory and initialize
cd ~
git init manual-2
cd manual-2

# Staging & Commit after creating cal.py
vim cal.py
git add cal.py
git commit -m "create a cal.py"

# Creating a new branch
git branch sub
git log --oneline

branch들은 최신 커밋을 가리키므로 master/sub는 같은 커밋을 가리킨다

 

#Add div method to Fourcal class (master에서 수정)
vim cal.py

#Staging&Commit
git add cal.py
git commit -m "add div method"
git log --online

master가 가리키는 커밋은 바뀐다.

#checkout to the sub branch
git checkout sub

#Stage&commit after create print_add.py
vim print_add.py
git commit -am "create a print_add.py"

master branch에서 분화되어 새로운 커밋을 가리키기 시작함
branch들 사이의 관계를 확인할 수 있다.

#checkout to master branch
git checkout master

# merging sub branch into the master branch
git merge sub

main branch에는 없고 sub branch에만 존재하는 commit을 master branch에 합친다고 생각하면 편하다.
master directory에 모두 merge되었음을 확인할 수 있다.

 

- Merge after we edit different location in the same code

#create new directory & init
cd ~
git init manual-3
cd manual-3

#staging & commit after creating cal.py
vim cal.py
git commit -am "create a cal.py"

#creating a new branch
git branch sub

#master branch에서 코드를 수정하여 커밋함
vim cal.py
git commit -am "master work"

#sub branch로 이동해 코드를 수정하여 커밋함
git checkout sub
vim cal.py
git commit -am "sub work"

#master로 다시 이동해 merge를 시도함
git checkout master 
git merge sub

master branch의 코드와 sub branch의 코드가  모두 포함되어 merge된 것을 확인할 수 있다.

 

- Merging when we edit in same location in same code

#create new directory & init
cd ~
git init manual-4
cd manual-4


#stage&commit after creating cal.py
vim cal.py
git commit -m "create a cal.py"

#creating a new branch
git branch sub
git log --oneline

#edit&merge&commit in master branch
vim cal.py #add code를 return만 존재하게 변경함
git commit -am "master work"


#sub branch로 이동하여 edit&merge&commit 진행
git checkout sub
vim cal.py #add code를 sub code로 바꾼다 (단 같은 위치)
git commit -am "sub work"

#sub branch와 master branch merge시 conflict 발생한다.
git checkout master 
git merge sub

 

두 코드 사이에 conflict가 발생했음을 알 수 있다.
merge된 코드를 열어 필요없는 부분을 모두 삭제한다.
잘 merge되었음을 확인할 수 있다.

+) 같은 코드가 서로 다른 위치에서 수정되었으면 : auto merging 가능

   but, 같은 코드가 같은 위치에서 수정되면 conflict가 발생하므로 병합시 한번 확인 후 수정한다.

 

# Deleting Unecessary Branch after merging

#Checking a list of branches
git branch

#delete branch using -d option
git branch -d sub #이 작업은 master branch에서만 가능하다

 

#Managing Branches

  # Checkout & Reset in the branch

# create new directory & init
cd ~
git init manual-5
cd manual-5

# Staging & Commit after creating cal.py
vim cal.py
git add cal.py
git commit -m "create a cal.py"

#create new branch
git branch mul

#create new file in master branch
vim print_sub.py
git commit -am "create a print_sub.py"


#create new file in the mul branch
git checkout mul
vim print_mul.py
git commit -am "create a print_mul.py"

지금 head는 mul에 존재한다.

=> 모든 commit을 출력한 이후에 revert하고 싶은 commit의 hash를 복사한다.

-> Create a print_sub.py commit 시점으로 돌아가보자.

 

#최근 커밋의 hash를 복사해 reset을 진행한다
git reset 9369e78

#commit을 확인한다.
git log --oneline --branches

 

print_mul 커밋은 사라지고 mul 도 print_sub.py를 가리킨다.

=> branch의 커밋이 사라지고 이전 시점으로 revert되면 해당 branch는 master branch의 최신 커밋을 가리킨다.

 

 

# Hiding and Reverting Files being editied

-> 수정된 파일을 숨길때 : git stash

#master에서 stage&commit
vim cal.py
git commit -am "create a cal.py"

#add a mul method to the fourcal class
vim cal.py
git status #modified 상태지만 unstaged 되었다.

#Hiding the file waiting to be committed
git stash

-> 숨겨진 stash list를 확인하고 싶을 때 : git stash list

-> stash list에서 가장 최근 item을 pop하고 싶을 때 : git stash pop

'Computer Science > OpenSource+Git' 카테고리의 다른 글

shell command 확장과 명령어 치환  (0) 2021.12.11
Shell Environment  (0) 2021.12.11
Git Version Control Command  (0) 2021.10.24
Git Overview/ Linux Basic Command  (0) 2021.10.24
OSS Tools  (0) 2021.10.24