관리자 글쓰기
git 명령어 정리2
2022. 11. 10. 11:08 - pingu-s

모든 버전 관리 시스템에는 '브랜치(branch)'라는 개념이 있다. 버전 관리 시스템에서는 나무가 가지에서 새 줄기를 뻗듯이 여러 갈래로 퍼지는 데이터 흐름을 가리키는 말로 사용한다.

참고자료: https://git-scm.com/book/ko/v2/Git-브랜치-브랜치란-무엇인가

 

Git - 브랜치란 무엇인가

3.1 Git 브랜치 - 브랜치란 무엇인가 모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와

git-scm.com

 

master 브랜치에서 뻗어 나오는 새 브랜치를 만드는 것을 '분기(branch)한다'라고 한다.

분기했던 브랜치를 master 브랜치에 합치는 것을 '병합(merge)한다'라고 한다.

master 브랜치가 가장 최신 커밋인 'work 3'을 가리키고 있고, HEAD가 master 브랜치를 가리키고 있다. HEAD는 여러 브랜치 중에서 현재 작업 중인 브랜치를 가리킨다.

 

새 브랜치 만들기

 

깃에서 브랜치를 만들거나 확인하는 명령은 git branch이다.

$ git branch

 

master는 특별한 브랜치이다. 저장소를 만들 때 기본적으로 master 브랜치가 만들어진다. git log 명령을 사용해 커밋을 확인해 보면 (HEAD -> master, apple)로 바뀌어 있는데 이 표시는 저장소에 master, apple 2개의 브랜치가 있고, HEAD -> master이므로 현재 작업 중인 브랜치는 master 브랜치라는 의미이다. HEAD는 작업 중인 브랜치를 가리키는 포인터라고 생각하면 쉽다.

 

브랜치 사이 이동하기 - git checkout

 

work.txt에 'master content 4' 내용을 추가한 후 커밋한다.

git log 명령에 --oneline 옵션을 추가하면 한 줄에 한 커밋씩 나타내 주기 때문에 커밋을 간략히 확인할 때 편리하다.

최신 커밋인 'master content 4'는 master 브랜치에만 적용되어 있고 ms와 google, apple 브랜치는 아직 'work 3' 커밋 상태이다. 다른 브랜치로 이동하려면 git checkout 명령 다음에 브랜치 이름을 사용한다.

 

$ git checkout apple

 

작업 브랜치를 apple 브랜치로 바꾸면 최신 커밋 해시에서 HEAD가 apple을 가리키고 있다. 즉 apple 브랜치의 최신 커밋은 처음 분기될 때인 'work 3' 커밋 그대로이다. cat work.txt로 내용을 확인해보면 content 3 행까지만 있다. apple 브랜치가 master에서 분기된 이후에 master 브랜치에 추가된 커밋은 apple 브랜치에 영향을 미치지 않았단 것을 알 수 있다.

 

git log 명령에 --branches 옵션을 사용하면 각 브랜치의 커밋을 함께 볼 수 있다. 브랜치와 커밋의 관계를 좀 더 보기 쉽게 그래프 형태로 표시하려면 git log 명령에 --graph 옵션을 함께 사용한다.

(|) 점선을 따라가 보면 'apple content 4' 커밋의 부모는 'work 3' 커밋을 만나게 된다. 즉, apple 브랜치에서는 'work 3' 커밋 다음에  'apple content 4' 커밋이 만들어졌다는 뜻이다. 'master content 4'의 커밋의 부모 또한 'work 3' 커밋이다. apple 브랜치의 커밋과 master 브랜치의 커밋은 같은 부모를 가지고 있다. 즉, master 브랜치나 apple 브랜치는 'work 3' 커밋까지는 같고 그 이후부터 브랜치마다 다른 커밋을 만들었다는 사실을 알 수 있다.

 

브랜치 사이의 차이점을 알아보려면

 

$ git log master..apple

 

와 같이 작성하며 마침표 왼쪽에 있는 브랜치를 기준으로 오른쪽 브랜치와 비교한다.

이렇게 하면 master 브랜치에는 없고 apple 브랜치에만 있는 커밋, 즉 'apple content 4' 커밋을 보여준다. 반대로 apple 브랜치를 기준으로 master와 비교하면 apple 브랜치에는 없고 master 브랜치에만 있는 'master content 4' 커밋을 보여준다.

 

서로 다른 파일 병합하기

 

git init 다음에 디렉터리 이름을 입력하면 새로운 디렉터리를 만들고 저장소를 초기화하는 과정을 한꺼번에 처리할 수 있다.

 

o2 브랜치의 내용을 master 브랜치로 병합하려면 먼저 master 브랜치로 체크아웃해야 한다.

 

브랜치를 병합하려면 git merge 명령 뒤에 가져올 브랜치 이름을 적는다. master 브랜치에 o2 브랜치를 가져와 병합하려면 다음과 같이 입력한다.

 

$ git merge o2

 

ls -al 명령을 사용해 확인해 보면 o2 브랜치에 있던 o2.txt 파일이 master 브랜치에 합쳐졌다.

 

참고) 브랜치를 병합할 때 편집기 창 여부 설정

 

앞에서 브랜치를 병합할 때 자동으로 편집기가 실행되면서 커밋 메시지를 추가 작성할 수 있었다. 만약 편집기 창을 열지 않고 깃에서 저장하는 커밋 메시지를 그대로 사용하겠다면 다음과 같이 --no-edit 옵션을 추가한다.

$ git merge o2 --no-edit

 

브랜치를 병합할 때 편집기 창이 나타나지 않도록 설정한 경우, 커밋 메시지를 추가하거나 수정하고 싶다면 병합 명령에 --edit 옵션을 사용한다.

$ git merge o2 --edit

 

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

 

# title
content



# title
content

# title
content
master content 2


# title
content

# title
content



# title
content
o2 content 2
# title
content
master content 2


# title
content
o2 content 2

 

master 브랜치와 o2 브랜치에 똑같이 work.txt 파일이 있을 때, 양쪽 브랜치에서 work.txt 문서를 수정하되 서로 다른 위치를 수정한 후 브랜치를 병합했을 때 각 브랜치의 수정 내용이 하나의 파일에 합쳐진 것을 볼 수 있다.

 

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

 

깃에서는 줄 단위로 변경 여부를 확인한다. 각 브랜치에 같은 파일 이름을 가지고 있으면서 같은 줄을 수정했을 때 브랜치를 병합하면 브랜치 충돌(conflict)이 발생한다.

 

# title
content

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

 

충돌(conflict)이 발생한 문서는 자동으로 병합될 수 없으므로 직접 충돌 부분을 해결한 후 커밋해야 한다.

'<<<<<<< HEAD'와 가운데 가로줄(=======) 사이의 내용은 현재 브랜치, 즉 master 브랜치에서 수정한 내용이다. 가로줄(=======)과 '>>>>>>> o2' 사이의 내용은 o2 브랜치에서 수정한 내용이다.

수정한 work.txt를 스테이지에 올리고 커밋하면 된다.

ch) 병합 및 충돌 해결 프로그램을 사용할 수 있다. ex) P4Merge, Meld, Kdiff3, Araxis Merge ...

 

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

 

브랜치를 병합한 후 더 이상 사용하지 않는 브랜치는 깃에서 삭제할 수 있다. 단, 이렇게 브랜치를 삭제하더라도 이 브랜치가 완전히 지워지는 것이 아니라 다시 같은 이름의 브랜치를 만들면 예전 내용을 다시 볼 수 있다. 즉, 브랜치를 삭제한다는 것은 완전히 저장소에서 없애는 것이 아니라 깃의 흐름 속에서 감추는 것이라고 생각하면 된다.

저장소의 기본 브랜치는 master이므로 브랜치를 삭제하려면 master 브랜치에서 해야 한다.

브랜치를 삭제할 때는 git branch 명령에 -d 옵션을 사용한다. 다음과 같이 o2 브랜치를 삭제한다.

 

$ git branch -d o2

cf) master 브랜치에 병합하지 않은 브랜치를 삭제하려면 오류 메시지가 나타난다. 이럴 경우 옵션 -d 대신 -D(대문자 D)를 사용해서 강제로 브랜치를 삭제할 수 있다.

 

HEAD는 현재 작업 트리(working directory)가 어떤 버전을 기반으로 작업 중인지를 가리키는 포인터이다. HEAD는 기본적으로 master 브랜치를 가리킨다. 그리고 브랜치는 기본적으로 브랜치에 담긴 커밋 중에서 가장 최근의 커밋을 가리킨다.

git checkout 명령을 사용하면 HEAD를 제어해서 브랜치를 이동할 수 있다.

git reset 명령을 사용하면 HEAD가 가리키고 있는 브랜치의 최신 커밋을 원하는 커밋으로 지정할 수 있다. 이때, 명령을 수행한 뒤 브랜치와 연결이 끊긴 커밋은 삭제된다.

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

 

아직 커밋하지 않고 작업 중인 파일들을 잠시 감춰둘 수 있다. git stash 명령을 사용하려면 파일이 tracked 상태여야 한다.

 

$ git stash

감춘 파일들은 git stash list에서 확인할 수 있고 스택(stack) 형태로 저장된다.

 

감춰둔 파일을 꺼내와 계속 수정하거나 커밋하려면 git stash 명령 뒤에 pop을 추가하면 stash 목록에서 가장 최근 항목을 되돌린다.

 

$ git stash pop

 

cf) stash 목록에 저장된 수정 내용을 나중에 또 사용할지도 모른다면 git stash apply 명령을 사용한다. stash 목록에서 가장 최근 항목은 되돌리지만 저장했던 내용은 그대로 남겨둔다.

git stash drop 명령은 stash 목록에서 가장 최근 항목을 삭제한다.

 

 

출처: 고경희, 이고잉. 2019. Do it! 지옥에서 온 문서관리자 깃&깃허브 입문. 이지스퍼블리싱

'개발 > 기타' 카테고리의 다른 글

local repository를 github에 연동  (0) 2022.11.11
git 명령어 정리  (0) 2022.11.08