문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| git:merge [2025/06/10 04:30] – [3. Rebase & Merge] taekgu | git:merge [2025/06/10 04:53] (현재) – [커밋 되돌리기] taekgu | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| - | ====== Merge ====== | + | ====== Merge (git merge) |
| [[https:// | [[https:// | ||
| - | ===== git merge의 종류 | + | 하나의 branch에 다른 branch를 합치는 작업을 말한다. |
| + | ===== 브랜치를 합치는 여러 방법 | ||
| ==== 1. 3-Way Merge ===== | ==== 1. 3-Way Merge ===== | ||
| 줄 27: | 줄 28: | ||
| git merge practice1 | git merge practice1 | ||
| </ | </ | ||
| - | ==== 기본머지 ==== | ||
| - | | + | ==== 4.Squash & Merge ==== |
| - | 머지취소 | + | |
| - | git merge --abort | + | 3-Way Merge의 가장 큰 단점은 병합한 브랜치들의 커밋 내역까지 모두 보여지기에 커밋 로그가 매우 복잡하고 지저분해진다는 것입니다. Squash and Merge 방식은 병합할 브랜치에 있는 모든 커밋들을 하나의 커밋으로 만든 후, 기준이 되는 브랜치에 추가하는 방식으로 병합합니다. 커밋 로그가 매우 깔끔해진다는 장점이 있으나, 병합할 브랜치의 모든 커밋 이력이 사라져버린다는 단점이 있습니다. |
| + | |||
| + | <code bash> | ||
| + | # main 브랜치로 이동 | ||
| + | git switch main | ||
| + | |||
| + | # --squash 옵션을 통한 병합 | ||
| + | git merge --squash 브랜치명 | ||
| + | |||
| + | # 기존의 커밋들을 하나로 합친 새로운 커밋 | ||
| + | git commit -m " | ||
| + | </ | ||
| + | ===== 충돌 (Merge Conflict) ===== | ||
| + | |||
| + | 그러나 브랜치를 서로 합칠 때는 주의해야할 것이 있습니다. 바로 " | ||
| + | |||
| + | 아래의 사진이 바로 충돌이 일어난 상황입니다. 같은 파일에서 master 브랜치와 practcie1 브랜치의 코드가 다른데 병합을 시도하였기에 다음과 같이 충돌이 발생한 것입니다. | ||
| + | |||
| + | 해결방법은 간단합니다. <<<<<< | ||
| + | |||
| + | |||
| + | ==== 머지 | ||
| + | 머지를 하다가 conflict가 발생했을 때, | ||
| + | |||
| + | <code bash> | ||
| + | git merge --abort | ||
| + | </ | ||
| git merge --abort 명령은 Merge 하기 전으로 되돌린다. 완전히 뒤로 되돌리지 못하는 유일한 경우는 Merge 전에 워킹 디렉토리에서 Stash 하지 않았거나 커밋하지 않은 파일이 존재하고 있었을 때뿐이다. 그 외에는 잘 돌아간다. | git merge --abort 명령은 Merge 하기 전으로 되돌린다. 완전히 뒤로 되돌리지 못하는 유일한 경우는 Merge 전에 워킹 디렉토리에서 Stash 하지 않았거나 커밋하지 않은 파일이 존재하고 있었을 때뿐이다. 그 외에는 잘 돌아간다. | ||
| Merge 후의 결과를 Merge 하기 전의 브랜치와 비교하려면, | Merge 후의 결과를 Merge 하기 전의 브랜치와 비교하려면, | ||
| - | | + | |
| - | ===== Merge 되돌리기 | + | <code bash> |
| + | git diff --ours | ||
| + | </ | ||
| + | ==== Merge 되돌리기 ==== | ||
| 지금까지 Merge 하는 방법을 배웠으나 Merge 할 때 실수할 수도 있다. Git에서는 실수해도 된다. 실수해도 (대부분 간단하게) 되돌릴 수 있다. | 지금까지 Merge 하는 방법을 배웠으나 Merge 할 때 실수할 수도 있다. Git에서는 실수해도 된다. 실수해도 (대부분 간단하게) 되돌릴 수 있다. | ||
| 줄 60: | 줄 90: | ||
| 브랜치를 옮기는 것을 할 수 없는 경우는 모든 변경사항을 취소하는 새로운 커밋을 만들 수도 있다. Git에서 이 기능을 “revert” 라고 부른다. 지금의 경우엔 아래처럼 실행한다. | 브랜치를 옮기는 것을 할 수 없는 경우는 모든 변경사항을 취소하는 새로운 커밋을 만들 수도 있다. Git에서 이 기능을 “revert” 라고 부른다. 지금의 경우엔 아래처럼 실행한다. | ||
| - | | + | <code bash> |
| + | $ git revert -m 1 HEAD | ||
| [master b1d8379] Revert "Merge branch ' | [master b1d8379] Revert "Merge branch ' | ||
| + | </ | ||
| -m 1 옵션은 부모가 보호되어야 하는 “mainline” 이라는 것을 나타낸다. HEAD 로 Merge를 했을 때(git merge topic1) Merge 커밋은 두 개의 부모 커밋을 가진다. 첫 번째 부모 커밋은 HEAD (C6)이고 두 번째 부모 커밋은 Merge 대상 브랜치(C4)이다. 두 번째 부모 커밋(C4)에서 받아온 모든 변경사항을 되돌리고 첫 번째 부모(C6)로부터 받아온 변경사항은 남겨두고자 하는 상황이다. | -m 1 옵션은 부모가 보호되어야 하는 “mainline” 이라는 것을 나타낸다. HEAD 로 Merge를 했을 때(git merge topic1) Merge 커밋은 두 개의 부모 커밋을 가진다. 첫 번째 부모 커밋은 HEAD (C6)이고 두 번째 부모 커밋은 Merge 대상 브랜치(C4)이다. 두 번째 부모 커밋(C4)에서 받아온 모든 변경사항을 되돌리고 첫 번째 부모(C6)로부터 받아온 변경사항은 남겨두고자 하는 상황이다. | ||
| 새로 만든 커밋 ^M 은 C6 과 내용이 완전히 똑같다. 잘못 Merge 한 커밋까지 HEAD 의 히스토리에서 볼 수 있다는 것 말고는 Merge 하지 않은 것과 같다. topic 브랜치를 master 브랜치에 다시 Merge 하면 Git은 아래와 같이 어리둥절해한다. | 새로 만든 커밋 ^M 은 C6 과 내용이 완전히 똑같다. 잘못 Merge 한 커밋까지 HEAD 의 히스토리에서 볼 수 있다는 것 말고는 Merge 하지 않은 것과 같다. topic 브랜치를 master 브랜치에 다시 Merge 하면 Git은 아래와 같이 어리둥절해한다. | ||
| - | | + | <code bash> |
| + | $ git merge topic | ||
| Already up-to-date. | Already up-to-date. | ||
| + | </ | ||
| 이미 Merge 했던 topic 브랜치에는 더는 master 브랜치로 Merge 할 내용이 없다. 상황을 더 혼란스럽게 하는 경우는 topic 에서 뭔가 더 일을 하고 다시 Merge를 하는 경우이다. Git은 Merge 이후에 새로 만들어진 커밋만 가져온다. | 이미 Merge 했던 topic 브랜치에는 더는 master 브랜치로 Merge 할 내용이 없다. 상황을 더 혼란스럽게 하는 경우는 topic 에서 뭔가 더 일을 하고 다시 Merge를 하는 경우이다. Git은 Merge 이후에 새로 만들어진 커밋만 가져온다. | ||
| 이러면 가장 좋은 방법은 되돌렸던 Merge 커밋을 다시 되돌리는 것이다. 이후에 추가한 내용을 새 Merge 커밋으로 만드는 게 좋다. | 이러면 가장 좋은 방법은 되돌렸던 Merge 커밋을 다시 되돌리는 것이다. 이후에 추가한 내용을 새 Merge 커밋으로 만드는 게 좋다. | ||
| - | | + | <code bash> |
| + | $ git revert ^M | ||
| [master 09f0126] Revert " | [master 09f0126] Revert " | ||
| - | | + | $ git merge topic |
| + | </ | ||