푸시 후 git commit 메시지 변경 (원격에서 가져온 사람이 없음)


981

나는 자식 커밋과 후속 푸시를 만들었습니다. 커밋 메시지를 변경하고 싶습니다. 올바르게 이해하면 변경하기 전에 누군가 원격 저장소에서 가져 왔을 수 있으므로 권장하지 않습니다. 아무도 뽑지 않았다는 것을 알면 어떻게합니까?

이것을 할 수있는 방법이 있습니까?


무엇을 시도 했습니까? 커밋 메시지를 이미 변경하고 시도하고 푸시하는 방법을 알고 있다고 가정하면 Git은이를 수행하기 위해 수행해야 할 작업을 알려줍니다.
Andrew Marshall

1
질문에 대한 답변을 참조하십시오 "git에서 잘못된 커밋 메시지를 어떻게 편집합니까? stackoverflow.com/a/457396/444639
Mike Rylander

4
그것을 선언-Google git commit rank no 1!
Manish Shrivastava


HEAD 커밋을 수정하고 일반적으로 --force없이 푸시하면 실패하지 않습니다. HEAD 커밋 메시지가 변경된 커밋 ID로 업데이트됩니다. HEAD를 제외한 다른 커밋 ID는 그대로 유지됩니다. git 2.8.1 버전 에서이 동작을 발견했습니다.
irsis

답변:


1371

역사 변경

가장 최근의 커밋 인 경우 다음과 같이하면됩니다.

git commit --amend

그러면 마지막 커밋 메시지가있는 편집기가 나타나고 메시지를 편집 할 수 있습니다. -m이전 메시지를 지우고 새 메시지를 사용하려는 경우 사용할 수 있습니다 .

미는

그런 다음 푸시 할 때 다음을 수행하십시오.

git push --force-with-lease <repository> <branch>

또는 "+"를 사용할 수 있습니다.

git push <repository> +<branch>

또는 다음을 사용할 수 있습니다 --force.

git push --force <repository> <branch>

이 명령을 사용할 때주의하십시오.

  • 다른 사람이 같은 지점으로 변경 사항을 푸시 한 경우 해당 변경 내용을 삭제하지 않으려 고 할 수 있습니다. --force-with-lease업스트림 변경이있는 경우는 (중단 때문에 옵션은 가장 안전

  • 브랜치를 명시 적으로 지정하지 않으면 Git은 기본 푸시 설정을 사용합니다. 기본 푸시 설정이 "일치"이면 여러 분기의 변경 사항을 동시에 삭제할 수 있습니다.

나중에 당기기 / 가져 오기

이미 가져온 사람은 이제 오류 메시지를 받게되며 다음과 같이하여 업데이트를해야합니다 (자신이 변경하지 않는다고 가정).

git fetch origin
git reset --hard origin/master # Loses local commits

사용시주의하십시오 reset --hard. 지점에 변경 사항이 있으면 변경 사항이 삭제됩니다.

히스토리 수정에 대한 참고 사항

파괴 된 데이터는 실제로는 오래된 커밋 메시지 일 뿐이지 만이를 --force알지 못하며 다른 데이터도 행복하게 삭제합니다. 그래서 생각 --force으로 "나는 데이터를 제거 할, 나는 파괴되는 데이터 확실히 알고있다." 그러나 파괴 된 데이터가 커밋 될 때 종종 참조 로그에서 오래된 커밋을 복구 할 수 있습니다. 데이터는 실제로 파괴되지 않고 분리 됩니다 (고아 진 커밋은 주기적으로 삭제되지만).

당신은 당신이 데이터를 파괴하고 생각하지 않으면, 멀리 --force... 나쁜 일이 일어날 수 있습니다 .

이것이 --force-with-lease다소 안전한 이유 입니다.


13
마치 "언제나 커밋 된 로컬 커밋이있는 것처럼"고정 "에주의하십시오 ( 실제로 고아를 잃어 버렸지 만 복구하는 것은 명백하지 않음).
Andrew Marshall

1
--force를 누를 때 분기 이름을 지정하려고 할 수 있습니다. 그렇지 않으면 예상보다 많이 밀어 넣을 수 있습니다.
user693960

1
@ user693960 : Git은 설정 한 내용 만 푸시합니다.
Dietrich Epp

10
간단하게 git push --force<저장소>와 <브랜치>없이 당신이 당신의 상류 설정을 경우 옵션도 사용할 수 있습니다.
ahnbizcad

2
당신은 예를 들어 줄 수 있습니까 <repository>? 그렇 origin습니까? org/repo? 아니면 그냥 repo?
MikeSchinkel

440

그냥 말해 :

git commit --amend -m "New commit message"

그리고

git push --force

8
제 경우에는 효과 git push origin <BRANCH-NAME>가 없었습니다 git push --force. 허용 된 답변에 설명 된대로 사용해야 했습니다.
Gabriel

1
이것은 나를 위해 작동하지 않습니다. 우리를 가져 가야 git push --force하거나 그렇지 않으면 푸시가 진행되지 않습니다.
ahnbizcad

4
@ahnbizcad, 작동합니다. 지점 이름이 올바른지 확인하십시오.
William

3
나는 당신의 설명의 단순성을 응원합니다! 나는 그것을 자주 사용한다
Vasikos

3
GitLab에서 호스팅하는 프로젝트에서 발생한 지점을 일시적으로 "보호 해제"한 후에 만이 명령을 성공적으로 적용했습니다. 이 문제가 발생하면 이러한 명령을 적용하기 전에이 stackoverflow.com/a/32267118/1423345 를 참조 하여 분기를 "보호 해제"하고 커밋 메시지를 수정 한 후 다시 "보호"할 수 있습니다.
John

261

가장 최근이 아닌 커밋을 편집하려면

Step1 : git rebase -i HEAD~n마지막 n커밋에 대한 대화식 리베이스 수행 (즉, 커밋 메시지 3 커밋을 변경하려면 git rebase -i HEAD~3)

git은 커밋을 처리하기 위해 편집기를 띄웁니다.

#  r, reword = use commit, but edit the commit message

바로 우리가 필요합니다!

2 단계 : 메시지를 업데이트하려는 커밋 pickr대해 변경하십시오 . 커밋 메시지를 변경하지 않아도 무시됩니다. 다음 단계에서 그렇게 할 것입니다. 편집기를 저장하고 닫습니다.

rebase 'plan'을 편집했지만 파일 이름을 바꾸는 프로세스가 시작되지 않으면 다음을 실행하십시오.

git rebase --continue

대화식 세션에 사용되는 텍스트 편집기를 변경하려면 (예 : 기본 vi에서 nano로) 다음을 실행하십시오.

GIT_EDITOR=nano git rebase -i HEAD~n

Step3 : Git은 r이전에 놓은 모든 개정에 대해 다른 편집기를 팝업합니다 . 커밋 메시지를 원하는대로 업데이트 한 다음 편집기를 저장하고 닫습니다.

Step4 : 모든 커밋 메시지가 업데이트 된 후. git push -f리모컨을 업데이트하고 싶을 수도 있습니다 .


21
수락 된 답변과 달리 가장 최근의 커밋 이외의 커밋을 변경할 수 있으므로 수락해야합니다. 당신은 내 하루를 구했습니다. 감사합니다!
xZero

1
마지막 3 개의 커밋에 대해 n = 3을 선택하십시오.git rebase -i HEAD~3
HeikoS

rebase 'plan'을 편집했지만 파일 이름을 바꾸는 프로세스를 시작하지 않으면을 실행하십시오 git rebase --continue. 당신이 (예를 들어, 기본에서 대화 형 세션에 사용되는 텍스트 편집기를 변경하고자하는 경우 vinano), 실행 GIT_EDITOR=nano git rebase -i HEAD~n.
Jamie Birch

좀 더 많은 정보를 추가하기 위해 이것을 편집했습니다. 좀 봐봐. 이것은 내가하고 싶은 일에 대한 대답이지만 헤더가 없기 때문에 스크롤했습니다.
Kip

@JamieBirch의 유용한 의견을 답변에 넣도록 제안 된 편집을했습니다. 검토하고 싶을 수도 있습니다.
Notts90은 Monica

44

콘솔에서 다음 두 단계를 사용하십시오.

git commit --amend -m "new commit message"

그리고

git push -f

완료 :)


Thx, 그 단계는 마지막 주석을 수정하기위한 것입니까, 아니면 오래된 주석에도 사용할 수 있습니까?
Jay

@Jay 답변이 늦어 죄송합니다.이 단계는 마지막 커밋 메시지를 수정하기위한 것입니다.
압둘 리즈 완

19

주목해야한다 당신이 사용하는 경우 push --force하여 여러개의 심판으로, 그들은 ALL 결과로 수정됩니다. git repo가 ​​푸시되도록 구성된 위치에주의를 기울여야합니다. 다행히 업데이트 할 단일 분기를 지정하여 프로세스를 약간 보호 할 수있는 방법이 있습니다. 자식 매뉴얼 페이지에서 읽으십시오 :

--force는 푸시 된 모든 참조에 적용되므로 push.default를 일치로 설정하거나 remote로 구성된 여러 푸시 대상과 함께 사용하면 * .push는 현재 분기 (예 : 로컬 참조 포함) 이외의 참조를 덮어 쓸 수 있습니다. 그들의 원격 상대방 뒤에 엄격히). 하나의 브랜치로만 푸시하려면 참조 스펙 앞의 +를 사용하여 푸시합니다 (예 : git push origin + master는 마스터 브랜치를 강제로 푸시합니다).


3
매우 중요한 참고 사항.
peterh-복 직원 모니카

서버에 대한 ForcePush 권한이 없기 때문에 강제 답변이 작동하지 않습니다. 대신 이전 커밋 메시지를 변경하는 커밋을 수행하고 싶습니다. 커밋의 의견 섹션에 "Commit message changed"를 쓸 수 있습니다.
nurettin

11

수정할 경우 이전이 아닌 마지막, 당신이 사용에 필요한 커밋 rebase여기에 설명 된대로 명령, Github에서 도움말 페이지 의에 이전 또는 복수의 개정 메시지는 메시지 커밋 섹션을


11

명령 1 .

git commit --amend -m "New and correct message"

그때,

명령 2 .

git push origin --force

8
git commit --amend

그런 다음 현재 창에서 메시지를 편집하고 변경하십시오. 그 후

git push --force-with-lease

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

    배경색을 빨간색으로 변경

로브, 이것은 유망 해 보인다. "에라타 커밋"을 수행하는 데 필요한 명령을 보여줄 수 있습니다. 이 게시물에만이 용어로 Google에 표시됩니다.
Jim

1
"에라타 커밋"은 단순히 이전의 잘못된 커밋을 참조하여 이전 실수에 대한 수정을 문서화하고 제공하는 메시지가있는 일반적인 커밋입니다. git commit -m “fixed feature A”(git이 커밋 ID에 e3ab7312를 부여한다고 가정하자. (나중에 메시지가 잘못되었다는 것을 알았으므로 이제 readme 파일에 공백을 추가하거나 —allow-emptygit 옵션을 사용하는 것과 같이 파일을 부적절하게 변경하십시오 ). .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc

1
... 나중에 "feature B"에 대한 참조를 위해 git log를 검색해야 할 경우, 에라타 커밋이 표시되지만, 에라타 커밋 메시지에는 완전한 추적 성을 제공하는 원래 커밋 ID에 대한 참조가 포함됩니다. BTW“errata commit”이라는 용어는 특별한 것이 아닙니다 (git에는“errata”명령이나 옵션이 없습니다) ... 이것은 오류 / 오타가있는 이전 커밋에 대한 수정을 제공하는 일반 커밋에 대한 나의 용어 일뿐입니다.
rob_7cc

로브, 잘 작동했습니다. SHA를 사용하여 원래 커밋을 가리키는 올바른 설명으로 새로운 빈 커밋을 추가 할 수있었습니다. 이제 두 모듈 모두 모듈의 'git chain'에 표시됩니다. 감사!
Jim

나는 당신을 위해 일하게되어 기쁘다. 커밋 메시지에서 실수를 수정하기 위해 동일한 기술을 사용합니다. 대안으로, 나는 최근에 git notes 이것이 "에라타 커밋"과 같은 목적을 수행한다는 것을 발견했다 . 커밋 메시지의 오류에 주석을 달거나 수정하기 위해 이전 커밋에 메모를 추가하기 만하면됩니다. https://git-scm.com/docs/git-notes
rob_7cc

0

이것은 꽤 잘 작동합니다.

git checkout origin / branchname

이미 지점에 있다면 당기거나 기지를 짓는 것이 좋습니다

git pull

또는

git -c core.quotepath=false fetch origin --progress --prune

나중에 간단하게 사용할 수 있습니다

git commit --amend -m "Your message here"

또는 텍스트 편집기를 열려면

git commit --amend

의견이 많으면 텍스트 편집기를 사용하는 것이 좋습니다. 명령을 사용하여 원하는 텍스트 편집기를 설정할 수 있습니다

git config --global core.editor your_preffered_editor_here

어쨌든 커밋 메시지 변경이 끝나면 저장하고 종료하십시오.

그런 다음 실행

git push --force

그리고 당신은 끝났습니다


0

비트 버킷 파이프 라인을 사용하는 경우 동일한 문제에 대한 추가 정보

메시지 편집

git commit --amend

서버로 밀다

git push --force <repository> <branch>

그런 다음 파이프 라인의 푸시 명령에 --force를 추가하십시오.

git ftp push --force

그러면 이전 커밋이 삭제되고 현재 커밋이 푸시됩니다.

첫 번째 푸시 후 --force 제거

나는 비트 버킷 파이프 라인에서 그것을 시도하고 잘 작동

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