각각의 branch에서 개별적 작업이 종료되어 master branch에 합병할 때 이를 branch merging이라고 부른다.
Merging을 알아보기 위해 빠르게 branch를 사용해서 commit 해보자.
새로운 폴더에 $ git init
$ vim cal.py
$ git add cal.py
$ git commit -m "Creat a cal.py"
하나의 파일을 만들고 commit 했을 때의 시점
하나의 sub branch 생성
$ git branch sub
$ git log --oneline
sub branch 생성 이후의 관계도
cal.py 수정 후 커밋
sub branch로 HEAD 변경후 print_add.py 생성 후 커밋
$ git checkout sub
$ git commit -am "Creat a print_add.py"
HEAD가 sub을 가리키고 있고 이 branch안에서 생성된 파일은 독립적이다.
git merge sub을 사용해 merge한다.
- $ git checkout master// master에서만 merging이 가능하다.
$ git merge sub
이 때 vim editor가 나오는데, Merge branch 'sub' commit message(사용자 정의)를 저장하면 된다.
이 때 sub branch에만 존재하던 파일이 master working tree에도 저장이 된다.
그리고 Merge branch 'sub'라는 commit이 master branch에 생긴다. 이는 sub branch의 commit이다.
결론적으로 Creat a cal.py commit이 sub branch가 생성되는 시점이다. 그 이후 sub branch로 이동해 Creat a print_add.py를 commit 해준다. 이 commit과 파일은 sub branch에만 존재하게 된다. 이후 Merge를 해준다면, master branch에 sub branch에 존재하던 commit이 복사되어 commit되고 파일도 복사된다.
sub branch에서 새로운 파일을 생성하지 않고 master branch의 파일의 다른 라인부분을 수정(추가)한다면 이는 한 파일에 수정부분을 병합해주는 기능을 한다. auto merging이라고 칭한다.
sub branch에서 새로운 파일을 생성하지 않고 master branch의 파일의 같은 라인부분을 수정(추가)한다면 이는 CONFLICT 문구를 출력하며 auto Merging에 실패하게 된다.
하지만 vim editor로 확인한다면 master에서 수정한 부분은 Head 부분과 sub 부분으로 나뉘어 수정한 부분이 나뉘어 Merging이 된다. 그렇다면 따로 수정, staging, 그리고 commiting을 ㅇ해줘야 한다.
$ git checkout master
$ git branch -d sub
sub branch를 삭제하지만, 다시 같은 이름의 branch를 생성하면 작업내용이 그대로 남아있다.
git repo에서 완전히 삭제하는 것이 아니라 감춘다고 생각하면 된다.
위의 사진을 보자.
Timeline
- Creat a cal.py 생성 후 commit
- mul(sub) branch 생성
- Creat a print_sub.py 생성 후 커밋
- Creat a print_sub.py 생성 후 커밋 -> checkout mul
- Creat a print_mul.py 생성 후 commit
이후에 $ git reset [the hash of Creat a print_sub.py]을 사용하여 reset한다면
Creat a print_mul.py commit과 file은 삭제된다.
git stash는 modified 상태를 숨겨준다.
git stash list는 숨겨진 modified 상태의 목록을 출력한다. stash@{1~n}에 저장된다.
git stash pop은 숨겨진 modified 상태를 나타나게 한다.