힘내 : 병합 커밋의 메시지를 편집 / 변경하는 방법은 무엇입니까?


148

병합 커밋 메시지를 편집하거나 변경하려면 어떻게합니까?

git commit --amend마지막 커밋 ( HEAD) 인 경우 작동 하지만 이전에 오는 경우 어떻게 HEAD됩니까?

git rebase -i HEAD~5 병합 커밋을 나열하지 않습니다.

답변:


207

당신이 추가 할 경우 --preserve-merges옵션 (또는 동의어를 -p받는) git rebase -i명령 다음 자식은 리베이스보다는 역사를 선형화 할 때 병합을 유지하기 위해 노력할 것입니다, 당신은뿐만 아니라 병합 커밋을 개정 할 수 있어야한다 :

git rebase -i -p HEAD~5

1
나는이 일을하지만 내 변경 한 후에 나는 내가이 얻을 시도하고 내 변경 사항을 추진 한! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to
마크

1
git push -f를 실행 한 다음 오리진 분기를 실행하십시오. 이 작동합니다. 나는 똑같은 문제를 겪었습니다. 어떤 이유로 든 이것은 근본적으로 일어난 일이기 때문에 rebasing의 인공물입니다.
Radu Comaneci

11
@Marc 이것은 이미 보낸 커밋을 수정했기 때문에 발생합니다. 서버는 사용자와 동료를 완전히 비 동기화 할 수 있으므로 서버로 강제 푸시하는 것은 나쁜 습관으로 간주됩니다. 글쎄, 당신이 혼자라면 문제가되어서는 안됩니다.
ibizaman

HEAD~5수정하려는 커밋의 부모는 어디에 있습니까 (보통 sha1 ^).
Gabriel Devillers

2
--preserve-merges은 지금--rebase-merges
OrangeDog

32

그 주 git1.7.9.6을 시작 , (그리고 git1.7.10 +) git merge자체는 항상 편집기를 트리거 는 병합에 세부 사항을 추가 할 수.

git merge $tag주석이 달린 태그를 병합하려면 " "는 대화식 편집 세션 중에 항상 편집기를 엽니 다. v1.7.10 시리즈는 이전 스크립트가이 동작을 거부 할 수 있도록 환경 변수 GIT_MERGE_AUTOEDIT를 도입했지만 유지 관리 트랙에서도이를 지원해야합니다.

또한 GIT_MERGE_AUTOEDIT오래된 스크립트 가이 동작을 거부 할 수 있도록 환경 변수 를 도입했습니다 .

" Git 1.7.10 예상 "을 참조하십시오 .

최근 Git 메일 링리스트 에 대한 토론에서 Linus는 이것이 Git 역사 초기에 디자인 실수 중 하나라는 점을 인정했습니다.
1.7.10 이상에서 대화식 세션에서 실행되는 git merge 명령 (예 : 표준 입력과 표준 출력이 터미널에 연결됨)은 병합 결과를 기록하기위한 커밋을 만들기 전에 편집기를 열어서 사용자는 충돌 병합을 해결 한 후 사용자가 실행하는 git commit 명령과 같이 병합을 설명 할 수 있습니다.

리누스는 말했다 :

그러나 실제로 어떻게 작동하는지 깊이 신경 쓰지 않습니다. 주된 문제는 git이 병합 메시지를 너무 쉽게 만들 수 없다는 것입니다.
그 중 일부는 더 단순한 관용구라고 생각 합니다. "git merge"에 대해 기본적으로 편집기를 시작하지는 않지만 ""에 대해서는 수행합니다 git commit.
이는 디자인 실수였으며 실제로 병합에 메모를 추가하려면 추가 작업을 수행해야 함을 의미합니다. 그래서 사람들은하지 않습니다
.


Git 2.17 (Q2 2018) 이전에는 " git rebase -p"병합 커밋의 로그 메시지가 엉망이되어 수정되었습니다.

Gregory Herrero (``)의 commit ed5144d (2018 년 2 월 8 일)를 참조하십시오 . 제안 : Vegard Nossum ( )Quentin Casasnovas ( ) . ( Junio ​​C Hamano의해 병합 -- 커밋 8b49408 , 2018 년 2 월 27 일)
vegardcasasnovas
gitster

rebase -p: 호출 할 때 잘못된 커밋 메시지 수정 git merge.

커밋 dd6fb00 ( " rebase -p: git merge2018 년 1 월, Git 2.16.0-rc2를 호출 할 때 수정 인용 ") 이후 , 병합 커밋의 커밋 메시지는 ' git rev-parse --sq-quote'를 실행하는 서브 쉘을 사용하여 merge 명령으로 전달됩니다 .

이 서브 쉘 주위에 큰 따옴표가 필요하므로 git merge명령에 줄 바꾸기가 유지됩니다 .

이 패치 전에 다음과 같은 병합 메시지가 나타납니다.

"Merge mybranch into mynewbranch

Awesome commit."

된다 :

"Merge mybranch into mynewbranch Awesome commit."

rebase -p.


Git 2.23 (2019 년 2 분기)에서 " merge -c"중 " "명령어 git rebase --rebase-merges는 새로운 병합을 생성하거나 기존 병합을 교체 할 필요가없는 경우에도 로그 메시지를 편집 할 수있는 기회를 제공합니다 (즉, 빨리 감기) ), 그렇지 않았습니다.
어느 것이 수정되었습니다.

Phillip Wood ( )의 commit 6df8df0 (2019 년 5 월 02 일)을 참조하십시오 . (의해 병합 Junio C 하마노 - -커밋 c510261 13 유월 2019)phillipwood
gitster


16

knittl https://stackoverflow.com/a/7599522/94687에 의한 기본 명령 만 사용하는 또 다른 좋은 대답 :

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

또는 더 나은 (보다 정확한) 최종 리베이스 명령 :

git rebase <sha of merge> previous_branch --onto HEAD

BTW, 기본 명령을 사용하면 CPU를 너무 많이 사용하지 않고 Git이 다음에 커밋 할 커밋 목록에 대한 생각을 마칠 때까지 알 수없는 시간을 기다리게하는 멋진 "기능"이있을 수 있습니다 git rebase -p -i HEAD^^^^(이러한 명령은 필자의 경우 마지막으로 약 4 초가 걸린 것처럼 병합으로 마지막 커밋 목록은 약 4 초였습니다!).


2
이것은 정말 유용합니다. 시간을 크게 절약하십시오. 내 회사는 리포지토리에서 커밋 메시지를 차단합니다. --amend 또는 rebase 명령을 사용하면 쉽지만 큰 분기 문제 : 일부 분기를 귀하의 분기에 병합하고 커밋을 수행하고 푸시하려고하면 git의 기본 병합 메시지가 차단됩니다 ( 이 메시지를 수정하도록 강요해야합니다. 이 답변까지는 성공하지 못한 커밋 기록 사이에서 병합 메시지를 변경하기 위해 많은 것을 시도했습니다.
Giovanni Silva

2

git merge --edit
비 대화식 병합의 경우에도 주석을 제공 할 수 있습니다.

git merge --edit --no-ff 개발 브랜치에서 rebasing하고 빨리 감기하지 않고 병합하여 git flow를 따르는 경우 유용 할 수 있습니다.


2

현재 Git 버전 (Mai 2020) :

git rebase -i -r <parent>,

다음 편집기에서 교체 merge -C ...merge -c ....

리베이스 작업 중에 편집기에서 커밋 메시지를 열어서 변경할 수 있습니다.

힌트 를 위해 VonC 에 감사합니다 .


0

git rebase -i HEAD~5명령은 편집기를 나타납니다. 지정된 커밋 (이 경우 5 개)을 나열합니다. 첫 번째 열에는 pick모든 커밋마다 포함 됩니다. 그냥 교체 pick와 함께 reword그 편집기와 가까운 편집기를 + 저장. 그런 자식은 모든 커밋 당신이 변경된 경우 편집기를 나타납니다 pickreword당신이 (가) 커밋 메시지를 편집 할 수 있습니다.


6
당신은 또한 추가하지 않는 한 병합이 작동하지 않습니다이 커밋 -p받는 git rebase명령.
Paul 가격

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