게시글

5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭
강좌6 - Git - 8년 전 등록

Merge와 Rebase

안녕하세요. 지난 시간에 이어서 계속 진행하겠습니다. 현재 구조는 다음과 같습니다.

git merge

이제 feature 브랜치에서 작업하던 내용이 완성되었다면 master와 합쳐서 실제로 사용할 수 있게 해야합니다. 이 때 사용하는 명령어가 git merge [브랜치명]입니다. 주의할 점은 여기서의 브랜치명은 합칠 branch입니다. 바탕이 되는 branch가 아니라요. 우리가 합칠 branch는 feature죠. 따라서 merge 전에 항상 git branch 명령어로 현재 HEAD가 바탕이 되는 master에 있나 확인해야 합니다.

merge 후에는 구조가 다음과 같아집니다.

merge 결과에 Fast-forward라고 표시되어 있는데 이것은 master 브랜치를 앞으로 쭉 당겼다는 뜻입니다. feature 브랜치가 master 브랜치보다 한 commit 앞에 있었기 때문에 master 브랜치가 feature 브랜치를 merge하는 순간 한 commit 앞으로 당겨지는 거죠.

conflict

하지만 모든 merge가 이렇게 순조롭게 되는 것은 아닙니다. 가끔 branch끼리 충돌이 나는 경우가 있는데 그 경우를 알아봅시다.

git reset HEAD~1으로 master branch를 뒤로 돌려봅시다. 그리고 git.html을 다음과 같이 수정하고 commit을 해봅니다.

<!DOCTYPE html>
<html>
<head>
  <title>깃 연습</title>
  <link rel="stylesheet" href="./git.css" />
</head>
<body>
  <h1>깃 conflict</h1>
  <p><b>깃 conflict</b>의 사용 방법에 대해 알아봅시다</p>
</body>
</html>

이제는 branch 두 개가 각자 다른 갈래로 갈라졌습니다. 이제 git merge feature을 하면 충돌이 일어나는 것을 볼 수 있습니다.

또한 git.html도 다음과 같이 자동으로 변경되었습니다.

<!DOCTYPE html>
<html>
<head>
  <title>깃 연습</title>
  <link rel="stylesheet" href="./git.css" />
</head>
<body>
<<<<<<< HEAD
  <h1>깃 conflict</h1>
  <p><b>깃 conflict</b>의 해결 방법에 대해 알아봅시다</p>
=======
  <h1>깃 브랜치</h1>
  <p><b>깃 브랜치</b>의 사용 방법에 대해 알아봅시다</p>
>>>>>>> feature
</body>
</html>

<<<<<<< HEAD와 >>>>>>> feature 사이가 충돌이 발생하는 지점입니다. Conflict commit과 Feature commit의 차이점이기도 하고요. 이 부분을 직접 정상적으로 바꿔주고 addcommit 해줍니다. 이제 갈라졌던 두 브랜치가 하나의 commit으로 다시 합쳐졌습니다.

git rebase

두 branch를 합치는 다른 방법은 git rebase입니다. 위의 구조에서 git reset HEAD~1을 해줍니다. 합쳐졌던 두 개의 브랜치가 다시 갈라졌습니다.

두 사람이 협업하다가 commit이 서로 달라진 경우죠. 이제 여기(master)서 feature branch를 rebase합니다. git rebase [브랜치명]입니다.

역시나 충돌이 일어나는 데 merge와는 해결 방법이 살짝 다릅니다. 일단 git.html의 충돌을 해결하고 git add git.html로 staged 상태로 만들어줍니다. merge는 그 후에 commit을 했지만, rebase는 git rebase --continue로 중단된 rebase를 이어가면 됩니다.

현재 구조는 다음과 같습니다.

merge 때와는 살짝 다르죠? merge는 갈라진 두 commit이 합쳐져서 새로운 commit이 되었다면, rebase는 하나의 commit이 다른 commit 앞으로 올라갑니다. 아래의 merge 경우와 비교해보세요.

merge와 rebase는 취향에 따라 사용하시면 됩니다. 깔끔한 log를 원하면 rebase를 하고, 직관적으로 간단하게 하고 싶으면 merge를 하면 됩니다.

다음 시간에는 그 외 자잘한 명령어들에 대해 알아보겠습니다!

조회수:
0
목록
투표로 게시글에 관해 피드백을 해주시면 게시글 수정 시 반영됩니다. 오류가 있다면 어떤 부분에 오류가 있는지도 알려주세요! 잘못된 정보가 퍼져나가지 않도록 도와주세요.
Copyright 2016- . 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.
5만명이 선택한 평균 별점 4.9의 제로초 프로그래밍 강좌! 로드맵만 따라오면 됩니다! 클릭

댓글

1개의 댓글이 있습니다.
6년 전
안녕하세요 zerocho님! node.js부터 시작해서 git강의까지 잘 보고 있습니다.^^
따라하다가 막히는 부분이 있어서 댓글 남깁니다. resolve commit으로 합치는 부분까지 진행하고, rebase를 시도하던 중, 다른 부분이 있습니다. 처음에 git rebase feature (마스터에서)를 하니 오류메시지가 뜨는데 zerocho님과는 다른 메시지더군요.
Cannot rebase: Your index contains uncommitted changes.
Please commit or stash them.
이렇게 뜨길래 git.html이 staged상태가 아니라 그런건지 알고, add해주고 나서 git rebase --continue를 하면 progress에 rebase가 없다고 뜨고, 다시 git rebase feature를 실행하면 위 오류메시지가 뜰 뿐입니다. 그대로 따라갔는데 왜 이런 차이점이 발생할까요??
6년 전
저 메시지 따라서 다시 Conflict commit을 하고 rebase를 하니 충돌 없이 바로 rebase가 제대로 진행되고 zerocho님 branch 구조와는 살짝 다른 모습이지만 master의 commit이 feature의 commit보다 올라가는 걸 확인했습니다. 그리고 git bash에서 나타나는 HEAD에는 (master|REBASE 1/2)라고 표시되더군요!...왜이럴까요 ㅠㅠ 복잡하네요
6년 전
git branch 명령어를 확인해 본 결과 아래와 같이 나타납니다.
*(no branch, rebasing master)
feature
master
6년 전
git reset HEAD~1를 두번 실행시켜서 더 되돌린다음에 git.html add하니, git rebase --continue 명령이 먹혀서 해결(?)됐네요..
처음 따라해본거라 그런지 뭐가 뭔지도 모르고 일단 되돌려보고 다시 해보고 엉망진창이네요 ㅎㅎ
6년 전
제가 다시 한 번 해보고 알아보겠습니다.