# 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가 생성되었다.
#create another branch
git branch morefourcal
git branch #master,morefourcal,safecal 세개가 생성된 것을 확인할 수 있다.
#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
#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
#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"
#checkout to master branch
git checkout master
# merging sub branch into the master branch
git merge sub
- 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
- 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
+) 같은 코드가 서로 다른 위치에서 수정되었으면 : 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"
=> 모든 commit을 출력한 이후에 revert하고 싶은 commit의 hash를 복사한다.
-> Create a print_sub.py commit 시점으로 돌아가보자.
#최근 커밋의 hash를 복사해 reset을 진행한다
git reset 9369e78
#commit을 확인한다.
git log --oneline --branches
=> 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 |