git-branch에서 merge하는 방법

|

패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
이 포스팅에서는 branch merge에 대해 설명합니다.


merge?

작업중인 웹사이트가 잇는데, 새로운 이슈가 생겨 수정사항을 처리할 때, 마스터 브랜치의 내용은 변경되지 않았으면 해서 하는 행동이 새로운 브랜치를 만드는것이다.

따라서, 작업을 진행하던 중에, 작업하던 브랜치를 두고 다른 마스터 브랜치로 가서 새로운 브랜치를 만들고 작업을 한다음 그게 끝난 뒤 merge를 하고 다시 원래 작업으로 돌아오는 것을 기본으로 한다.

운영브랜치 이름은 보통 master(운영이름)라고 하고, 사실 우리가 부르는 마스터는 그 의미 자체가 특별한건 아니고 그냥 이름이 마스터인 것이다.

따라서 우리는 이슈를 처리할 새로운 브랜치를 만들어 여기에서 이제 issue를 처리할 것이다.

그 의미는 곧, masterissue가 가리키고 있는 commit이 다르다는 것을 의미한다.

(master) echo c1 >> C1.html
git add C1.html
git commit -m 'First!'

(master) echo c2 >> C2.html
git add C2.html
git commit -m 'Second!'

(master) echo c3 >> C3.html
git add C3.html
git commit -m 'Third!'

git branch iss53
git checkout iss53

(iss53) vi C3.html
# C3.html의 내용을 수정하고
git add C3.html
git commit -m 'C3의 내용을 수정했다'

git log --oneline --all --graph
#이를 통해 master와 iss53가 가리키는 브랜치를 확인할 수 있다.

git checkout master
# HEAD의 이동을 파악하고

# master 브랜치에서 다시 하나의 새로운 브랜치를 생성한다

git branch hotfix
# 그리고 새로 만든 브랜치에 checkout한다.
git checkout hotfix

git branch -b <branch 이름>

vi C2.html
# 메시지 내용 수정 뒤

git add C2.html
git commit -m 'C2의 내용도 수정을 했다!'

# 이때 새로만든 hotfix라는 브랜치를 master에 합쳐야 하는데,
# 이 방법은 master 브랜치로 돌아가 새로 만든 hotfix 브랜치와 합치하겠다고 명령어를 주는 것이다.

git checkout master
git merge hotfix

git log --oneline --all --graph
# 여기서 나오는 Fast forward는 앞으로 옮겨졌다는 뜻이다.
git branch -d hotfix
# 이제 hotfix 파일을 merge했으니 필요없어진 이 브랜치는 삭제한다.

이와 같은 방식으로 이전에 보고 있던 이슈에 대해서도 같게 처리해준다

git checkout iss53

vi C3.html
git add C3.html
git commit -m 'C3를 다시 수정했다'

git checkout master
git merge iss53

git branch -d iss53

merge commit?

현재 마스터는 브랜치의 조상이 아니기 때문에 커밋 두개와 공통 조상 하나가 있는 상태인데 이 세가지 커밋을 이용해서 하나의 컷을 만드는 즉 merge commit이라고 한다.

ide: 통합개발환경 우리가 어떤 코드를 작성을 하고 작성한 코드를 확인하고 실행가능한 파일로 만들어주는 역할을 예전엔 따로 했지만, 이를 한번에 해주는 것 -> 파이참 등…

conflict가 일어나는 이유 두 파일을 합칠 때, 수정된 내용이 컴퓨터도 인지하기 어려울 정도로 너무 같은 부분이 합쳐졌다고 생각하면 충돌이 생긴다.

그러면 다시 추가를 하고 수정을 하라고 뜬다. 충돌이 뜨지 않은 경우에는 위에서처럼 정상적으로 merge가 됐고, 필요없어진 브랜치는 삭제하면 된다.

여튼, 충돌이 일어나는 경우로 다시 돌아오자면

일반적으로는 auto merging이 되지만 충돌이 자주 일어나기도 한다.

# 새로운 브랜치인 iss54를 만들고 그 안에 맨 마지막 줄에 커밋메시지를 작성하고
# 브랜치를 다시 마스터로 옮긴 뒤 마스터의 마지막 줄에도 커밋메시지를 남긴다.

git branch iss54
git checkout iss54

vi C3.html
git add C3.html
git commit -m 'finish [iss54]'
# 어짜피 브랜치는 사라지기에 어떤 브랜치였는지를 적어주면 좋다.

git checkout master
vi C3.html
git add C3.html
git commit -m 'master finished [master]'

git merge iss54

라고 하면

Auto-merging C3.html
CONFLICT (content): Merge conflict in C3.html
Automatic merge failed; fix conflicts and then commit the result.

이렇게 나올 것이다.

즉 같은 라인에 양쪽이 커밋 메시지를 남기는 경우 merge conflict가 일어난다.

이때 우리는

git status

상태를 확인해보면

On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both modified:   C3.html

C3.html 파일이 공통적으로 수정되었다는 것을 확인했으니

vi C3.html

여기서 원하는 commit만을 남기고 dd를 통해 삭제한다.

다시

git status

해도

On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both modified:   C3.html

변화는 없지만

git add C3.html
git status

git add를 실행하고 나면

On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

	modified:   C3.html

git commit
git log --oneline --all --graph
git branch -d iss54

이렇게 우리는 branch merge가 가능해졌다!