푸시되지 않은 기존 커밋 메시지를 수정하는 방법은 무엇입니까?


7664

커밋 메시지에 잘못된 것을 썼습니다.

메시지를 어떻게 변경합니까? 커밋이 아직 푸시되지 않았습니다.


868
git을 처음 접하는 사람들에게는 아직 푸시하지 않은 Laurie의 요점이 중요합니다. rebasing처럼, 이것은 역사를 바꾸고 있습니다. 누군가가 당신의 리포지토리에서 원본과 재기록 된 기록 사이에서 복제 / 당겼다면, 재 작성 후에는 그 지점을 위해 끌어 올 수 없습니다.
Pat Notz

답변:


16126

가장 최근의 커밋 메시지 수정

git commit --amend

편집기를 열어 가장 최근의 커밋 메시지를 변경할 수 있습니다. 또한 다음을 사용하여 커밋 메시지를 명령 줄에서 직접 설정할 수 있습니다.

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

그러나 여러 줄 커밋 메시지 나 작은 수정 사항을 입력하기가 더 번거로울 수 있습니다.

이 작업 을 수행하기 전에 작업 복사본 변경이 준비되어 있지 않은지 확인하십시오. 그렇지 않으면 변경 사항 도 커밋됩니다. ( Unstaged 변화는 최선을 다하고되지 않습니다.)

이미 원격 지사로 푸시 한 커밋 메시지 변경

커밋을 이미 원격 브랜치로 푸시 한 경우-위에서 설명한 커밋을 로컬로 수정 한 후 커밋 을 강제로 푸시해야합니다 .

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

경고 : 강제 푸시는 원격 분기를 로컬 분기의 상태로 덮어 씁니다 . 로컬 지점에없는 원격 지점에 커밋이 있으면 해당 커밋 손실됩니다.

경고 : 이미 다른 사람과 공유 한 커밋을 수정하는 데주의하십시오. 수정 커밋은 본질적으로 다른 SHA ID 를 갖도록 다시 작성 하므로 다른 사람들이 이전 커밋 사본을 다시 작성한 경우 문제가됩니다. 이전 커밋의 사본을 가진 사람은 작업을 새로 다시 작성된 커밋과 동기화해야 할 수 있습니다. 때로는 어려울 수 있으므로 공유 커밋 기록을 다시 쓰려고 할 때 다른 사람과 조정하거나 공유 커밋을 다시 쓰지 않도록하십시오. 전부.


대화식 리베이스 수행

또 다른 옵션은 대화식 리베이스를 사용하는 것입니다. 최신 메시지가 아닌 경우에도 업데이트하려는 메시지를 편집 할 수 있습니다.

Git 스쿼시를 수행하려면 다음 단계를 따르십시오.

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

커밋을 스쿼시 한 ​​후- e/r메시지 편집을 위해를 선택하십시오 .

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

대화식 리베이스에 대한 중요 사항

사용할 때 n 이상의 커밋 git rebase -i HEAD~n이있을 수 있습니다 . Git은 마지막 n 개의 커밋에서 모든 커밋을 "수집"하고, 해당 범위 사이에 병합이 있으면 모든 커밋도 볼 수 있으므로 결과는 n +입니다.

좋은 팁 :

하나 이상의 브랜치에서이 작업을 수행해야하고 컨텐츠를 수정할 때 충돌이 발생할 수있는 경우 git rerereGit이 이러한 충돌을 자동으로 해결하도록 설정하고 설정 하십시오.


선적 서류 비치


257
그러나 git commit --amend만큼 강력하지 않습니다 git rebase -i.
Jeffrey Jose

76
@jeffjose, 반드시 그럴 필요는 없습니다. 또한 git commit --amend(?) 마스터 커밋을 수정할 수 있습니다.
strager

116
이미 푸시 한 경우 다시 푸시합니다.git push -f origin branchname
hughes

177
git push -f다른 사람들이 동일한 저장소를 사용하는 경우 @hughes는 조금 위험 하지 않습니까?
Armand

91
커밋 메시지 전체를 다시 쓰지 않으려면로 이동하십시오 git commit --amend -c HEAD. 이전 커밋 메시지로 미리 채워진 편집기가 열리므로 변경할 수 있습니다.
Sam

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

7
git commit --amend -m "New message"를 수행했지만 Github로 푸시하면 "다시 푸시하기 전에 원격 변경 사항 병합"이 생성되었습니다. 끌어 오기 후 커밋 --amend 후 다시 누르면 새 메시지가 나타나지 않습니다. 대신 "github.com의"병합 지점 '마스터': [myrepo] "
Dave Everitt

8
@DaveEveritt 당신은 커밋을 수정하기 전에 업스트림을 밀었습니다.
Thorbjørn Ravn Andersen

12
@Kyralessa는 사실이 아닙니다. bash에서는 끝까지 따옴표를 닫지 않고 여러 줄 커밋 메시지를 쉽게 작성할 수 있습니다 (따옴표 내 각 줄 끝에서 리턴을 누르십시오).
호브

32
나는 2 년 전에 작성된 답변의 주요 아이디어처럼 보이는 답변을 얻지 못했으며 수락 된 답변은 너무 많은 표를 얻습니다. 이상한. (응답에는 문제가 없습니다)
happy coder

7
@AmalMurali, 음. 내 요점은 질문의 인기 나 답의 유용성에 관한 것이 아닙니다. 그러나이 특정 답변은 가장 오래된 답변이 아니며 허용되는 답변에 대한 추가 통찰력을 제공하지도 않습니다. 허용 된 답변의 섹션 사본 인 것으로 보입니다. 그게 내 요점이었다. 건배!
행복한 코더

2376

수정하려는 커밋이 최신이 아닌 경우 :

  1. git rebase --interactive $parent_of_flawed_commit

    결함이있는 커밋을 여러 개 수정하려면 가장 오래된 커밋의 부모를 전달하십시오.

  2. 당신이 준 커밋 이후 모든 커밋 목록이있는 에디터가 나타납니다.

    1. 변경 pick에 대한 reword(또는 망할 놈의 이전 버전에에 edit) 당신이 수정하려는 커밋 앞에있다.
    2. 저장하면 Git은 나열된 커밋을 재생합니다.

  3. reword 하려는 커밋마다 Git이 편집기로 다시 돌아갑니다. 편집 하려는 커밋마다 Git이 쉘에 드롭합니다. 껍질 안에 있다면 :

    1. 원하는 방식으로 커밋을 변경하십시오.
    2. git commit --amend
    3. git rebase --continue

이 순서의 대부분은 다양한 명령의 출력으로 설명됩니다. 그건 매우 쉬워요; 당신은 그것을 암기 할 필요가 없습니다 – 단지 git rebase --interactive얼마나 오래 전에 커밋을 바로 잡을 수 있다는 것을 기억 하십시오.


이미 푸시 한 커밋은 변경하지 않을 것입니다. 또는 당신이 할 수도 있지만, 그 경우에는 커밋을 풀고 그 위에 작업을 한 모든 사람들과 의사 소통을하기 위해주의를 기울여야합니다. 누군가가 리베이스 또는 재설정을 게시 된 브랜치로 푸시 한 후 어떻게 복구 / 재 동기화합니까?


39
첫 번째 커밋 (부모가없는)의 메시지를 변경할 수 있습니까?
13ren

27
이것은 다른 답변 중 하나에 언급되어 있지만 여기에 메모하겠습니다. git 1.6.6부터 로그 메시지를 편집하는 reword대신 사용할 수 있습니다 pick.
MitMaro

89
또한 . $parent_of_flawed_commit와 같습니다 $flawed_commit^.
Peeja

67
이미 상류로 밀었다면 절대이 작업을하지 마십시오.
Daniel Rinser

20
결함이있는 커밋 후에 병합이 발생한 경우 -p( --preserve-merges)를 사용하십시오 .
aveven

778

이전 커밋을 수정하려면 원하는 변경을 수행하고 해당 변경을 준비한 다음 실행하십시오.

git commit --amend

그러면 새 커밋 메시지를 나타내는 파일이 텍스트 편집기에 열립니다. 이전 커밋 메시지의 텍스트로 채워집니다. 커밋 메시지를 원하는대로 변경 한 다음 파일을 저장하고 편집기를 종료하여 완료하십시오.

이전 커밋을 수정하고 동일한 로그 메시지를 유지하려면 다음을 실행하십시오.

git commit --amend -C HEAD

이전 커밋을 완전히 제거하여 수정하려면 다음을 실행하십시오.

git reset --hard HEAD^

둘 이상의 커밋 메시지를 편집하려면 다음을 실행하십시오.

git rebase -i HEAD~commit_count

commit_count 를 편집하려는 커밋 수로 바꿉니다 .이 명령은 편집기를 시작합니다. 첫 번째 커밋 (변경하려는 커밋)을 "pick"대신 "edit"로 표시 한 다음 편집기를 저장하고 종료하십시오. 커밋하려는 변경을 수행 한 다음 실행

git commit --amend
git rebase --continue

참고 : 편집기에서 "원하는대로 변경"을 할 수도 있습니다. git commit --amend


18
git rebase -i HEAD~commit_count또한 선택한 많은 커밋의 커밋 메시지를 변경할 수 있습니다. 선택한 커밋을 "pick"대신 "reword"로 표시하십시오.
Joe

2
리베이스하지 않으려면 어떻게해야합니까? 오래된 메시지를 바꾸고 싶습니까?
SuperUberDuper

3
git reset --hard커밋되지 않은 변경 사항을 소멸시킵니다. 교체하십시오 --hard--soft.
eel ghEEz

1
합의 git reset --hard는 완전히 합법적 인 명령이지만 질문이 오해의 소지가 있습니다. 당신은 사용 --hard변경 내용을 저지른 경우에 당신이 당신이 오타를 만든 메시지를 저지하지 않을 경우, 버리고 싶어!
Soren Bjornstad

398

이미 언급했듯이 git commit --amend마지막 커밋을 덮어 쓰는 방법입니다. 참고 사항 : 파일을 덮어 쓰 려면 명령은 다음과 같습니다.

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

4
당신이 모든 것을 추가하지 않으려면, 당신은 먼저 할 수있는 git add file.ext단지 다음git commit --amend
MalcolmOcean

358

당신은 또한 git filter-branch그것을 사용할 수 있습니다 .

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

사소한 것처럼 쉽지는 git commit --amend않지만 잘못된 커밋 메시지 후에 이미 병합이있는 경우 특히 유용합니다.

이것은 커밋 과 결함 커밋 사이의 모든 커밋 을 다시 작성하려고 시도 HEAD하므로 msg-filter명령을 매우 현명하게 선택해야합니다. ;-)


4
정규식이 아무것도 찾지 못하면 커밋을 변경하지 않는 버전이 있습니까?
sjakubowski

3
AFAIK filter-branch --msg-filter는 모든 경우에 새로운 커밋을 생성합니다. 그러나 sed가 성공한 경우 msg-filter 내에서 검사하고 filter-branch 조작이 종료 될 때이 정보를 사용하여 트리를 참조 / 원본으로 재설정 할 수 있습니다.
Mark

4
@DavidHogue 이것은 필터 브랜치 방법을 사용할 때만 적용됩니다. 대화식 리베이스를 사용하는 경우 수정 된 커밋 뒤의 커밋 ID는 변경되지 않습니다.
Mark

6
@Mark 네, 그렇습니다. 커밋 ID는 이전 커밋에 의존합니다. 변경되지 않으면 git은 쓸모가 없습니다.
Miles Rout

2
필요 $flawed_commit^..HEAD하지 않습니다 $flawed_commit..HEAD. 매뉴얼 페이지에 명시된 바와 같이 :« 명령은 명령 행에 언급 된 긍정적 참조 만 다시 작성합니다 (예 : a..b를 전달하면 b 만 다시 작성 됨). »
Ángel

319

나는이 방법을 선호합니다 :

git commit --amend -c <commit ID>

그렇지 않으면 새로운 커밋 ID를 가진 새로운 커밋이 있습니다.


7
나에게 위의 명령을 사용하면 실제로 새로운 커밋 ID와 "merge branch"라는 기본 커밋 메시지로 추가 커밋이 생성됩니다.
Jan

46
수정 하면 항상 새 커밋 ID로 새 커밋이 만들어집니다. 커밋 ID는 커밋 메시지 및 제작 / 커밋 된 타임 스탬프를 포함하여 커밋 내용의 SHA 해시입니다. 이것은 해시 충돌을 방지하면서 동일한 ID를 가진 두 개의 커밋이 동일한 내용, 히스토리 등을 갖는 동일한 커밋임을 보장하는 Git의 기능입니다.
Emil Lundberg

7
Emil과 동의하십시오. 또한 문서를 읽으십시오-모든 "-c"는 git에게 새 커밋의 기본값 / 템플릿으로 사용할 커밋 메시지를 알려주는 것 같습니다. 이므로 지정할 필요가 없습니다.
Gal

2
-c몇 가지 작업을 수행합니다. 기본적으로 이전 메시지를 사용하지만 작성자 정보 (사람 및 시간)도 복사합니다. -C메시지 편집을 요청하지 않는다는 점을 제외하고는 동일한 작업을 수행합니다.
Joseph K. Strauss

1
@SantanuDey처럼, 그것은 나를 위해 작동하지 않았습니다. 나는fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Andrew Grimm

312

Git GUI 도구를 사용하는 경우 Amend last commit 버튼 있습니다. 해당 버튼을 클릭하면 마지막 커밋 파일과 메시지가 표시됩니다. 해당 메시지를 편집하면 새 커밋 메시지로 커밋 할 수 있습니다.

또는 콘솔 / 터미널에서이 명령을 사용하십시오.

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

4
이 답변은 말 그대로이 오래된 답변 과 동일합니다 . 다른 답변을 제공하기 전에 기존 답변을 확인 했습니까?
Dan Dascalescu 1

284

Git 리베이스 를 사용할 수 있습니다 . 예를 들어 bbc643cd를 커밋하도록 다시 수정하려면 다음을 실행하십시오.

$ git rebase bbc643cd^ --interactive

기본 편집기에서 커밋을 수정하려는 행에서 'pick'을 'edit'로 수정하십시오. 변경 한 다음

$ git add <filepattern>

이제 사용할 수 있습니다

$ git commit --amend

커밋을 수정 한 후

$ git rebase --continue

이전 헤드 커밋으로 돌아갑니다.


1
변경 사항이 적용되도록 git commit --amend하려면 사용할 수 git show있으며 새 메시지가 표시됩니다.
Steve Tauber

279
  1. 마지막 커밋 메시지 만 수정하려면 다음을 수행하십시오.

    git commit --amend
    

텍스트 편집기로 이동하여 마지막 커밋 메시지를 변경할 수 있습니다.

  1. 마지막 3 개의 커밋 메시지 또는 해당 시점까지의 커밋 메시지를 변경하려면 HEAD~3다음 git rebase -i명령을 제공하십시오.

    git rebase -i HEAD~3
    

6
이 이전의 대답은 이미 당신이 사용할 수 있다고 git commit --amend하고, 그것은 또한 당신이 사용할 수 있다고 git rebase -i HEAD~commit_count, 당신이 한 모든 플러그인이었다 3에 대한이 commit_count.

또한 공감. 사람들은 기존 답변읽는 것을 귀찮게하지 않습니다 .
Dan Dascalescu 1

261

여러 분기에서 이전 커밋 메시지를 변경해야하는 경우 (즉, 잘못된 메시지가있는 커밋이 여러 분기에 존재하는 경우) 다음을 사용할 수 있습니다.

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Git은에서 재 작성을 위해 임시 디렉토리를 생성하고 추가로 이전 참조를 백업 refs/original/합니다.

  • -f작업 실행을 강제합니다. 임시 디렉토리가 이미 있거나 아래에 이미 참조가 저장된 경우에 필요 refs/original합니다. 그렇지 않은 경우이 플래그를 삭제할 수 있습니다.

  • -- 필터 분기 옵션과 개정 옵션을 구분합니다.

  • --all모든 브랜치태그 를 다시 작성해야합니다.

이전 참조의 백업으로 인해 명령을 실행하기 전에 상태로 쉽게 돌아갈 수 있습니다.

마스터를 복구하고 지점에서 액세스하고 싶다고 가정 해보십시오 old_master.

git checkout -b old_master refs/original/refs/heads/master

3
이 답변은 방금 수행 한 커밋을 수정하는 데 관심이 있기 때문에 OP의 질문을 다루지 않습니다. 나는 정기적으로 사용하는 git commit --amend주석을 수정하거나 내가 깜빡 파일을 추가 할 수 git add있지만 지금까지 내가 한 전에 git push에드. 또한 git filter-branch버전 기록을 완전히 망쳐 놓고 싶지만 OP는 이것을 원하지 않으므로이 답변에는 큰 건강 경고가 필요합니다. 집에서 시도하지 마십시오.
kbro

226

사용하다

git commit --amend

그것을 자세히 이해하기 위해 훌륭한 게시물은 4. Git History를 다시 작성하는 것 입니다. 또한 사용하지 않을시기에 대해서도 설명 합니다git commit --amend .


2
이미 공개 저장소로 푸시 된 커밋 메시지를 수정하는 좋은 방법이 있습니까? 지금까지 나는 커밋 메시지 오타와 생각이 영원히 살아야한다는 결론에 도달했다.
stackunderflow 2016 년

2
한마디로 NOPE! 밀었던 것을 철회하는 좋은 방법은 없습니다. 모든 후퇴는 다소 크거나 작습니다. 비트를 추가하고 비트를 테스트하고 비트를 조정할 때 여러 커밋을 수행하여 개인 저장소의 브랜치에서 일하는 원칙을 채택해야합니다. 그런 다음 전체 브랜치를 단일 커밋으로 병합하고 전체 변경 사항을 설명하는 새 커밋 메시지를 작성하고 PROOFREAD하여 푸시합니다.
kbro

1
피처 브랜치에서 되돌아 갈 때 단일 커밋을 할 필요가 없다는 것을 분명히 지적하십시오. 많은 사람들이하는 일은 대상 브랜치를 리베이스하고 (사실을 깨끗하게 보이도록) 빨리 감기를 억제하는 옵션과 병합합니다. 당신이 밀어 올리기 전에주의의 요점에 동의하십시오.
ShawnFumo

1
git commit --amend당신이 당신을 작성하기 전에 대답은 이미 (여러 번) 부여했다. 왜 다시 게시 했습니까? "Git History Rewriting Git History"에 대한 링크를 추가하려면 기존 답변 중 하나를 편집하거나 주석을 남길 수 있습니다.
Dan Dascalescu 1

199

고치다

여기 몇 가지 옵션이 있습니다. 넌 할 수있어

git commit --amend

마지막 커밋 인 한

대화식 리베이스

그렇지 않으면 마지막 커밋이 아닌 경우 대화식 리베이스를 수행 할 수 있습니다.

git rebase -i [branched_from] [hash before commit]

그런 다음 대화식 리베이스 내에서 해당 커밋에 편집을 추가하기 만하면됩니다. 이 온다 때, 작업을 수행 git commit --amend하고,이 커밋 메시지를 수정합니다. 해당 커밋 지점 전에 롤백 git reflog하려면 해당 커밋을 사용 하고 삭제할 수도 있습니다 . 그런 다음 git commit다시 수행 하십시오.


191

마지막 커밋이라면 커밋을 수정 하십시오.

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

( -o( --only) 플래그를 사용하여 커밋 메시지 만 변경하십시오)


묻힌 커밋 인 경우 멋진 대화 형 rebase를 사용하십시오 .

git rebase -i @~9   # Show the last 9 commits in a text editor

1, 당신이 원하는 변화를 커밋 찾기 pickr( reword), 저장하고 파일을 닫습니다. 끝난!



미니어처 Vim 튜토리얼 (또는 8 번의 키 입력으로 리베이스하는 방법 3jcwrEscZZ) :

  • vimtutor당신은 시간이 있다면 실행
  • hjkl 이동 키에 해당
  • 모든 명령 앞에 "범위"를 붙일 수 있습니다 (예 : 3j3 줄 아래로 이동)
  • i 삽입 모드로 들어가기 — 입력 한 텍스트가 파일에 나타납니다
  • Esc또는 Ctrlc삽입 모드를 종료하고 "일반"모드로 돌아 가기
  • u 실행 취소
  • Ctrlr 다시하기
  • dd, dw, dl각각 한 줄, 단어 나 문자를 삭제
  • cc, cw, cl같은 라인, 단어 또는 문자를 각각 (변경ddi )
  • yy, yw, yl각각 ( "홱 당김을")은 줄, 단어, 또는 편지를 복사합니다
  • p또는 P현재 위치 이후 또는 현재 위치 앞에 붙여 넣기
  • :wEnter 파일을 저장 (쓰기)
  • :q!Enter 저장하지 않고 종료
  • :wqEnter또는 ZZ저장하고 종료

텍스트를 많이 편집하는 경우 Dvorak 키보드 레이아웃으로 전환 하고 터치 방식을 배우고 Vim을 배우십시오. 노력할만한 가치가 있습니까? 예.



ProTip ™ : 기록을 다시 작성하는 "위험한"명령을 실험하는 것을 두려워하지 마십시오 * — Git은 기본적으로 90 일 동안 커밋을 삭제하지 않습니다. reflog에서 찾을 수 있습니다.

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* 같은 옵션을 조심 --hard하고 --force있지만 - 그들은 데이터를 삭제할 수 있습니다. * 또한 공동 작업중인 지점의 기록을 다시 쓰지 마십시오.


3
vim 부분은 완전히 논외 적이며, 사용자가 비전 편집기를 사용하는 법을 배우는 데 시간을 허비하지 말고, 기본 git 편집기를 사용자 친화적 인 것으로 설정하는 방법과 같은 주제에 대해 더 많은 주제를 가르치지 않는 이유는 무엇입니까? nano? 우리는 "최고의"텍스트 편집기에 대한 화염 전쟁을 일으키는 하드 코어 코딩이 아니라 텍스트 파일에 필요한 사소한 수정에 대해 이야기하고 있습니다.
Dan Dascalescu 1

1
@ DanDascalescu : 나노를 사용하여 여러 rebase를 수행하는 것보다 위의 지침을 사용하여 Vim을 배우는 것이 더 빠르기 때문입니다. git이 rebasing을위한 자체 인터페이스가 아닌 텍스트 편집기를 여는 전체 이유는 Vim이 존재하기 때문입니다. Vim은 가볍고 대부분의 시스템에 기본적으로 설치되어 있고 쉽게 rebase를 수행하기에 충분히 배울 수 있습니다. 예를 들어 ddjjpZZcommit 2를 아래로 이동합니다. 기본적인 Vim 지식에 대해서는 아무것도 없습니다. 나노보다 Vim에 익숙해 지려면 10 분이 걸립니다.
Zaz

185

Git GUI를 사용하는 경우 푸시되지 않은 마지막 커밋을 수정할 수 있습니다.

Commit/Amend Last Commit

168

나는 Git GUI 를 최대한 많이 사용한다. 그러면 마지막 커밋을 수정할 수있는 옵션이 제공된다.

그 상자를 똑딱

또한 git rebase -i origin/master항상 마스터 위에서 수행 한 커밋을 제공하고 수정, 삭제, 재정렬 또는 스쿼시 옵션을 제공하는 멋진 만트라입니다. 해시를 먼저 잡을 필요가 없습니다.


4
예제에서 표시 한 화면으로 어떻게 이동합니까?
Marwan مروان

2
Windows Git Gui의 오른쪽 아래 부분입니다. '마지막 커밋 수정'토글을 선택하면 가장 최근의 커밋 정보로 채워집니다.
wbdarby

138

와우, 이렇게하는 많은 방법이 있습니다.

또 다른 방법은 마지막 커밋을 삭제하지만 변경 사항을 유지하여 작업을 잃지 않도록하는 것입니다. 그런 다음 수정 된 메시지로 다른 커밋을 수행 할 수 있습니다. 이것은 다음과 같습니다.

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

파일 추가 또는 변경을 잊어 버린 경우 항상이 작업을 수행합니다.

기억 지정하는 --soft대신에 --hard, 그렇지 않으면 당신은 완전히 커밋 잃게.


5
이것은 git commit --amend2 단계 프로세스라는 점을 제외하고 는 정확히 동일한 작업을 수행합니다.
Joseph K. Strauss

3
@ JosephK.Strauss 커밋을 수정하면 새로운 커밋과 날짜 정보가 별도로 커밋 작성자와 날짜 정보를 유지한다고 생각합니다. 이 방법이 확실하지 않습니다.
everton

4
@EvertonAgner 맞습니다. --amend작성자 정보를 유지하지만 질문은 메시지 변경 만 요청합니다.
Joseph K. Strauss

131

오래된 메시지 (예 : 최신 메시지가 아닌)를 편집하는 데 도움이되는 Windows / Mac GUI를 찾는 사람이라면 Sourcetree를 사용하는 것이 좋습니다 . 다음 단계는 다음과 같습니다.

소스 트리 인터랙티브 리베이스

아직 원격으로 푸시되지 않은 커밋의 경우 :

  1. 현재 변경 사항을 모두 커밋했거나 보관했는지 확인하십시오 (즉, "파일 상태"탭에 파일이 나열되지 않은 경우). 그렇지 않으면 작동하지 않습니다.
  2. "로그 / 이력"탭에서 편집하려는 커밋 아래 의 그래프에서 인접한 선이있는 항목을 마우스 오른쪽 단추로 클릭 하고 " <commit ref>의 하위 자손을 선택하십시오. 대화식 ..."을 선택하십시오.
  3. 변경하려는 커밋 메시지의 전체 행을 선택하십시오 ( "메시지"열 클릭). .
  4. "메시지 편집"버튼을 클릭하십시오.
  5. 나타나는 대화 상자에서 원하는대로 메시지를 편집 한 다음 OK .
  6. 변경할 다른 커밋 메시지가있는 경우 3-4 단계를 반복하십시오.
  7. 클릭 OK: Rebasing이 시작됩니다. 모든 것이 정상이면 출력이 "완료"로 종료됩니다. 참고 : 여러 커밋 메시지를 동시에 수정하려고 할 때 때때로 이것이 실패하는 것을 보았습니다 Unable to create 'project_path/.git/index.lock': File exists.. 문제가 정확히 무엇인지 또는 향후 버전의 Sourcetree에서 수정 될지 확실하지 않지만,이 문제가 발생하면 한 번에 하나씩 재조정하는 것이 좋습니다 (느리지 만 더 안정적인 것 같습니다).

... 또는 ... 이미 푸시 된 커밋의 경우 :

이 답변 의 단계를 따르십시오. 위와 비슷하지만 git push origin <branch> -f분기를 강제 푸시하려면 명령 줄 ( ) 에서 추가 명령을 실행해야합니다 . 모든 내용을 읽고 필요한주의를 기울이는 것이 좋습니다!


모든 대답에서 - (A는 편집 할 일 전에 커밋에 무료 프로그램 SourceTree를 사용하여 "의 Rebase 현재 어린이"를 적용)이 모든 자식 초보자 ^^^에 가장 적합한입니다
revelt

127

최신 커밋을 편집하려면 다음을 사용하십시오.

git commit --amend

또는

git commit --amend -m 'one line message'

그러나 여러 커밋을 한 번에 편집하려면 대신 rebasing을 사용해야합니다.

git rebase -i <hash of one commit before the wrong commit>

힘내 rebase 편집

위와 같은 파일 edit/e에서 다른 옵션 중 하나를 쓰거나 저장하고 종료하십시오.

지금 당신은 첫 번째 잘못된 커밋에있을 것입니다. 파일을 변경하면 자동으로 준비됩니다. 유형

git commit --amend

저장하고 종료하고 입력하십시오.

git rebase --continue

모든 선택이 끝날 때까지 다음 선택으로 이동합니다.

이러한 사항은 특정 커밋 후에 모든 SHA 해시를 변경합니다.


2
git rebase -i <잘못된 커밋 전에 한 커밋의 해시>가 저에게 효과적입니다. 감사.
Viraths

127

마지막 메시지 만 변경하려면 다음 과 같이 --only플래그 또는 바로 가기 -o를 사용해야합니다 commit --amend.

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

이렇게하면 실수로 준비된 내용으로 커밋을 강화하지 않아도됩니다. 물론 적절한 $EDITOR구성 을하는 것이 가장 좋습니다 . 그런 다음 -m옵션을 그대로두고 Git은 커밋 메시지를 이전 메시지로 미리 채 웁니다. 이런 방식으로 쉽게 편집 할 수 있습니다.


1
"상위"답변은 질문에 대답하지 않습니다. 그것은 단지 일반적인 소개를 제공합니다 git commit --amend. 질문은 매우 구체적이어서 더 길었다! -o플래그에 대한 결정적인 언급 은 아마도 나머지 정보에 묻혀있을 것입니다. 또한 이미 너무 많은 표를 얻은 답변을 편집하는 것이 불편합니다.
David Ongaro

2
사람들이 그것을 "올바른"답변으로 사용하고있는 실제 위험이 있기 때문에, 당신은 최고의 답변을 자유롭게 편집 할 수 있습니다. 단계적인 것들로 커밋을 수정하는 것은 쉽게 일어날 수 있습니다-그것은 나에게 일어났습니다. 그러나 여전히 수량은 정확성을 보장하지 않습니다. 답변 수나 투표 수는 없습니다.
David Ongaro

1
나는 최고 답변 이 "잘못된"이고 "질문에 대답하지 않았다"고 말하지 않았습니다. 그것은 확실히 작동하고 질문에 대답합니다. 개정하려고 할 때 단계적인 변경 사항이 없도록해야합니다. 그러나 나는 사람들에게 그것에 대해 경고해야한다는 당신의 요점을 봅니다. 시간이 있으면 나중에 편집하겠습니다.

1
공정하게 : git 1.3.0부터 --onlywith 옵션을 --amend사용할 수는 있지만 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ) 에서 수정 될 때까지 제대로 작동하지 않았습니다 . 따라서 2008 년에 올바른 답은 아마도 다음과 같았을 것입니다 git stash; git commit --amend; git stash pop.
David Ongaro

103

한 줄에 새로운 커밋 메시지로 마지막 잘못된 커밋 메시지를 업데이트하십시오.

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

또는 아래와 같이 Git 재설정을 시도하십시오.

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

재설정을 사용하여 커밋을 더 작은 커밋으로 분할

git reset 하나의 커밋을 여러 커밋으로 나누는 데 도움이 될 수 있습니다.

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

여기서 마지막 커밋을 두 개의 커밋으로 나누었습니다.


3
마지막 커밋 메시지를 편집하는 것만으로도 소프트 리셋을 사용하는 것은 오버 킬 입니다. 그냥 사용 git commit --amend, 정확하게는 말한다 방법처럼 상단이 대답을 투표 . 또한 이 이전 답변git reset --soft HEAD^ 의 소프트 재설정과 동일하게 작동합니다. 둘 다 첫 번째 부모 커밋으로 재설정되기 때문입니다.

3
git reset하나의 커밋 메시지를 여러 커밋 메시지로 나누는 아이디어를 제공하기 위해 솔루션 에 추가 하는 것을 귀찮게 합니다. , 나는 사용하기 시작했을 때 그 문제에 직면 해 있었기 때문에 git. 때때로 이것은 정말 도움이 될 수 있습니다. :)
przbadu

87

이 질문에는 많은 답변이 있지만 Vim을 사용하여 이전 커밋 메시지를 변경하는 방법에 대한 자세한 설명은 없습니다 . 나는 이것을 스스로하려고 노력하고 있었으므로 여기에 Vim에 경험이없는 사람들을 위해 이것을 어떻게했는지 자세히 기록 할 것입니다!

이미 서버에 푸시 한 5 개의 최신 커밋을 변경하고 싶었습니다. 다른 누군가가 이미 이것을 가져 갔다면 커밋 메시지를 변경하여 일을 망칠 수 있기 때문에 이것은 매우 위험합니다. 그러나, 당신이 당신의 자신의 작은 지점에서 작업하고 아무도 그것을 뽑아하지 않은 경우 다음과 같이 변경할 수 있습니다 :

5 개의 최신 커밋을 변경하고 터미널에 다음을 입력한다고 가정 해 보겠습니다.

git rebase -i HEAD~5

* 여기서 5는 변경하려는 커밋 메시지의 수입니다. 따라서 10 번째 커밋을 마지막 커밋으로 변경하려면 10을 입력하십시오.

이 명령을 사용하면 커밋 기록을 '편집'할 수있는 Vim으로 이동합니다. 마지막 5 개의 커밋은 다음과 같이 맨 위에 표시됩니다.

pick <commit hash> commit message

대신 pick당신은 작성해야합니다 reword. Vim에서 입력하여이 작업을 수행 할 수 있습니다 i. 그것은 당신이에 갈 수 삽입 모드. ( 아래에 INSERT 라는 단어가 삽입 모드에 있다는 것을 알 수 있습니다 .) 커밋을 변경하려면 reword대신에 입력하십시오.pick .

그런 다음이 화면을 저장하고 종료해야합니다. 먼저 Esc버튼 을 눌러 '명령 모드' 로 이동하면됩니다 (하단에 INSERT 라는 단어 가 사라지면 명령 모드에 있는지 확인할 수 있습니다 ). 그런 다음을 입력하여 명령을 입력 할 수 있습니다 :. 저장하고 종료하는 명령은 wq입니다. 입력 :wq하면 올바른 길을 가고 있습니다.

그런 다음 Vim은 변경하려는 모든 커밋 메시지를 처리하며 실제로 커밋 메시지를 변경할 수 있습니다. 삽입 모드, 커밋 메시지 변경, 명령 모드로 이동하여 저장하고 종료하면됩니다. 이 다섯 번하고 Vim을 벗어났습니다!

그런 다음 이미 잘못된 커밋을 푸시 한 경우 git push --force덮어 쓰기해야합니다. 이는 git push --force매우 위험한 일이므로, 잘못된 커밋을 푸시 한 후 서버에서 아무도 끌어 내지 마십시오!

이제 커밋 메시지를 변경했습니다!

(보시다시피, 나는 Vim에서 그 경험이 많지 않으므로 잘못된 'lingo'를 사용하여 무슨 일이 일어나고 있는지 설명하면 자유롭게 수정하십시오!)


4
<nitpick>스택 오버플로에는 "스레드"가 없습니다. 토론 포럼이 아니기 때문에 "질문", "답변"및 "게시물"만 있습니다. </nitpick>. 또한 모든 버전의 Vim이 같은 것은 아니며 삽입 모드에서 문자를 삭제할 수있는 것은 아닙니다 (어떻게 말이됩니까?). 당신이 원하는 경우 항상 빔의 문자를 삭제할 수, X그리고 x(작은 것을 할 것입니다 x, 커서의 앞에 삭제 문자를 X뒤에 삭제됩니다). 실수하면 u반복해서 사용 하여 실행 취소 할 수 있습니다 . 마지막으로 대화식 rebase 편집기의 r줄임말입니다 reword.

1
vim에서 단어를 바꾸는 것은 cw시작 부분에 입력됩니다 (질문은 vim에 관한 것이 아니지만 동의합니다).
Yaroslav Nikitenko

당신은 그 가증 을 사용할 필요가 없습니다 . git editornanoMidnight Commander의 mcedit 와 같이 깔끔하고 사용 하기 쉬운 것으로 설정할 수 있습니다 .
Dan Dascalescu 1

79

git-rebase-reword를 사용할 수 있습니다

커밋 (마지막이 아닌)을 다음과 같은 방식으로 편집하도록 설계되었습니다. commit --amend

$ git rebase-reword <commit-or-refname>

커밋을 수정하기 위해 "reword"커밋을 수정하기 위해 대화식 rebase 작업의 이름을 따서 명명되었습니다. 참조 이 게시물사람 -section 대화 형 모드 -를

예 :

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

6
외부 프로그램을 설치해야합니다. 내 생각에 내장 도구와 별칭을보다 효과적으로 사용하는 법을 배우는 것이 좋습니다. : 나는 입력합니다 g c; g rb -i @~9, 새로운 내가 원하는 위치에 커밋 변화를 이동 (커밋 REBASE) commitf( fixup), 및 저장합니다. 그것보다 빠른 것을 원한다면 별명을 지정할 수 있습니다 git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Zaz

79

나는 별칭을 추가 reci하고 recm위해 recommit (amend)그것을. 이제 git recm또는로 할 수 있습니다 git recm -m:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

57

나는 오타로 커밋을 밀었다는 것을 깨달았습니다. 취소하기 위해 다음을 수행했습니다.

git commit --amend -m "T-1000, advanced prototype"
git push --force

경고 : 변경 사항을 강제로 누르면 원격 지점을 로컬 지점으로 덮어 씁니다. 보관하고 싶은 것을 덮어 쓰지 않도록하십시오. 또한 다른 사람이 나와 지사를 공유하는 경우 수정 된 (재 작성된) 커밋을 강제로 적용 할 때주의해야합니다. 방금 다시 쓴 커밋의 사본이 있으면 자신의 기록을 다시 작성해야하기 때문입니다.


7
자식에서 아무것도 "덮어지지"않습니다. 이 경우 분기 포인터가 새 커밋으로 설정되고 참조가 남아 있지 않으면 이전 커밋이 오래되어 몇 주 후에 정리 될 수 있습니다. (다음 다른 사람까지 여전히 찾을 수 있고, reflog를 조사하여, 예를 참조합니다.)
데이비드 Ongaro

51

나는 다음을 사용하고 싶다 :

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

46

코드를 원격 브랜치 ( GitHub / Bitbucket )로 푸시하지 않은 경우 다음 과 같이 명령 행에서 커밋 메시지를 변경할 수 있습니다.

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

특정 지점에서 작업하는 경우 다음을 수행하십시오.

git commit --amend -m "BRANCH-NAME: new message"

이미 잘못된 메시지로 코드를 푸시 한 경우 메시지를 변경할 때주의해야합니다. 즉, 커밋 메시지를 변경하고 다시 푸시하면 문제가 발생합니다. 부드럽게하려면 다음 단계를 수행하십시오.

하기 전에 전체 답변을 읽으십시오.

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

중요 사항 : 강제 푸시를 직접 사용하면 다른 개발자가 동일한 브랜치에서 작업중인 코드 문제가 발생할 수 있습니다. 따라서 이러한 충돌을 피하려면 강제 푸시 하기 전에 지점에서 코드를 가져와야합니다 .

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

커밋 메시지가 이미 푸시 된 경우이를 변경하는 것이 가장 좋습니다.

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