Git에서 이전 커밋 메시지 변경


136

여기에 설명 된 것처럼 오래된 커밋 메시지를 편집하려고했습니다 .

내가 실행하려고하면 문제는, 지금이다 rebase -i HEAD~5는 말한다 interactive rebase already started.

그래서 시도해보십시오 : git rebase --continue하지만이 오류가 발생했습니다 :

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

어떤 아이디어?

답변:


125

그것은 말한다 :

편집기를 저장하고 종료하면 해당 목록의 마지막 커밋으로 되감기 고 다음 메시지와 함께 명령 행에 표시됩니다.

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

그것은 의미하지 않습니다 :

다시 입력 git rebase -i HEAD~3

하려고 하지 입력 git rebase -i HEAD~3편집기를 종료 할 때, 그리고 그것을 잘 작동합니다.
(그렇지 않으면 특정 상황에서 git rebase -i --abort모든 것을 재설정하고 다시 시도 할 수 있도록해야 할 수도 있습니다)


Dave Vogt 가 의견에서 언급 했듯이 첫 번째 커밋을 수정 한 후git rebase --continue rebasing 프로세스의 다음 작업으로 이동합니다 .

또한 Gregg Lind그의 대답 에서 다음 reword명령을git rebase 언급합니다 .

"pick"명령을 "edit"명령으로 바꾸면 git rebase해당 커밋을 적용한 후 중지하도록 지시하여 파일 및 / 또는 커밋 메시지를 편집하고 커밋을 수정 한 후 리베이스를 계속할 수 있습니다.

커밋에 대한 커밋 메시지를 편집하려면 pickrewordGit1.6.6 (2010 년 1 월) 이후로 " " 명령을 " " 명령으로 바꾸십시오 .

쉘에 제어를 반환하지 않고 커밋 메시지를 편집 할 수만 있다는edit 점을 제외하고는 대화식 리베이스 중에 ' ' 와 동일한 작업 을 수행합니다 . 이것은 매우 유용합니다.
현재 커밋 메시지를 정리하려면 다음을 수행해야합니다.

$ git rebase -i next

그런 다음 모든 커밋을 'edit'로 설정하십시오. 그런 다음 각각에 :

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

'사용 reword'대신하는 것은 ' edit'당신은 건너 뛸 수 git-commitgit-rebase통화를 .


2
또한 git rebase --continue첫 번째 커밋을 수정 한 후 rebasing 프로세스의 다음 작업으로 이동하십시오.
Dave Vogt

1
커밋 메시지 변경을위한 github wiki 기사에 링크 추가
Joy

60

Gregg Lind가 제안한 것처럼 reword 를 사용 하여 커밋 메시지 만 변경하라는 메시지를 표시 할 수 있습니다 (커밋은 그대로 유지).

git rebase -i HEAD~n

여기 n에 마지막 n 커밋 목록이 있습니다.

예를 들어를 사용하는 경우 git rebase -i HEAD~4다음과 같은 내용이 표시 될 수 있습니다.

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

이제 메시지를 편집하려는 커밋에 대해 pickreword 로 바꾸십시오 .

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

파일을 저장 한 후 편집기를 종료하면 다음으로 reword 로 표시된 커밋에 대한 메시지를 메시지 당 하나의 파일 로 편집하라는 메시지가 표시 됩니다. 당신이 교체 할 때이 메시지를 커밋 바로 편집에 훨씬 간단 했 참고 pickreword하지만, 그 일을하는 것은 아무런 효과가 없습니다.

커밋 메시지 변경 에 대한 GitHub의 페이지에서 자세히 알아보십시오 .


잘 설명했다. 감사합니다 : D
Shubham Jain

고마워 @ShubhamJain 내 대답이 유용하다는 것이 행복합니다
Punit Vara

나는 그렇게했다가 다른 지점에서 온 커밋이 나의 지점에 나타납니다
Reza

@Reza 당신은 뭔가를 엉망으로 만들었을 것입니다. 다른 리포지토리에서 시도하십시오. 이 솔루션은 완벽하게 작동합니다
Punit Vara

54

FWIW, git rebase interactive는 이제 "reword"옵션을 가지고있어 훨씬 덜 고통 스럽습니다!


3
를 사용할 때 reword왜 git은 단순히 커밋 목록으로 해당 파일의 커밋 메시지를 편집하도록 허용하지 않습니까? 대신 한 reword줄에 하나의 커밋 메시지 파일로 편집기를 시작합니다 . 이것은 불필요합니다. 다른 명령을 실행 pick하거나 reword외부 명령을 실행해야하는 경우에도 필요 reword하지 않습니다.
Dan Dascalescu

9

다른 옵션을 제공하고 싶었습니다. 제 경우에는 보통 개인 브랜치에서 일하고 나서 마스터로 합병하며, 현지에서하는 개인 커밋은 그렇게 중요하지 않습니다.

Jira에서 적절한 티켓 번호를 확인하지만 대소 문자를 구분하는 git hook으로 인해 코드를 푸시하지 못했습니다. 또한 커밋은 오래 전에 수행되었으며 리베이스에서 다시 커밋하는 커밋 수를 세고 싶지 않았습니다.

그래서 내가 한 일은 최신 마스터에서 새 분기를 만들고 문제 분기의 모든 커밋을 새 분기의 단일 커밋으로 스쿼시하는 것입니다. 저에게는 더 쉬웠으며 나중에 참조 할 수 있도록하는 것이 좋습니다.

최신 마스터에서 :

git checkout -b new-branch

그때

git merge --squash problem-branch
git commit -m "new message" 

심판 : https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch


1
당신의 대답은 정말로 내 하루를 구했습니다 :). 나는 rebase -i약 2 시간 동안 어려움을 겪고 있었고 성공하지 못했습니다. 내 커밋은 18 커밋 뒤에 있었으므로 상상할 수 있습니다. 이것은 rebase를 사용할 필요없이 내가 찾을 수있는 더 간단하고 편리한 방법이었습니다. 덕분에 친구!
Carlos Parra

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