GitHub에서 커밋 메시지를 편집하는 방법이 있습니까?


129

GitHub를 커밋하고 푸시 한 후 커밋 메시지를 편집하는 방법이 있습니까? 인라인 주석뿐만 아니라 '메모 추가'가 있지만 커밋 메시지를 실제로 편집하지는 않습니다. git 확장에는 'amend commit'도 있지만 기존 메시지는 편집하지 않습니다.


커밋을 되돌릴 수 있습니다 (이 SO 질문의 일부 옵션 참조 : stackoverflow.com/questions/4114095/…)- 주석 변경을 위해 코드 변경 사항을 잃지 않도록 먼저 코드 변경 사항을 백업하십시오!
Traveling Tech Guy

답변:


183
  1. git rebase -i <commit hash you want to change>^

    그러면 각 커밋 및 작업 목록과 함께 기본 편집기 (일반적으로 ) 가 열립니다 . 기본적으로 조치는 pick입니다.

  2. 어떤 메시지를 변경하려면 저지를 들어, 변경 pickreword.

  3. 저장하고 종료하십시오 (vi :) :wq.

  4. 이러한 커밋마다 커밋 메시지를 편집 할 수있는 편집기가 제공됩니다. 적합하다고 생각되면 변경하고 저장하고 종료하십시오.

    커밋 메시지를 모두 편집하면 명령 프롬프트로 돌아가서 업데이트 된 메시지가 포함 된 새 트리가 생깁니다.

  5. 이제를 사용하여 github에 업로드 할 수 있습니다 git push origin --force.

마지막 커밋을 수정해야하는 경우 1-4 단계를로 바꿀 수 있습니다 git commit --amend.


3
@MatthewPeters 방법이 있어야한다고 생각하지만 모르겠습니다. 명령 줄을 직접 사용합니다.
Mureinik

4
<변경하려는 커밋 해시>를 지정할 수있는 것 같지 않고, 변경하려는 커밋의 앞에 해시를 지정하거나 HEAD ~ x를 사용해야합니다. 여기서 x는 HEAD의 커밋 수입니다. 변경하려는 항목이 있습니다.
ssc327

3
@ ssc327 나는 ^거기에 있음에 유의하십시오 -실제로 변경하려는 커밋의 부모를 기반으로 제안했습니다.
Mureinik

2
@Murenik 당신이 맞아요, 난 어떻게 든 ^를보고 그리워 ^
ssc327

1
@deadfish Windows 명령 행을 사용하여 다음 ^^과 같이 리터럴로 명령을 종료하도록 입력해야합니다 ^ . 예 : git rebase -i 2c747b32^^
Wyck

35

Intellij Idea에서는 그렇게 쉽게 할 수 있습니다.

  1. 공개 버전 관리 (내역)
  2. 로그 탭 선택
  3. 커밋을 선택하여 댓글 변경
  4. F2 (Mac fn + F2)를 누르고 커밋 메시지를 업데이트하십시오.

1
이미 원격으로 푸시 한 경우 작동하지 않습니다.
paynd

8
git push origin --force@Mureinik의 답변에서 제안한대로 나중에 실행해야 합니다.
Dan Macák

1
커밋이 이미 푸시 된 경우 "reword"옵션이 비활성화됩니다.
huyz

1
푸시 된 커밋에 대해 Intellij IDEA로이를 수행하려면 먼저 Git의 명령 행에서와 같이 대화식 리베이스로 시작해야합니다. 리베이스를 수행하려면 프로젝트-> "Git"메뉴 항목-> "Repository"-> "rebase ..."(마지막 메뉴 항목)를 마우스 오른쪽 버튼으로 클릭하십시오. "Onto"필드에서 수정하려는 커밋 앞에 SHA를 삽입하고 "Rebase"를 클릭하십시오. 그런 다음 대화식 rebase 프롬프트가 표시됩니다. 수정하려는 커밋 옆에있는 작업 드롭 박스에서 "리워드"를 선택하고 "리베 이싱 시작"버튼을 클릭하십시오 (다음 주석에서 계속됨)
jplandrain

1
(계속) 그러면 수정하려는 모든 커밋에 대한 텍스트 프롬프트가 표시됩니다. 로그 메시지가 수정 된 후 추가 수정을 적용 할 수 있습니다 (이제 "reword"옵션이 더 이상 회색으로 표시되지 않습니다). 완료하면 대화식 리베이스를 마치기 위해 수정 사항을 강제로 푸시 할 수 있습니다. 전체 프로세스는 실제로 명령 줄에서 대신 @Mureinik의 답변과 정확히 동일합니다.
jplandrain

3

전제:

git-graph가 다음과 같은 경우 ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192그리고 b7ec061커밋 해쉬는 target-commit과 parent-commit의 커밋 해시입니다.)

해결책:

다음 지침을 입력하면됩니다 ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

설명:

  1. git reset --soft b7ec061 파일 변경 사항을 유지하고 부모 커밋으로 재설정합니다 (예 : b7ec061).
  2. git commit -m "..." 로컬로 새로운 커밋을 생성합니다
  3. git push -f 새 커밋을 서버로 푸시하고 이전 커밋을 교체합니다 (예 : df9c192)

2

또 다른 옵션은 오류가 포함 된 커밋 개체를 참조하는 추가 "에라타 커밋"(및 푸시)을 생성하는 것입니다. 새로운 에라타 커밋도 수정 기능을 제공합니다. 정오표 커밋은 실질적인 코드 변경은 없지만 중요한 커밋 메시지와 같은 커밋입니다. 예를 들어 readme 파일에 공백 문자 하나를 추가하고 중요한 커밋 메시지로 해당 변경 사항을 커밋하거나 git 옵션을 사용하십시오 --allow-empty. rebasing보다 확실히 쉽고 안전하며 실제 기록을 수정하지 않으며 분기 트리를 깨끗하게 유지합니다.amend가장 최근의 커밋을 수정하는 경우에도 좋은 선택이지만 에라타 커밋은 이전 커밋에 적합합니다. 이러한 유형의 일은 단순히 실수를 문서화하는 것만으로 충분하지 않습니다. 나중에 git log를 통해 기능 키워드를 검색해야하는 경우, 원래 커밋 (오래된 오타)에 잘못된 키워드가 사용 되었기 때문에 원래 (잘못된) 커밋이 나타나지 않을 수 있지만 키워드가 나타납니다. 정오표 커밋에서 오타가있는 원래 커밋을 가리 킵니다. 예를 들면 다음과 같습니다.

$ 자식 로그
커밋 0c28141c68adae276840f17ccd4766542c33cf1d
저자 : 첫 번째 마지막 
날짜 : 수 8 월 8 일 15:55:52 2018-0600

    에라타 커밋 :
    이 커밋에는 실질적인 코드 변경이 없습니다.
    이 커밋은 이전 커밋 메시지에 대한 수정 사항을 문서화하기 위해서만 제공됩니다.
    이것은 오브젝트 e083a7abd8deb5776cb304fa13731a4182a24be1을 커밋하는 것과 관련이 있습니다.
    원래 잘못된 커밋 메시지 :
        배경색을 빨간색으로 변경
    수정 (* 변경 사항 강조 표시 *) :
        배경색을 * blue *로 변경

커밋 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
저자 : 첫 번째 마지막 
날짜 : 수 8 월 8 일 15:43:16 2018-0600

    일부 임시 커밋 메시지

커밋 e083a7abd8deb5776cb304fa13731a4182a24be1
저자 : 첫 번째 마지막 
날짜 : 수 8 월 8 일 13:31:32 2018-0600

    배경색을 빨간색으로 변경

안전하지만 읽을 텍스트가 많습니다. 나는 역사를 다시 쓰는 것을 선호한다 :)
pkalinow

0

@Mureinik의 답변은 좋지만 초보자는 이해할 수 없습니다.

첫 번째 방법 :

  1. 최신 커밋 메시지 만 편집하려면 다음 만 필요 git commit --amend하면 다음을 볼 수 있습니다.
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. 보시다시피,과 같은 명령 접두어없이 맨 위에 메시지를 커밋하십시오. pick이것은 이미 편집 페이지 이므로 맨 위 메시지를 직접 편집하고 다음 과 같이 save & quit 할 수 있습니다 .
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. 그런 다음 git push -u origin master --force또는 <how you push normally> --force. 여기서 핵심은 --force입니다.

두 번째 방법 :

  1. git log저장소 URL에서 커밋 해시를 보거나 추출 할 수 있습니다.881129d771219cfa29e6f6c2205851a2994a8835

  2. 그런 다음 git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835또는 할 수 있습니다 git rebase -i HEAD^(최신 경우)

  3. 당신은 볼 것이다 :

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. 당신이 볼하지만 만약 noop당신이 경우에 당신은 아마 예를 들어, 잘못 입력하는 다음 git rebase -i 881129d771219cfa29e6f6c2205851a2994a88실종 된 ^끝에, 당신은 더 나은 저장하고 원인을 파악하지 않고 편집기를 종료합니다 :
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. noop문제 가 없으면 단어 pick를로 변경하고 reword다른 단어 는 그대로 남아 있습니다 (이 시점에서 커밋 메시지를 편집하지 마십시오).
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. 저장 및 종료는 방법 # 1과 유사한 편집 페이지 를 보게됩니다 .
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. 방법 # 1과 같은 메시지를 맨 위에 편집하고 다음과 같이 저장하고 종료하십시오.
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. 다시, 방법 # 1과 마찬가지로 do git push -u origin master --force또는 <how you push normally> --force. 여기서 핵심은 --force입니다.

자세한 내용 은 doc을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.