Git

깃과 브랜치

코딩공부 2021. 12. 29. 02:04

[ 5일 완성 코스 2일차 ]

 

03장 깃과 브랜치

03-1 브랜치란?

버전 관리 시스템에서는 줄기를 뻗듯이 여러 갈래로 펴져 가는 데이터 흐름을 말함

 

브랜치 기능 

1. 분기

2. 병합


03-2 브랜치 만들기

$ git branch

branch 들의 정보를 확인 할 때 사용 

 

 

$ git branch apple

현재 저장소에 있는 데이터 들을 그대로 가지고 다른 갈래의 branch가 생성 됨

HEAD branch인 master를 branch 해서 apple branch를 생성

 

브랜치 사이 이동하기 

$ git switch 

// 예전 버전에서는 git checkout 을 사용

 

$ git switch apple

HEAD branch인 master 에서 apple branch로 이동 

 

 

커밋 간단하게 확인하는 옵션 

$ git log --oneline --branches --graph

// --oneline : 한줄씩 간단하게 커밋을 나타내줌
// --branches : 현재 git에 있는 branch들의 위치를 나타냄
// --graph : 어디서 분기 했는지 알 수 있음

oneline
oneline brancehs
oneline branches graph

graph 그림을 보면 work3에서 apple branch의 apple content 4 와 master branch의 master content 4 가 분기 했음을 알 수 있음 

 

 

03-3 브랜치 정보 확인하기

새 브랜치에서 커밋하고 상태 확인 

 

 

브랜치 사이의 차이점 알아보기

$ git log master..apple
// master브랜치와 apple 브랜치의 차이점을 확인 가능 (master 기준)

$ git log apple..master
// apple브랜치와 master 브랜치의 차이점을 확인 가능 (apple 기준)

 

03-4 브랜치 병합하기

$ cd ~

$ git init manual-2 
// git init을 사용하면 mkdir manual-2 , cd manual-2 , git init 을 한번에 작업 가능 

$ cd manual-2
// git init을 사용 하더라도 한번에 작업은 되지만 해당 디렉토리로 이동하는 것은 아니라서 변경해야함

 

서로 다른 파일 병합 하기

현재 master branch에는 master.txt, o2 branch에는 o2.txt 파일이 생성되어 있음

$ git merge o2
// git switch master에서 작업

 

master branch에서 o2를 병합 했을 경우 merge message를 입력하면 파일이 다른 경우 그대로 병합 처리됨.

 

같은 문서의 다른 위치를 수정했을 때 병합하기

$ vim work.txt

// 하단은 work.txt 파일 내용 

#title1
content1


#title2
content2

master 에서는 content1 부분을 master content 로 수정

o2 에서는 content2 부분을 o2 content 로 수정

 

$ git merge o2
// master branch에서 실행

 

다른 파일 병합할 때와 마찬가지로 merge meaage를 입력하면 그대로 병합처리 됨.

 

$ cat work.txt

// 하단은 work.txt 파일 내용 

#title1
master content


#title2
o2 content

 

같은 문서의 같은 위치를 수정했을 때 병합하기

$ vim work.txt

// 하단은 work.txt 파일 내용 

#title
content

master, o2 에서 content 부분을 master content,  o2 content  로 수정

 

$ git merge o2
// master branch에서 실행

 

 

(master|MERGING) 이라고 변경되는 것을 볼 수있음

충돌이 생긴 work.txt에서 직접 처리 해야 merge를 완료 할 수 있음

 

$ vim work.txt

// 하단은 work.txt 파일 내용 

#title
content
<<<<<<< HEAD
master content 
=======
o2 content 
>>>>>>> o2

work.txt 파일을 봤을때 충돌 나는 부분은 <<<<< ===== >>>>> 부분으로 표시 되어 있는 것을 볼 수있음

 

해당 내용들을 직접 수정 처리 

$ vim work.txt

// 하단은 work.txt 파일 내용 

#title
content
master content 
o2 content

 

직접 수정 처리를 하고 저장소로 commit을 시키면 merge처리가 완료된다. 

 

처리 후에는 master|MERGING이 다시 master로 변경된 것을 볼 수있다.

 

만약 여러개의 파일을 병합했다면 충돌이 발생한 파일을 제외하고는 자동으로 master branch에 병합됨 

 

병합이 끝난 브랜치 삭제하기

$ git branch -d o2

 

삭제 된 branch는 다시 같은 이름으로 (o2)로 branch를 생성하게 되면은 삭제 전 데이터로 다시 불러 올 수 있음

실제로 삭제된것이 아니라 git 흐름 속에 감추는 것으로 생각하면 됨

 


03-5 브랜치 관리하기

브랜치에서 switch와 reset의 작동 원리

master branch가 c1.txt 파일을 을 commit하고 sub branch를 생성하고 master branch에 c2.txt파일을 새로 commit 함

그리고 sub branch에서 s1.txt파일을 생성 했을때 현재 master는 c2.txt가 있는 두번째 commit을 가르키고 있고, sub branch는 s1.txt가 있는 commit을 가르키고 있음

 

$ git reset 47ae2ef
// 47ae2ef 는 (master)가 가르키고 있는 c2 commit의 hash 값

 

원래 sub는 s1 commit을 가르키고 있었지만 reset을 처리하면서 master가 가르키고 있는 c2 commit을 가르키게 됨

 

정리

어떤 branch에 있는 commit 이든 지정 할 수있으며, 명령을 수행한 뒤에는 branch와 연결이 끊긴 커밋은 삭제 됨

 

수정 중인 파일 감추기 및 되돌리기 - git stash

브랜치에서 파일을 수정하고 커밋하지 않은 상태에서 급하게 다른 파일을 커밋해야 할 경우

급한대로 그냥 두어도 상관은 없지만 계속 커밋하라는 메시지가 출력되어 번거롭기 때문에 잠시 감추고 당장 필요한 작업을 우선 처리하고 다시 꺼내올 수있음.

 

현재 f1.txt, f2.txt가 스테이징 되지 않고 파일 수정만 된 상태

 

$ git stash

 

git stash를 한다음 status를 보면 tree가 clean인 것을 볼 수있음

 

stash상태에서 다른 용무를 처리 하고 나서 다시 수정 파일을 불러올 수 있음

 

$ git stash pop