> ## Documentation Index
> Fetch the complete documentation index at: https://docs.parallelane.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 리베이스 & 머지

> 머지 전략·리베이스·cherry-pick·reset

머지·리베이스·cherry-pick·revert·reset은 모두 커밋 그래프에서 커밋을 **우클릭**해 실행합니다. 브랜치를 합치거나, 히스토리를 다시 쌓거나, 특정 커밋을 골라 적용·되돌리는 작업을 그래프 위에서 바로 할 수 있습니다.

<Frame>
  <img src="https://mintcdn.com/railgit/1HhHpeGsA-i8McQ3/images/history-op-context-menu.png?fit=max&auto=format&n=1HhHpeGsA-i8McQ3&q=85&s=944ede74021316fbfe594c2022136a25" alt="HEAD 커밋을 우클릭해 열린 작업 메뉴 — 생성·읽기, cherry-pick, 히스토리 편집, 위험, ref 서브메뉴가 구분선으로 나뉘고 Reset 항목만 빨간색으로 표시됨" width="2906" height="1784" data-path="images/history-op-context-menu.png" />
</Frame>

## 메뉴 읽는 법

우클릭 메뉴는 앱 전체 공통 규칙을 따릅니다 — 성격별로 구분선으로 묶이고, 위에서 아래로 **안전한 것부터 위험한 것 순** 으로 놓이며, 이름 끝의 **…** 은 다이얼로그가 먼저 열린다는 표시입니다(그래서 **비교** 에는 …이 없고 **현재 브랜치에 머지…** 에는 있습니다). 규칙 전체는 [화면 둘러보기](/interface-overview#컨텍스트-메뉴)에 정리돼 있습니다.

커밋 그래프의 메뉴는 그 규칙에 따라 다섯 그룹으로 묶입니다.

| 그룹           | 담는 항목                                                                                                                                                                                                                           |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 선택 기반        | **N개 커밋 스쿼시…(Squash N commits…)** — HEAD를 포함한 연속 커밋을 고르고 그 안의 커밋을 우클릭했을 때만                                                                                                                                                      |
| 생성 · 이동 · 읽기 | **브랜치 만들기…(Create branch…)**, **태그 만들기…(Create tag…)**, **커밋 체크아웃(Checkout commit)**, **비교(Compare)**                                                                                                                           |
| 통합           | **현재 브랜치에 머지…(Merge into current branch…)**, **현재 브랜치를 이 커밋 위로 rebase(Rebase current branch onto this commit)** — 둘 다 대상이 HEAD에서 도달 가능하면(이미 반영됨) 숨겨짐, **Cherry-pick 커밋(Cherry-pick commit)**(다중 선택 시 **선택한 N개 커밋 cherry-pick**) |
| 히스토리 편집      | **커밋 수정 (Amend)(Amend commit)** — HEAD 커밋에서만, **여기서부터 interactive rebase…(Rebase interactively from here…)**                                                                                                                    |
| 위험           | **{'{'}브랜치{'}'}를 여기로 Reset…(Reset {'{'}branch{'}'} to here…)**, **커밋 되돌리기(Revert commit)**                                                                                                                                      |

* 조건이 맞지 않아 그룹이 통째로 비면 **그 구분선도 함께 사라집니다**. 메뉴에 항목이 몇 개 보이든 구분선이 앞뒤로 남거나 겹치는 일은 없습니다.
* 브랜치·태그 배지가 붙은 커밋에서는 그 ref별 서브메뉴가 **맨 마지막 그룹으로 덧붙습니다**.

<Note>
  이 메뉴에서 빨간색이 붙는 것은 **Reset** 과 브랜치·태그 서브메뉴의 **삭제** 뿐입니다. **커밋 되돌리기(Revert)** 는 되돌리는 커밋을 새로 쌓을 뿐이고, **Amend·스쿼시·rebase** 는 로컬 히스토리를 다시 쓰는 일상 작업이라 강조하지 않습니다.
</Note>

## 머지

커밋(또는 브랜치 tip)을 현재 체크아웃한 브랜치로 합칩니다.

<Steps>
  <Step title="대상 커밋 우클릭">
    현재 브랜치로 가져올 커밋을 우클릭하고 **현재 브랜치에 머지…** 를 선택합니다. 브랜치 배지가 붙은 커밋에서는 그 브랜치별 서브메뉴에도 같은 항목이 있습니다(원격 브랜치는 `origin/feature` 형태의 정규화된 ref로 머지).
  </Step>

  <Step title="전략 고르기">
    바로 머지되지 않고 **전략 선택 다이얼로그** 가 먼저 열립니다. **전략(Strategy)** 은 세 가지 중 하나이며, 고른 전략의 설명이 아래에 함께 표시됩니다. 기본 선택은 **기본(Default)** 입니다.
  </Step>

  <Step title="Merge 실행">
    **Merge** 를 누르면 머지가 실행되고, 결과가 토스트로 안내됩니다. 충돌 없이 끝나면 그래프가 갱신됩니다.
  </Step>
</Steps>

### 머지 전략

<CardGroup cols={3}>
  <Card title="기본 (Default)" icon="git-merge">
    가능하면 fast-forward로 이어 붙이고, 아니면 머지 커밋을 만듭니다. Git의 기본 동작입니다.
  </Card>

  <Card title="No fast-forward" icon="git-merge">
    fast-forward가 가능해도 **항상 머지 커밋** 을 만듭니다. 합친 시점이 히스토리에 남습니다.
  </Card>

  <Card title="Squash" icon="layers">
    합쳐진 변경을 **커밋도, HEAD 이동도 없이 staged 상태로만** 둡니다. 직접 커밋해 마무리해야 합니다.
  </Card>
</CardGroup>

### 결과 안내

머지 결과는 상황별로 다른 토스트로 구분해 알려줍니다.

* **이미 최신** — 합칠 변경이 없으면 "이미 최신 상태입니다 — 병합할 변경이 없습니다"만 뜨고 아무것도 바뀌지 않습니다. HEAD는 그대로입니다.
* **머지 완료** — fast-forward 또는 머지 커밋이 만들어지면 브랜치 이름과 함께 **머지 완료** 가 뜹니다. 이 경우에만 [Undo](/basics/discard-undo)가 기록됩니다(Squash와 충돌 결과는 HEAD가 움직이지 않아 대상이 아닙니다).
* **Squash 완료** — "변경이 staged 상태입니다. 확인 후 커밋하세요" 안내가 뜹니다. 커밋이 아직 없으므로 워킹 카피(Working copy)에서 내용을 확인하고 **직접 커밋해야** 머지가 끝납니다.
* **충돌** — 경고 토스트가 뜹니다. 아래 [충돌이 나면](#충돌이-나면)을 참고하세요.

<Note>
  **현재 브랜치에 머지…** 항목은 대상 커밋이 이미 HEAD에서 도달 가능한 경우(현재 브랜치에 이미 반영된 조상)에는 무의미(no-op)하므로 표시되지 않습니다. 실제로 합칠 것이 있을 때만 나타납니다.
</Note>

## 리베이스

### 브랜치/커밋 위로 리베이스 (standalone)

현재 브랜치의 커밋들을 다른 브랜치나 커밋 위로 다시 쌓습니다.

<Steps>
  <Step title="기준 우클릭">
    올려놓을 대상을 우클릭합니다.

    * 브랜치 배지: **현재 브랜치를 이 브랜치 위로 rebase**
    * 커밋: **현재 브랜치를 이 커밋 위로 rebase**
  </Step>

  <Step title="확인">
    "현재 브랜치의 커밋들을 대상 위로 다시 적용합니다. 히스토리가 변경됩니다"라는 안내와 함께 확인 다이얼로그가 뜹니다. **Rebase** 를 눌러 실행합니다.
  </Step>
</Steps>

<Note>
  리베이스는 두 경우에 실행 전에 거부되고 에러 알림만 뜹니다(standalone·interactive 모두 동일).

  * **추적 중인 파일에 커밋되지 않은 변경이 있을 때** — "Working tree has uncommitted changes. Commit or stash before rebasing." 커밋하거나 스태시한 뒤 다시 시도하세요. 추적되지 않은(untracked) 새 파일만 있으면 막지 않습니다.
  * **이미 진행 중인 머지·리베이스·cherry-pick·revert가 있을 때** — "진행 중인 작업이 있습니다. 완료하거나 중단한 뒤 이 동작을 실행하세요."

  무의미한 경우(대상이 이미 HEAD에서 도달 가능 등)에는 메뉴 항목 자체가 숨겨집니다.
</Note>

### Interactive 리베이스

커밋 목록을 편집해 다시 쌓습니다.

<Steps>
  <Step title="시작 커밋 우클릭">
    편집 대상 중 가장 오래된 커밋을 우클릭하고 **여기서부터 interactive rebase…** 를 선택합니다. 클릭한 커밋이 편집 대상에 포함됩니다.
  </Step>

  <Step title="계획 편집">
    커밋이 오래된 것부터 위→아래로 나열됩니다. 각 행에서 동작을 고릅니다.

    * **Pick**: 그대로 사용
    * **메시지 수정(reword)**: 커밋 메시지 변경 (인라인 입력)
    * **Squash**: 위 커밋에 합치기 (결합 메시지 편집 가능)
    * **Fixup**: 위 커밋에 합치되 메시지는 버림
    * **삭제(drop)**: 커밋 제거

    행 왼쪽의 손잡이를 **드래그해 순서를 바꿀 수** 있습니다. 규칙을 어기면 확인 버튼이 비활성화되고 다이얼로그 상단에 이유가 표시됩니다 — 첫 커밋은 squash/fixup 할 수 없고(**첫 커밋은 squash/fixup 할 수 없습니다.**), 최소 한 개 커밋은 남겨야 하며(**최소 한 개의 커밋은 남겨야 합니다.**), 메시지를 비워 둘 수 없습니다(**커밋 메시지는 비워둘 수 없습니다.**).
  </Step>

  <Step title="실행">
    **Rebase 시작** 을 누르면 계획대로 히스토리를 다시 씁니다.
  </Step>
</Steps>

<Frame>
  <img src="https://mintcdn.com/railgit/1HhHpeGsA-i8McQ3/images/history-rebase-interactive.png?fit=max&auto=format&n=1HhHpeGsA-i8McQ3&q=85&s=883b2c5c30966b72cc13a5c5911f4d63" alt="Interactive Rebase 다이얼로그 — 커밋 행마다 드래그 손잡이, 동작 선택 드롭다운, 짧은 SHA와 커밋 요약이 놓여 있음" width="886" height="376" data-path="images/history-rebase-interactive.png" />
</Frame>

## Cherry-pick

하나 또는 여러 커밋의 변경을 현재 브랜치 위에 새 커밋으로 적용합니다.

<Tabs>
  <Tab title="한 커밋">
    커밋을 우클릭하고 **Cherry-pick 커밋**을 선택합니다.
  </Tab>

  <Tab title="여러 커밋">
    `Shift` 클릭 또는 `Cmd`/`Ctrl` 클릭으로 커밋을 여러 개 고른 뒤 선택 집합 안의 커밋을 우클릭합니다. **선택한 N개 커밋 cherry-pick**을 누르면 ParalleLane이 그래프의 오래된 커밋부터 최신 커밋 순으로 적용합니다.
  </Tab>
</Tabs>

<Note>
  다중 선택에 merge 커밋이 하나라도 들어 있으면 메뉴 항목이 **cherry-pick 불가 — 선택에 머지 커밋 포함 (N개)** 로 바뀌며 비활성화됩니다(git이 `-m` 없이는 거부하기 때문). 충돌이 나면 전체 시퀀스가 중간에서 멈추며, 워킹 카피에서 **계속**하면 남은 커밋을 이어서 적용하고 **중단**하면 시퀀스 전체를 취소합니다.
</Note>

## Revert

커밋을 우클릭하고 **커밋 되돌리기**를 선택하면 변경을 취소하는 새 커밋을 만듭니다. 기존 커밋과 히스토리는 유지됩니다.

merge 커밋을 되돌릴 때는 **mainline 부모**를 선택하는 다이얼로그가 열립니다. 기본값은 부모 1이며, 선택한 부모의 브랜치는 유지하고 반대편에서 들어온 변경을 되돌립니다. 부모 SHA와 제목을 확인한 뒤 실행하세요.

<Warning>
  merge revert의 mainline을 잘못 고르면 의도한 브랜치가 아니라 반대쪽 변경을 유지할 수 있습니다. 어떤 부모가 merge 당시의 기준 브랜치였는지 확인하세요.
</Warning>

## Reset

현재 브랜치를 우클릭한 커밋 위치로 되돌립니다. 우클릭 → **{'{'}브랜치{'}'}를 여기로 Reset…** 을 누르면 다이얼로그가 열리고, **모드** 를 고릅니다. 기본 선택은 git 기본값과 같은 **Mixed** 입니다.

| 모드        | 동작                                  |
| --------- | ----------------------------------- |
| **Soft**  | 커밋만 되돌리고 변경 내용은 staged 상태로 유지       |
| **Mixed** | 커밋을 되돌리고 변경 내용은 unstaged 상태로 유지     |
| **Hard**  | 커밋과 작업 트리 변경을 모두 폐기 (커밋되지 않은 변경 유실) |

<Warning>
  **Hard** 를 고르면 다이얼로그에 **작업 트리의 변경이 모두 폐기됩니다** 경고가 붙고 실행 버튼이 빨간색으로 바뀝니다. 커밋되지 않은 변경과 되돌린 커밋의 작업 내용이 사라지며 되돌릴 수 없으니 주의하세요.
</Warning>

## 충돌이 나면

머지·리베이스·cherry-pick·revert 중 충돌이 나면 작업이 중단되고 워킹 카피 패널에 배너가 나타납니다. 배너에는 진행 중인 작업 종류와 남은 충돌 개수가 표시되며, 거기서 충돌을 해결하고 **계속(Continue)** / **중단(Abort)** 할 수 있습니다. 리베이스 중에는 **건너뛰기(Skip)** 버튼도 나옵니다.

<Frame>
  <img src="https://mintcdn.com/railgit/1HhHpeGsA-i8McQ3/images/history-rebase-in-progress.png?fit=max&auto=format&n=1HhHpeGsA-i8McQ3&q=85&s=c6e893dd473077f50c9bd9e8f0acc38b" alt="리베이스 진행 중 워킹 카피 패널 위쪽 배너 — 'Rebase 중 · 1 충돌'과 중단·건너뛰기 버튼, 충돌이 남아 비활성인 계속 버튼" width="2386" height="1784" data-path="images/history-rebase-in-progress.png" />
</Frame>

<Note>
  남은 충돌이 하나라도 있으면 **계속** 버튼이 비활성 상태입니다. 충돌 파일을 모두 해결해 스테이지하면 활성화됩니다. 머지 충돌에서는 이 버튼이 **머지 커밋** 으로 표시됩니다.
</Note>

<Warning>
  **Squash 머지에서 충돌이 나면 이 배너가 나타나지 않습니다.** `--squash`는 진행 중 상태를 남기지 않으므로 Git이 "머지 중"으로 인식하지 않기 때문입니다. 충돌 파일은 워킹 카피에 그대로 보이니, 충돌을 해결하고 스테이지한 뒤 **일반 커밋으로 마무리** 하세요. 되돌리려면 **계속/중단** 대신 Reset을 사용합니다.
</Warning>

<Note>
  충돌 해결 방법은 [머지 충돌 해결](/review/merge-conflicts)에서 자세히 다룹니다.
</Note>

## 히스토리 재작성 주의

<Warning>
  리베이스와 (Soft/Mixed가 아닌) reset은 **커밋 히스토리를 다시 씁니다**. 이미 원격에 push한 브랜치의 히스토리를 재작성하면 push 시 force가 필요하고, 그 브랜치를 공유하는 다른 사람의 작업과 어긋날 수 있습니다.

  이미 push한 커밋이 재작성 대상에 포함돼 있었다면, 작업이 성공한 뒤 ParalleLane이 **"히스토리를 다시 썼습니다. 이미 push한 커밋이라면 force-push가 필요합니다."** 안내를 한 번 띄웁니다(리베이스·interactive 리베이스·스쿼시·Amend 공통). Push 다이얼로그의 **강제 (--force-with-lease)** 토글을 사용하세요. 공유 브랜치에서는 팀과 합의된 경우에만 재작성하세요.
</Warning>
