Skip to main content

Enterprise Server 3.15 은(는) 현재 릴리스 후보로 제공됩니다.

명령줄에서 Git 다시 지정 사용

명령줄에서 git rebase를 사용하는 방법에 대한 간단한 자습서는 다음과 같습니다.

Git 다시 지정 사용

이 예제에서는 exec를 제외하고 사용 가능한 모든 git rebase 명령을 다룹니다.

터미널에 git rebase --interactive HEAD~7를 입력하여 다시 지정을 시작합니다. 즐겨 찾는 텍스트 편집기에 다음 줄이 표시됩니다.

pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B

이 예제에서는 다음을 사용합니다.

  • squash를 사용하여 다섯 번째 커밋(fa39187)을 "Patch A" 커밋(1fc6c95)에 스쿼시합니다.
  • 마지막 커밋(7b36971)을 "Patch B" 커밋(6b2481b) 위로 이동하고 pick으로 유지합니다.
  • "A fix for Patch B" 커밋(c619268)을 "Patch B" 커밋(6b2481b)에 병합하고, fixup을 사용하여 커밋 메시지를 무시합니다.
  • edit을 사용하여 세 번째 커밋(dd1475d)을 두 개의 더 작은 커밋으로 분할합니다.
  • reword를 사용하여 철자가 틀린 커밋(4ca2acc)의 커밋 메시지를 수정합니다.

휴우! 할 일이 많은 것처럼 들리지만 한 번에 한 단계씩 수행하면 쉽게 변경할 수 있습니다.

시작하려면 파일의 명령을 다음과 같이 수정해야 합니다.

pick 1fc6c95 Patch A
squash fa39187 something to add to patch A
pick 7b36971 something to move before patch B
pick 6b2481b Patch B
fixup c619268 A fix for Patch B
edit dd1475d something I want to split
reword 4ca2acc i cant' typ goods

각 줄의 명령을 pick에서 관심이 있는 명령으로 변경했습니다.

이제 편집기를 저장하고 닫습니다. 그러면 대화형 다시 지정이 시작됩니다.

Git은 아무것도 수행할 필요가 없으므로 첫 번째 다시 지정 명령 pick 1fc6c95를 건너뜁니다. 다음 명령 squash fa39187로 이동합니다. 이 작업에는 입력이 필요하므로 Git에서 텍스트 편집기가 다시 열립니다. 열리는 파일은 다음과 같습니다.

# This is a combination of two commits.
# The first commit's message is:

Patch A

# This is the 2nd commit message:

something to add to patch A

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   a
#

이 파일은 Git이 다음과 같이 말하는 것과 같습니다. “지금 이 squash로 하려는 게 바로 이것이에요.” 첫 번째 커밋의 메시지("Patch A") 및 두 번째 커밋의 메시지("something to add to patch A")를 나열합니다. 이러한 커밋 메시지에 만족하면 파일을 저장하고 편집기를 닫을 수 있습니다. 만족하지 않으면 간단하게 텍스트를 변경하여 커밋 메시지를 변경할 수 있습니다.

편집기가 닫히면 다시 지정이 계속됩니다.

pick 1fc6c95 Patch A
squash fa39187 something to add to patch A
pick 7b36971 something to move before patch B
pick 6b2481b Patch B
fixup c619268 A fix for Patch B
edit dd1475d something I want to split
reword 4ca2acc i cant' typ goods

Git은 두 pick 명령(pick 7b36971pick 6b2481b)을 처리합니다. 상호 작용이 필요하지 않으므로 또한 fixup 명령(fixup c619268)을 처리합니다. fixupc619268의 변경 내용을 그 이전의 커밋인 6b2481b에 병합합니다. 두 변경 내용 모두 동일한 커밋 메시지를 포함하게 됩니다("Patch B").

Git은 edit dd1475d 작업에 도달하면 멈춘 후 터미널에 다음 메시지를 출력합니다.

You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

이 시점에서 프로젝트의 파일을 편집하여 추가로 내용을 변경할 수 있습니다. 변경할 때마다 새 커밋을 수행해야 하며, git commit --amend 명령을 입력하여 수행할 수 있습니다. 모든 변경 작업을 마쳤으면 git rebase --continue를 실행할 수 있습니다.

그러면 Git이 reword 4ca2acc 명령에 도달합니다. 텍스트 편집기가 한 번 더 열리고 다음 정보가 표시됩니다.

i cant' typ goods

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD^1 <file>..." to unstage)
#
# modified:   a
#

이전과 마찬가지로 Git은 편집할 커밋 메시지를 표시합니다. 텍스트를 변경하고("i cant' typ goods"), 파일을 저장하고, 편집기를 닫을 수 있습니다. 다시 지정이 완료되고 터미널로 돌아갑니다.

다시 지정된 코드를 GitHub에 푸시

Git 기록을 변경했으므로 일반적인 git push origin은 작동하지 않게 됩니다. 최신 변경 내용을 “강제 푸시”하여 명령을 수정해야 합니다.

# Don't override changes
$ git push origin main --force-with-lease

# Override changes
$ git push origin main --force

강제 푸시는 분기에 대한 커밋의 기록 시퀀스를 변경하기 때문에 심각한 영향을 미칩니다. 특히 리포지토리에 여러 사람이 액세스하는 경우 주의해서 사용해야 합니다.

추가 참고 자료