git에서 잘못된 커밋 메시지를 어떻게 편집합니까?


152

역사에서 커밋 메시지를 더 깊이 수정하고 많은 새로운 커밋을 푸시했습니다.

커밋 메시지를 어떻게 변경합니까? 가능합니까?

답변:


125

Linus Torvalds의 메시지가 귀하의 질문에 대답 할 수 있습니다.

이전 커밋 메시지 수정 / 편집

짧은 대답 : 당신은 (누르면) 할 수 없습니다.


추출물 (Linus는 BitKeeper를 BK라고합니다) :

BK에서는 할 수있는 역사적 관심사를 제외하고 참고하십시오.

그리고 당신이 그것에 익숙하다면 (실제로) 그것은 실제로 아주 실용적이었습니다. Andrew의 패치 폭탄을 적용하고 문제가 있음을 확인한 후 밀어 내기 전에 편집하십시오.

나는 자식과 같은 일을 할 수 있었다. 커밋 메시지를 이름의 일부로 만들지 않고 기록이 변경되지 않았 음을 보장하고 "나중에 주석 수정"을 허용하는 것이 쉬웠을 것입니다.

그러나 나는하지 않았다.

그것의 일부는 순전히 "내부 일관성"입니다. Git은 SHA1로 보호되는 모든 것과 객체 유형에 관계없이 동일하게 취급되는 모든 객체 덕분에 더 깨끗한 시스템입니다. 네, 서로 다른 4 가지 종류의 개체가 있으며 모두 실제로 다르며 같은 방식으로 사용할 수 없지만 동시에 디스크에서 인코딩이 다를지라도 개념적 으로는 모두 정확하게 작동합니다 똑같다.

그러나 내부 일관성은 실제로 융통성이 없다는 변명의 여지가 아니며 실수가 발생한 후에 실수를 해결할 수 있다면 분명히 융통성이 있습니다. 그래서 그것은 정말로 강력한 주장이 아닙니다.

실제 방법, 당신은 메시지를 신뢰할 수 있다는 : 이유 자식을 사용하면 매우 간단되는 최대 메시지의 끝을 커밋 변경할 수 없습니다. 사람들이 나중에 변경하도록 허용 한 경우 메시지는 본질적으로 신뢰할 수 없습니다.


완료, 당신은 할 수 당신이 원하는 무엇을 반영하기 위해 해당 지역의 커밋의 역사를 다시 sykora에 의해 제안 (일부 REBASE로하고, 헐떡 거림을 --hard 다시!)

그러나 수정 된 히스토리를 다시 게시하면 ( "빨리 감기"커밋이 발생하지 않더라도 푸시가 발생하도록 강제 git push origin +master:master하는 +표시로) ... 문제가 생길 수 있습니다.

이 다른 질문에서 추출하십시오.

실제로 한 번은 --force를 사용하여 git.git 저장소에 푸시하고 Linus BIG TIME에 의해 꾸짖 었습니다. 그것은 다른 사람들에게 많은 문제를 일으킬 것입니다. 간단한 답변은 "하지 마십시오"입니다.


좋은 대답입니다. 최신 버전의 git에서 이미 푸시 된 커밋 메시지를 변경할 수 있는지 알고 있습니까? '09 년에 게시 된 이후로 변경된 사항이 있습니까?
David West

@DavidWest와 동일한 원칙이 적용됩니다. 기록을 다시 작성하고 강요 할 수 있습니다.
VonC

2
보다 구체적으로 커밋을 수정 / 리베이스하면 커밋 식별자 (git 인덱스의 16 진 해시)가 필연적으로 변경됩니다. 그것은 편집 된 커밋이 git VCS 히스토리에서 이전 커밋과 다르게 취급된다는 것을 의미합니다. 즉, 개발 팀원이 불행히도 이전 커밋을 이미 가져온 경우 편집 된 새 커밋을 가져 와서 로컬 작업 복사본에서 이전과 새 커밋을 병합해야합니다.
Shigerello

1
동료의 편의를 위해 편집 된 커밋을 새로 추가하는 것이 좋습니다. 따라서 동료의 작업 복사본에서 병합 할 필요가 없습니다.
Shigerello

28

현재 git replace 가 트릭을 수행 수 있습니다.

세부 사항 : 임시 작업 분기 작성

git checkout -b temp

교체 커밋으로 재설정

git reset --hard <sha1>

올바른 메시지로 커밋 수정

git commit --amend -m "<right message>"

이전 커밋을 새 커밋으로 교체

git replace <old commit sha1> <new commit sha1>

당신이 있던 지점으로 돌아가

git checkout <branch>

임시 지점 제거

git branch -D temp

푸시

guess

끝난.


11
@Jonah : 나는 원격 지사에 밀어하려고 할 때 나는 "모든 최신의"메시지를 받고 있어요
사이먼 Kagwi

1
다른 답변에서 언급했듯이 rebase -i를 reword와 함께 사용하십시오. 그리고 그것은 역사를 다시 쓸 것입니다.
Sylvain

내가 찾던 해결책에 감사드립니다. 당신은 내 시간을 절약!
Tomasz Kuter

1
@Jonah-문제가 있습니다 ... 귀하의 솔루션이 커밋 로그를 로컬로 업데이트했지만 원격으로 업데이트하지 않았습니다. 그들을 밀어 올리는 방법?
Tomasz Kuter

1
@ TomaszKuter, 나는 당신과 같은 문제가있었습니다. 커밋 메시지가 원격으로 업데이트되지 않았습니다. GitHub의 help.github.com/articles/changing-a-commit-message 도움말을 사용하여 문제를 해결했습니다 . 다음을 수행하십시오. 이전 또는 여러 커밋 메시지의 메시지 수정 섹션. 커밋 메시지를 이미 변경 한 경우 다시 선택하지 않고 선택 및 저장을 수행 할 수 있습니다.
evaldeslacasa

19

git rebase -i대화식으로 'i'를 (분기에서 분기 한) 사용할 수 있습니다 .

바꾸기 pick(가) 당신이 변경하려는 주석 커밋에 다음을 r(또는 reword) 저장하고 종료하고 편집을 할 수 있습니다 있도록하고시.

git push 다시 한번 당신은 끝났습니다!


1
병합 커밋에서 메시지를 편집 할 수 없습니다. 이 명령의 일부 변형으로 가능합니까?
Andrew Mao

1
시도 -p의 인수 rebase하는 p예비 병합합니다.
Cactus

3
나는이 절차를 좋아하지만 처음에는 대답을 이해하지 못했습니다. 경우 누군가가 도움을 필요로하는, 그것에 대해 Githulb 도움말 페이지를 제공하는 좋은 정보 : help.github.com/articles/changing-a-commit-message
evaldeslacasa

15

다음과 같은 나무가 있다고 가정하십시오.

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]

먼저 checkout임시 지점 :

git checkout -b temp

temp지점, reset --hardA는 당신이 (입니다 커밋, 예를 들어 그 메시지를 변경하려는 커밋에 946992) :

git reset --hard 946992

amend메시지를 변경하는 데 사용하십시오 .

git commit --amend -m "<new_message>"

그 후 나무는 다음과 같이 보일 것입니다.

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
           \
            b886a0 [temp]

그런 다음 cherry-pick모든는 앞서의 커밋 946992에서 mastertemp하고, 사용을 커밋 amend이 아니라 자신의 메시지를 변경하려면 :

git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>

나무는 이제 다음과 같습니다 :

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
               \
                b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]

이제 임시 지점을 원격으로 강제 푸시하십시오.

git push --force origin temp:master

마지막 단계 master는 로컬에서 분기 를 삭제 하여 서버에서 git fetch origin분기를 master가져온 다음 분기 master및 분기 삭제 로 전환합니다 temp.

이제 로컬 및 원격 모두에서 모든 메시지가 업데이트됩니다.


5

우리 상점에서는 인식 할 수있는 이름이 지정된 주석이 달린 태그를 추가하여 잘못된 메시지로 커밋하고 주석을 대체물로 사용하는 규칙을 소개했습니다.

이것은 일반적인 "git log"명령을 실행하는 사람들에게는 도움이되지 않지만 주석에서 잘못된 버그 추적기 참조를 수정하는 방법을 제공하며 모든 빌드 및 릴리스 도구는 규칙을 이해합니다.

이것은 일반적인 대답은 아니지만 사람들이 특정 커뮤니티 내에서 채택 할 수있는 것일 수 있습니다. 나는 이것이 더 큰 규모로 사용된다면 확실하게 어떤 종류의 도자기 지원이 자랄 수 있다고 확신합니다.


3
"git notes"도 비슷한 용도로 사용됩니다
Christian Goetze

2

( http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0에서 )

더 깊은 커밋 변경 방법

Git의 히스토리는 변경할 수 없으므로 가장 최근의 커밋 (분기 헤드가 아닌 커밋)을 수정하면 히스토리가 변경된 커밋 및 포워드에서 다시 작성되어야합니다.

이를 위해 StGIT를 사용하고, 필요한 경우 분기를 초기화하고, 변경하려는 커밋까지 커밋하지 않고 필요한 경우 팝업을 변경 한 다음 패치를 새로 고친 다음 (커밋 메시지를 수정하려면 -e 옵션을 사용하여) 패치를 새로 고치십시오. 모든 것과 stg commit.

또는 rebase를 사용하여 그렇게 할 수 있습니다. 새로운 임시 브랜치를 생성하고 git reset --hard를 사용하여 변경하려는 커밋으로 되 감고 커밋을 변경하고 (현재 헤드의 맨 위에 있음) git rebase --onto를 사용하여 변경된 커밋 맨 위에 브랜치를 리베이스하십시오.

또는 git rebase --interactive를 사용하면 패치 순서 변경, 축소 등과 같은 다양한 수정이 가능합니다.

나는 그것이 당신의 질문에 대답해야한다고 생각합니다. 그러나 코드를 원격 저장소로 푸시 하고 사람들이 코드를 가져간 경우 코드 히스토리와 수행 한 작업이 엉망이됩니다. 그러니 조심하십시오.


이론적으로는 좋은 대답, 실제로는 위험합니다 : stackoverflow.com/questions/253055#432518
VonC

0

Git Extensions를 사용하는 경우 : Commit 화면으로 이동하면 아래와 같이 하단에 "Amend Commit"이라는 확인란이 있습니다.

여기에 이미지 설명을 입력하십시오


@KrunalPandya 네, 또는 그냥 커밋 & 푸시를 누릅니다
batsheva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.