첫 번째 git 커밋 메시지를 어떻게 바꾸나요?


116

3 개의 커밋을 포함하는 작업 트리가 있습니다.

➜ ~ myproject git :( 마스터) git log

commit a99cce8240495de29254b5df8745e41815db5a75
Author: My Name <my@mail.com>
Date:   Thu Aug 16 00:59:05 2012 +0200

    .gitignore edits

commit 5bccda674c7ca51e849741290530a0d48efd69e8
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:36:39 2012 +0200

    Create .gitignore file

commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:13:05 2012 +0200

    Initial commit (with a misleading message)

이제 첫 번째 커밋reword 의 커밋 메시지를 원합니다 (6707a66).

➜ ~ myproject git :( 마스터) git rebase -i 6707

(… vim 입력)

pick 5bccda6 Create .gitignore file
pick a99cce8 .gitignore edits

# Rebase 6707a66..a99cce8 onto 6707a66
#
# 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
#
# 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

이 경우 reword문제의 커밋 메시지 를 수정하고 싶습니다 ( git parlance).

초기 커밋 (오해의 소지가있는 메시지 포함)

… 적절한 것으로.

당연히 첫 번째 커밋에는 부모 커밋 이 없기 때문에 위의 시도가 성공하지 못했습니다 . (그리고 당신이 원하는 것 이전rebase다음으로 오래된 커밋을 참조해야 할 때 , 맞습니까?)reword

내 질문의 요지는 다른 방법으로 이것을 달성 할 수 있습니까?


아니면 그냥 저장소의 멍청한 quirk로 영원히
Christopher


^ 매우 사실입니다 ...이 특정 질문을 제대로 검색했다고 생각했지만 저와 같은 질문입니다. 내 질문의 카피 라이팅을 완성하는 데 엄청난 양이 있습니다. :-P
Henrik

1
@hced : :) 당신의 카피 라이팅 낭비하지 않습니다 - 그것은 미래의 해결책을 찾기 위해 다른 사람들을 돕는 것, 그것이 중복으로 닫히지했다조차
마크 Longair

2
이 질문을 접하는 사람은 첫 번째 커밋의 메시지 변경에 대한 내 대답 을 찾을 수 있습니다 . (git) 도움이됩니다.

답변:


214

하다 git rebase -i --root

( root특정 커밋을 가리키는 대신 가리킴)

이런 식으로 첫 번째 커밋도 포함되며 reword다른 커밋과 마찬가지로 할 수 있습니다 .

--root옵션은 Git v1.7.12(2012) 에서 도입되었습니다 . 그 이전 만 옵션을 사용하는 것이 었 filter-branch또는 --amend일반적으로 더 열심히해야 할 일이다.

참고 : 이 유사한 질문 및 답변을 참조하십시오 .


12

항상 다음을 사용할 수 있습니다 git filter-branch --msg-filter.

git filter-branch --msg-filter \
  'test $GIT_COMMIT = '$(git rev-list --reverse master |head -n1)' &&
echo "Nice message" || cat' master

1
fork0 : 좋습니다. 감사합니다. 더 나은 단어가 없기 때문에 이것이 "합법적 인"관행으로 간주되는 것이 궁금합니다. 내 말은, 이렇게하는 것이 일반적 / 권장입니까? 또한 잘못된 커밋 메시지가있는 경우이 작업을 반복 할 수 있습니까? 그 이유는 내가 처음에 잘못된 커밋 SHA-1을 사용하여 스 니펫을 복사하여 수행했기 때문입니다. 이 명령을 다시 한 번 사용한 후, 이번에는 올바른 SHA-1 (첫 번째 커밋, 6707a66)을 사용하여 나에게 충격을 받았습니다.
Henrik

글쎄, 그것은 일반적입니다 :) 그리고 네, 당신은 그것을 반복 할 수 있습니다. 그냥 추가 -f하면 계속 진행되고 항상 주어진 브랜치의 커밋을 다시 작성합니다. refs/original/master명령을 실행하기 전에 처음의 분기 참조 값이에 저장되었습니다 .
fork0

물론 저장된 참조를 제거하거나 이름을 바꿀 수 있습니다.
fork0

2
복사 된 커밋 ID로 실수가 발생하지 않도록 코드를 업데이트했습니다. 이제 코드를 복사하여 붙여 넣을 수도 있습니다. 그러나 경고 한 마디 : 초기 커밋이 두 개 이상인 경우 (즉, 관련되지 않은 분기를 둘 이상 병합 한 경우) 올바르게 작동하지 않습니다
fork0

3
@hced : "게시 된 히스토리"로 간주되는 커밋을 다시 작성하는 것은 일반적으로 나쁜 생각입니다. 귀하의 경우에는 루트 커밋을 조상으로 사용하는 커밋에 대해 다른 사람이 작업 한 적이 있다면 일반적으로 이것을하지 않아야 함을 의미합니다.
마크 Longair

12

pcreux의 요지 는 첫 번째 커밋을 바꾸는 좋은 방법입니다.

# You can't use rebase -i here since it takes the parent commit as argument.
# You can do the following though:
git checkout FIRST_COMMIT_SHA && git commit --amend && git rebase HEAD master

3
현재 자식 1.7.12 , git rebase -i --rootflorisla에 의해 제안, 길을 가야하는 것입니다.
Douglas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.