일상/컴퓨터

[GitHub 깃 & 깃허브 입문] 브랜치

미적미적달팽이 2023. 3. 24. 18:02

[GitHub 깃 & 깃허브 입문] 깃 설치부터 기초까지

 

[GitHub 깃 & 깃허브 입문] 깃 설치부터 기초까지

Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문하기 1, 2장을 공부하면서 실습해본 것을 정리해보았다. http://www.yes24.com/Product/Goods/113791485?CategoryNumber=001001003031004 Do it! 지옥에서 온 문서 관리자 깃&

gunrestaurant.tistory.com


브랜치란

브랜치(branch): 버전 관리 시스템에서는 여러 갈래로 퍼져나가는 데이터의 흐름을 뜻한다.

브랜치의 기능

  • 사용자가 커밋을 할 때마다 어떤게 최신 커밋인지 정보를 저장한다.
  • 분기(branch): main 브랜치에서 새 브랜치를 만들어서 기존 파일의 내용 수정이나 새로운 기능을 가질 수 있다.
  • 병합(merge): 새 브런치의 내용을 원래 main 브랜치에 합하는 것이다.

 

브랜치 만들기 및 이동하기

테스트용 파일 생성

브랜치를 만들고 이동해보기를 하기전에 테스트용 환경을 조성해야한다. 홈 디렉터리에 'manual'이라는 새 디렉터리 생성 및 manual에 저장소를 만들고 ls -al로 .git 디렉터리가 만들어졌는지 확인을 해본다.

$ cd ~
$ mkdir manual
$ cd manual
$ git init
$ ls -al

work.txt 파일을 새로 생성한 뒤 content1이라는 내용을 입력 후 저장해서 테스트용 파일을 만든다.

work.txt를 스테이지에 올리고 커밋 메시지 'work 1'을 입력 후 커밋한 뒤 git log 명령으로 커밋 내역을 확인해보면 아래와 같이 출력이 된다.

$ git add work.txt
$ git commit -m "work1"
$ git log

(HEAD -> main)이 붙은 것은 현재 main 브랜치를 가리키고 있다는 뜻이며, 이것이 제일 최신 커밋임을 뜻한다.

 

테스트를 위해 work.txt에 내용 추가 및 커밋을 하는 과정을 content3와 work3까지 반복해서 후에 변화를 관찰할 수 있다.   -am은 한 번 커밋된 파일을 스테이징 과정 없이 바로 스테이징과 커밋을 처리하는 옵션 명령이다.

$ vim work.txt
$ git commit -am "work2"
$ vim work.txt
$ git commit -am "work3"

git log로 확인해 보면 제일 마지막의 work3에 (HEAD -> main)이 붙어있는 것을 확인할 수 잇다.

더보기

(END)가 표시되면 q를 눌러서 다시 명령 입력으로 돌아올 수 있다.

 

브랜치 만들기

git branch 명령어로 브랜치를 만들거나 확인 가능하며 이를 통해 main 외에 apple branch를 만들고 생성이 잘 됐는지 git branch로 확인한다.

$ git branch
$ git branch apple
$ git branch

git log 명령을 사용하면 (HEAD -> main, apple)로 표시되면서 저장소에 main과 apple 브랜치가 존재하며 이 중 main 브랜치에서 작업하고 있음을 알려준다.

 

똑같이 google, ms 브랜치를 추가해보자.

 

work.txt에 main content 4를 넣고 "main work 4" 커밋 메시지를 입력을 한 뒤 커밋을 완료한다.

git log 명령에 --oneline으로 한 줄에 한 커밋씩만 출력하는 옵션을 추가해준다. 이전보다 훨씬 깔끔하게 git log를 확인할 수가 있다.

$ git log --oneline

새로 생성했던 main work 4는 현재 작업중인 브랜치인 main에만 적용되고, 이전에 work3만 ms, google, apple 브랜치에 속해 있다.

 

브랜치 전환

git branch apple로 apple 브랜치로 전환하면 다음과 같은 문장이 출력된다.

git log --oneline 명령을 입력하면 apple 브랜치를 생성하기 전까지의 main 브랜치의 커밋들은 모두 적용된 것을 볼 수 있으며 이 중에서 work3이 제일 최신 커밋임을 알 수 있다.

cat work.txt 명령으로 work.txt의 내용을 확인하면, apple 브랜치를 만들기 전까지 저장해둔 content3까지만 나오는 것을 확인 가능하다.

 

전환한 브랜치에서 커밋하기

work.txt 파일에 apple content 4를 추가해서 저장을 한다. 이후 apple.txt 파일을 새로 생성하고 apple content 4 내용을 vim 편집기를 이용해서 저장해준다. git add . 명령으로 work.txt와 apple.txt를 한 번에 스테이징해서 "apple work 4" 메시지 추가 후 커밋까지 완료를 해준다.

git log --oneline으로 apple 브랜치의 최신 커밋이 apple work 4가 됐음을 알 수 있다.

 

브랜치와 커밋의 관계

git log에 --branches 옵션을 통해 브랜치별로 최신 커밋이 확인 가능하다.

--graph 옵션을 추가하면 커밋 사이에 관계를 알 수 있다.

여기서 선으로 이어진 것은 main work 4와 apple work 4의 부모 커밋이 work3임을 나타내고 있는 것이다.

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

 

브랜치별 차이점

git log 브랜치명..브랜치명 명령을 통해 브랜치별 차이점을 확인해보자.

$ git log main..apple

 

main 브랜치를 기준으로 main 브랜치에는 존재하지 않고 apple 브랜치에만 존재하는 apple work 4의 정보를 출력해주는 명령이다.

반대로 작성하면, apple 브랜치에는 없는 main work 4의 정보를 출력하는 것을 확인할 수 있다.

 

브랜치 병합

서로 다른 파일 병합

새로 manual-2 디렉터리를 생성하고 work.txt를 생성하고 내용을 입력 후 "work 1"과 함께 커밋해준다.

$ cd ~
$ git init manual-2
$ cd manual-2
$ ls -al
$ vim work.txt
$ git add work.txt
$ git commit -m "work1"

git branch로 o2 브랜치를 만들고, 새로 main.txt 파일을 생성 뒤 "main work 2"로 커밋을 한다.

$ git branch o2
$ vim main.txt
$ git add main.txt
$ git commit -m "main work 2"

브랜치를 o2로 옮기고 새로 o2 파일 작성 후 "o2 work 2"로 커밋한다.

$ git switch o2
$ vim o2.txt
$ git add o2.txt
$ git commit -m "o2 work 2"

git log --branched --graph명령으로 현재까지 일련의 과정을 한 눈에 볼 수 있다.

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

main 브랜치로 이동 후 git merge 명령으로 o2 브랜치를 병합해준다.

$ git switch main
$ git merge o2

빔이 실행되면서 브랜치를 병합하면서 자동으로 생성된 "Merge branch 'o2'"라는 커밋 메시지가 출력되는데, 이전과 똑같이 ESC를 누르고 :wq를 입력해서 저장을 하고 vim 편집창에서 나간다.

더보기

main 브랜치에서 브랜치가 갈라진 후, main 브랜치에 최신 커밋이 없다면, 다른 브랜치의 커밋을 main 브랜치로만 가리키는 fast-forward merge로 빔 창이 열리지 않고 병합된다.

ls -al 명령으로 디렉터리 상태를 확인해 보면, 현재 작업 중인 main 브랜치에 o2.txt 파일이 이동한다.

이렇게 병합된 브랜치의 과정도 git log 명령에 --graph 옵션을 달아서 확인이 가능하다. 

 

서로 다른 브랜치에서 한 문서를 각각 다른 부분에서 수정했을 때의 병합

서로 다른 브랜치에서 한 문서 내에 각각 다른 부분을 수정했을 경우, 브랜치를 병합하게 되면 어떻게 될 지 테스트를 해본다. 아래의 코드를 따라서 work.txt를 생성하고, 브랜치 분기를 나누어서 각각에서 수정하고, 다시 브랜치를 병합하는 과정을 수행한다.

$ cd ~
$ cd manual-3
$ vim work.txt
$ git add work.txt
$ git commit -m "work 1"
$ git branch o2
$ vim work.txt
$ git commit -am "main work 2"
$ git switch o2
$ vim work.txt
$ git commit -am "o2 work 2"
$ git switch main
$ git merge o2

work 1 으로 커밋한 work.txt
o2에서 커밋한 work.txt

cat work.txt로 파일을 확인하면 파일 내용이 병합된 것을 볼 수 있다.

 

다른 브랜치에서 같은 부분을 편집했을 때 병합

다른 브랜치에서 한 파일의 같은 부분을 수정했을 때 병합은 어떻게 되는 지 테스트하기 위해 manual-4 디렉터리를 생성 후 앞에서의 작업 과정을 똑같이 반복한다.

$ cd ~
$ git init manual-4
$ cd manual-4
$ vim work.txt
$ git add work.txt
$ git commit -m "work 1"
$ git branch o2
$ vim work.txt
$ git commit -am "main work 2"
$ git switch o2
$ vim work.txt
$ git commit -am "o2 work 2"
$ git switch main
$ git merge o2

main 브랜치에서 커밋한 main work 2의 내용
o2 브랜치에서 커밋한 파일 내용

브랜치 병합을 시도하면 빔 창은 뜨지 않고, 파일 병합 과정에서 충돌이 일어났다는 메시지가 출력되면서 병합이 제대로 완료되지 않는 현상이 발생한다.

vim work.txt로 파일을 확인하면,

HEAD인 main 브랜치에서 수정한 내용과

o2 브랜치에서 수정한 내용이

=========을 통해 분리해서 출력을 해준다.

파일을 수정 후 커밋하면

파일 충돌을 해결하고 커밋과 브랜치 병합이 완료됐음을 확인이 가능하다.

 

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

-d 옵션을 추가해서 삭제가 가능하나, 완벽하게 사라지는 것은 아니고, 작업 내용이 남아 있다.

$ git branch -d o2

 

cherry-pick으로 병합

cherry-pick 방식은 전체를 병합하는 것이 아닌 특정 버전의 파일 병합하는 기술이다.

이를 테스트해보기 위해 cherry-pick 디렉터리를 새로 생성 후 아래 명령으로 파일 생성, 스테이징, 커밋을 한번에 실행해준다.

$ touch init.txt; git add init.txt; git commit -m "init"

git log 명령으로 init이 main과 topic에 존재하고 있음을 알 수 있다.

$ touch m1; git add m1; git commit -m "m1"

위의 명령으로 m1, m2 버전을 생성하고 git log 확인하면 아래와 같이 출력한다.

topic 브랜치로 이동하고 t1, t2, t3 버전을 생성하고 git log를 확인하면 아래와 같이 출력한다.

cherry-pick 실행을 위해 main 브랜치로 이동해서, cherry-pick 명령과 함께 병합할 커밋 해시명을 입력해준다.

$ git switch main
$ git cherry-pick c372706

 

ls와 git log로 확인하면 t2까지 병합된 것을 확인 가능하다.

 

명령 및 옵션

명령 및 옵션 설명
-am 한 번 커밋된 파일을 스테이징 과정 없이 바로 커밋하는 옵션
git branch 브랜치를 생성하거나 확인할 수 있음
--oneline git log의 커밋 정보를 한 줄씩 출력하게 함
git switch 브랜치명 다른 브랜치로 전환 가능
git add . 현재 저장소에 수정 내용이 있는 파일을 한 번에 스테이징
--branches 브랜치별 최신 커밋 확인
--graph 각 커밋 사이의 관계를 출력
브랜치명..브랜치명 왼쪽의 브랜치를 기준으로 오른쪽과 차이를 비교
git intit 디렉터리명 디렉터리 생성과 저장소 초기화를 한번에 할 수 있음
git merge 브랜치명 현재 작업중인 브랜치에 다른 브랜치를 병합
-d 삭제
touch 새 파일 및 버전 생성
--all 모든 커밋을 확인
cherry-pick 커밋해시 해당 커밋을 병합

 

 

 

[GitHub 깃 & 깃 허브 입문] 깃허브

 

[깃 & 깃 허브 입문] 깃허브

원격 저장소 지역 저장소인 작업 컴퓨터의 로컬 드라이브가 아닌, 외부 통신망을 통해 접속할 수 있거나 작업 컴퓨터 외에 저장소를 원격 저장소라 하며, 이를 통해 협업과 백업을 해서 안전하

gunrestaurant.tistory.com

 

반응형