[Git] branch

haejun-kim·2020년 7월 5일
0

[Git & Github] 

목록 보기
2/3
post-thumbnail

git의 공식 매뉴얼을 확인하고 싶으면 pro Git 요기서 확인할 수 있다. 한국어도 지원되니 조금 더 이해하기 편할 것 같다.

branch를 만든다 - 작업을 진행하다가 필요에 의해서 작업이 분기되는 현상
각각의 branch는 client에게 제공하는 branch / 원래 있었던 작업 파일 branch로 나뉘어짐.
branch - 내가 하던 작업에서 따로 분리해서 버전관리가 필요한 경우 branch를 생성 한 뒤 작업을 함.


branch 만들기

어떤 branch가 있는지 확인하고, 생성하고, 여러 branch를 옮겨다닐 수 있는 명령어들을 확인해보자.

branch 확인

git branch

명령어를 실행할 경우 * master와 같은 메세지를 확인할 수 있는데 * 는 현재 내가 사용하고 있는 branch의 이름을 나타내준다. 따라서 * master는 지금 master라는 branch를 사용하고 있다. 라는 뜻이다.
이 상태에서 새로운 branch를 만들어 주기 위해 다음의 명령어를 입력하면 된다.

branch 생성

git branch "생성하고자 하는 branch의 이름"

위 명령어를 실행한 후 다시 git branch명령어를 입력하면 최초 자동으로 생성 된 master와 내가 방금 생성한 이름의 branch가 있다. 아직은 master branch를 사용중이기 때문에 *master 앞에 붙어있다. 이제 새로 생성한 branch를 사용해보자.

branch 바꾸기

git checkout "생성한 branch 이름"

'master에서 checkout하고 새로운 branch로 이동하겠다.' 의 정도로 이해하면 될 것 같다.
위 명령어를 입력한 뒤 다시 git branch로 현재 상태를 확인해보면 *가 내가 생성한 branch로 옮겨간 것을 확인할 수 있다. 이제 master가 아닌 새로운 branch를 사용할 수 있다. 새로운 branch를 생성한 경우 기존 master에 있던 상태를 전부 그상태 그대로 복사해서 새로운 branch를 만드는 것이다.

( branch를 생성하고 바로 그 branch에 checkout하려면

git checkout -b "name"

으로 한번에 할 수 있다! )


branch 정보 확인

branch는 작업을 분기해서 관리하기 때문에 현재 어떤 상황인지에 대한 확인할 수 있어야하기 때문에 branch의 정보들을 확인하는 작업이 꼭 필수적이다. 어떻게 branch의 정보를 확인할 수 있는지 알아보자.

branch간의 차이점 확인

위의 단계에서 새로운 branch를 만들었다. 나는 이 branch의 이름을 exp 라고 만들었기 때문에 앞으로는 exp라고 쓰겠다. 이제 masterexp branch간의 차이점을 확인해보자. git log 명령어로 여러가지 로그들을 확인할 수 있지만 branch에 대한 정보를 얻기에는 부족하다. 그렇기 때문에 다음의 명령어를 입력해보자.

git log --branches --decorate

위의 명령어는 현재 자신이 checkout 되어있는 branch말고 이 저장소에 있는 모든 branch를 보여준다.

출력창의 우측을 확인해보면 (master)와 같은 문구가 생성되었다. 이는 master branch에서 가장 최근 커밋이 2라는 뜻이고, 그 상단에 expexp branch의 가장 최근 커밋은 4라는 뜻이며 HEAD는 현재 exp라는 branch에 checkout 되어 있다. 라는것을 알려준다. 이것만으로도 무언가 눈에 확 띄지 않는다면 다음 문구를 추가해서 입력햅자.
( 어떤 차이가 있는지 확인하기 위해 git log --branhesgit log --branches --decorate를 각각 입력해보았는데 결과는 똑같이 출력됐다. 업데이트됐나 싶다.😅 )

git log --branches --decorate --graph

위 명령어를 입력하면 출력창의 좌측에 빨간색 줄이 보인다.

이것은 흐름을 보여주는것인데 이상태로는 그냥 일직선으로만 느껴지니 무슨 차이가 있나 싶다. 그렇기 때문에 효과를 느끼기 위해서는 여러개의 branch가 각각의 길을 걷고 있을 때 이 차이가 눈에 확연히 드러난다. master branch에 새로운 커밋을 만들어보자.

하나만 추가했더니 큰 차이가 느껴지진 않지만, 중간에 분기점이 생겼고 줄의 색깔도 좀 변했다. 이런식으로 여러개의 branch가 커밋의 양이 많아진다면 --graph를 사용하면 훨씬 가시적으로 확인할 수 있을 것 같다. 이것보다 조금 더 축약적으로 한눈에 들어오는 정보가 필요하다면

git log --branches --decorate --graph --oneline

--oneline을 추가해주자. 그렇다면 훨씬 축약적으로 한눈에 모든 정보를 나타내주는것을 확인할 수 있다.

branch간의 차이점 비교

branch간의 어떠한 차이점이 있는지를 확인하기 위해서는

git log master..exp

이렇게 비교하고 싶은 branch의 이름을 ..을 사이에 두고 입력해주면 된다. 여기서 주의해야할 점은 입력하는 branch의 순서이다.

git log A..B

의 경우 branch A에는 없고 B에는 있는것들을 보여준다. 하지만 반대로

git log B..A

로 입력하면 branch B에는 없고 A에는 있는것들을 보여준다.

git log -p A..B

의 명령어를 입력하면 각 branch의 소스코드별로 차이점도 함께 확인할 수 있다.

만약 branch의 현재 상태를 비교하고 싶다면 다음의 명령어로 비교할 수 있다.

git diff A..B

branch 병합(merge)

작업을 분기를 해서 각자의 작업이 각각의 히스토리를 만들어가고 있었는데 어느 시점에서 이 작업들을 병합해야하는 경우가 발생할 수 있다. 이런 경우 사용되는게 branch 병합이다. 현재 exp에 있던 내용을 master에 병합해보도록 하자.

병합

master로 병합을 할 예정이기 때문에 먼저 master로 checkout을 한 뒤 merge라는 명령을 해준다.
관계에 유의하도록 하자.

A로 병합하려면 A로 checkout을 하고 병합 할 branch(B)를 merge 시켜주는거다.

git merge exp

이렇게 하면 에디터가 열리면서 Merge branch 'exp'라는 내용의 커밋이 만들어지는것이다.
로그로 확인해보면

조금 더 가시적으로 성공적으로 병합된것이 눈에 보인다.
이 작업으로 5의 내용을 가진 부모와 3의 내용을 가진 부모. 이렇게 두개의 부모를 가진 새로운 커밋이 생성 된 것이다. 같은 방법으로 exp로 checkout 한 뒤 다음의 명령어를 입력하면

git merge master

이제 masterexp는 완전히 동일한 내용을 가진 파일이 된다. 그렇기 때문에 exp 브런치를 삭제해보자.

branch 삭제

git branch -d exp

exp자리에는 삭제하고싶은 branch의 이름을 적어주면 된다. 그렇게 하면 branch가 삭제되었다는 메세지가 출력되고, 다시 로그를 확인해보면 exp라는 branch가 사라진것을 확인할 수 있다.


stash

master 브런치에서 f1.txt 라는 파일을 만들었다. 그리고 exp라는 브런치를 생성한 뒤 checkout하고 exp 브런치에서 f1.txt파일을 수정하다가 master 브런치로 옮겨야할 경우 master 로 checkout하고 git status를 확인해보면 exp 브런치에서 작업한 내용이 master 브런치까지 영향을 미치는것을 확인할 수 있다.

그럼 아직 수정이 끝나지 않아서 커밋하기도, checkout하기도 애매한 경우 사용되는것이 stash!

숨기기

git stash or git stash save

git stash만 명령을 줘도 되고 조금 더 명확하게 git stash save라고 명령을 주어도 된다.

명령을 주면 성공적으로 저장이 되었다는 메세지가 출력되고 status를 확인해보면 커밋할 작업 내용이 없다고 출력된다. 성공적으로 파일이 숨겨진 것이다.

다시 꺼내기

이제 숨긴 파일을 다시 꺼내서 작업을 하려는 경우 에는

git stash apply


apply를 통해 숨겼던 파일을 다시 꺼내온 뒤 status를 확인해보면 숨겼던 f1.txt가 다시 모습을 드러낸 것을 확인할 수 있다.

복원하기

reset을 한 경우 다시 복원할 수도 있다.

git reset --hard

git stash apply

git stash list

명령어를 통해서 branch가 갖고 있는 일종의 주소값을 확인할 수 있고, 이 주소값에서 명시적으로 사용자가 삭제해주지 않는 이상은 apply를 통해 복구가 가능하다.
apply를 사용했을 때 stashlist중 가장 위에 있는 상태를 기준으로 복원한다!

list 삭제

여러개의 stash list중에서 가장 위의 상태로 복원하기 때문에 여러개의 list가 있으면 복원할 시점이 상당히 복잡히 느껴질수도 있다. 그렇기 때문에 이러한 list를 삭제하는것의 필요성도 느껴진다. list를 삭제하기 위해서는

git stash drop

의 명령어로 가장 위에 있는 list가 삭제된다.

apply + drop

두개의 명령어를 치기는 상당히 번거롭기 때문에 한번에 위의 동작을 수행해주는 명령어가 있으면 상당히 유용할거라 생각된다.

git stash pop

위 명령어를 입력하면 apply함과 동시에 drop의 기능까지 한번에 수행한다.

✅ 한가지 확인해야할 점은 git stash 기능은 파일이 Untracked상태에서는 수행을 하지 않는다. stash기능을 사용하려면 버전 관리가 되고 있는 상태여야지만 기능을 사용할 수 있다.

0개의 댓글