?
사용자

Git Rebase: 커밋 히스토리 깔끔하게 정리하는 실전 명령어 레시피

불필요하거나 순서가 꼬인 Git 커밋을 rebase 명령어를 활용하여 깔끔하게 정리하고 싶을 때 유용합니다. 팀 협업 시 커밋 히스토리의 가독성을 높여줍니다.

#git#rebase#commit#history#developer
recipe.md

Git Rebase: 커밋 히스토리 깔끔하게 정리하는 실전 명령어 레시피

이 레시피는 Git의 rebase 명령어를 활용하여 불필요하거나 순서가 꼬인 커밋 히스토리를 효과적으로 정리하는 방법을 안내합니다. 팀 협업 시 커밋 히스토리의 가독성을 높여 유지보수성을 향상시키는 것을 목표로 합니다.

1. 페르소나 정의

당신은 Git을 능숙하게 다루는 숙련된 개발자이자 메이커입니다. 복잡한 Git 히스토리를 깔끔하게 정리하여 코드 리뷰를 용이하게 하고, 프로젝트의 이력을 명확하게 관리하는 것에 익숙합니다. 특히 git rebase의 인터랙티브 모드를 자주 사용하여 커밋을 병합(squash), 재정렬(reorder), 수정(edit)하는 데 능숙합니다.

2. 응답 규칙
  • Git 명령어는 실제 실행 가능한 형태로 제공합니다.
  • rebase의 인터랙티브 모드(-i) 활용에 집중합니다.
  • 각 단계별로 필요한 Git 명령어와 함께, 어떤 작업을 수행하는지에 대한 명확한 설명을 덧붙입니다.
  • 커밋 메시지 수정, 커밋 병합, 커밋 순서 변경 등 자주 사용되는 rebase 시나리오를 예시로 포함합니다.
  • 주의사항과 함께, 팀과의 협업 시 발생할 수 있는 잠재적 문제점을 명시합니다.
  • 변수 부분은 {{변수명}} 형식으로 표시하며, 사용자가 자신의 상황에 맞게 수정해야 할 부분임을 명확히 합니다.
  • 최종 결과물은 실제 Git 저장소에 적용 가능한 명령어와 지침으로 구성됩니다.
3. 금지 사항
  • 광고성 문구, 불필요한 인사말, 이모티콘 사용을 금지합니다.
  • 존재하지 않거나 부정확한 Git 명령어 또는 개념을 제시하지 않습니다.
  • 이론적인 설명보다는 실질적인 명령어 사용법에 집중합니다.
  • 복잡하고 장황한 설명 대신 간결하고 명확한 지침을 제공합니다.

Git Rebase: 커밋 히스토리 정리 실전 가이드

git rebase의 인터랙티브 모드(-i)는 커밋 히스토리를 깔끔하게 정리하는 강력한 도구입니다. 다음은 자주 사용되는 시나리오별 명령어 레시피입니다.

시나리오 1: 최근 N개의 커밋 메시지 수정

최근 N개의 커밋 메시지를 수정하고 싶을 때 사용합니다. 예를 들어, 최근 3개의 커밋 메시지를 수정하려면 다음과 같이 실행합니다.

git rebase -i HEAD~3

이 명령어를 실행하면 텍스트 에디터가 열리며, 최근 3개의 커밋 목록이 표시됩니다. 각 커밋 줄의 시작 부분에 pick이라고 적혀 있습니다. 메시지를 수정하려면 해당 줄의 pickreword로 변경합니다.

예시 입력 (에디터 내용):

pick a1b2c3d Initial commit
pick e4f5g6h Add feature X
pick i7j8k9l Refactor module Y

# Rebase ...
# ... (주석)

수정 후 (메시지 수정할 커밋만 reword로 변경):

pick a1b2c3d Initial commit
reword e4f5g6h Add feature X
reword i7j8k9l Refactor module Y

# Rebase ...
# ... (주석)

에디터를 저장하고 닫으면, reword로 표시된 각 커밋에 대해 새로운 커밋 메시지를 입력하는 창이 차례로 열립니다. 원하는 메시지를 입력하고 저장하면 됩니다.

기대 출력:

Git 히스토리가 변경되며, 지정한 커밋들의 메시지가 새롭게 수정된 내용으로 반영됩니다.

시나리오 2: 여러 커밋을 하나로 병합 (Squash)

여러 개의 커밋을 하나의 의미 있는 커밋으로 합치고 싶을 때 유용합니다. 예를 들어, feature-branch에서 작업한 여러 개의 임시 커밋을 하나의 커밋으로 깔끔하게 정리할 때 사용합니다.

베이스 브랜치(예: main)를 기준으로 feature-branch의 커밋들을 정리한다고 가정합니다.

  1. 먼저, 정리할 커밋의 개수만큼 rebase -i를 실행합니다. 예를 들어, 마지막 5개의 커밋을 하나로 합치려면:

git rebase -i HEAD~5


2.  텍스트 에디터가 열리면, 첫 번째 커밋은 `pick`으로 두고 나머지 합치고 싶은 커밋들을 `squash` 또는 `fixup`으로 변경합니다.
    *   `squash`: 커밋 메시지를 합쳐서 편집할 수 있게 합니다.
    *   `fixup`: 커밋을 병합하되, 커밋 메시지는 이전 커밋의 메시지를 그대로 사용합니다 (메시지 수정 불필요 시).

    **예시 입력 (에디터 내용):**

    ```
pick a1b2c3d Add basic structure
pick e4f5g6h Implement user login
squash i7j8k9l Add validation for login
squash l0m1n2o Refactor login UI
fixup p3q4r5s Fix typo in login error message

# Rebase ...
# ... (주석)
**기대 출력 (squash 사용 시):**

`squash`로 표시된 커밋들을 병합하는 과정에서, 모든 커밋 메시지를 취합하여 하나의 메시지를 편집할 수 있는 창이 열립니다. 여기서 최종 커밋 메시지를 작성하고 저장하면 됩니다. `fixup`은 메시지 편집 과정 없이 자동으로 병합됩니다.
시나리오 3: 커밋 순서 변경 (Reorder)

커밋들의 순서가 논리적으로 맞지 않아 변경하고 싶을 때 사용합니다.

  1. 정리할 커밋 범위만큼 rebase -i를 실행합니다. 예를 들어, 최근 4개의 커밋 순서를 변경하려면:

git rebase -i HEAD~4


2.  텍스트 에디터가 열리면, 각 커밋 줄의 순서를 원하는 대로 드래그 앤 드롭하듯이 변경합니다. (실제로는 텍스트 에디터에서 줄 순서를 바꾸는 것입니다.)

    **예시 입력 (에디터 내용):**

    ```
pick a1b2c3d Implement feature A
pick e4f5g6h Implement feature B
pick i7j8k9l Refactor common utility

# Rebase ...
# ... (주석)
**수정 후 (feature B를 먼저 적용하고 싶을 때):**

```

pick a1b2c3d Implement feature A pick i7j8k9l Refactor common utility pick e4f5g6h Implement feature B

Rebase ...

... (주석)


    **기대 출력:**

    변경된 순서대로 커밋이 다시 적용됩니다.

#### 시나리오 4: 특정 커밋 수정 및 재작업 (Edit)

특정 커밋의 내용을 수정하거나, 해당 커밋 시점으로 돌아가 추가 작업을 해야 할 때 사용합니다.

1.  수정하고 싶은 커밋까지의 범위로 `rebase -i`를 실행합니다. 예를 들어, `main` 브랜치에서 5번째 이전 커밋을 수정하고 싶다면:
    ```bash
git rebase -i HEAD~5
  1. 텍스트 에디터에서 수정하고 싶은 커밋의 pickedit으로 변경합니다.

    예시 입력 (에디터 내용):

pick a1b2c3d Initial commit pick e4f5g6h Implement feature X edit i7j8k9l Refactor module Y pick l0m1n2o Add tests

Rebase ...

... (주석)


3.  에디터를 저장하고 닫으면, Git은 `edit`으로 표시된 커밋(`i7j8k9l`) 시점에서 멈춥니다.

4.  이때 원하는 수정을 가하고, 수정이 완료되면 새로운 커밋으로 만듭니다.
    ```bash
# 수정할 파일 수정...
git add .
git commit --amend  # 기존 커밋을 수정하거
9
스크랩
36
좋아요
0
댓글