git : 메시지를 입력하는 동안 중단 커밋


131

나는 최선을 다하고 있습니다. 커밋 메시지를 vim에 입력했습니다. 나는 이제 무언가를 바꿔야한다는 것을 기억했다. 나는 내가 원하는 것을 성취 할 수있는 다른 옵션이 있다는 것을 알고 있지만 커밋을 중단 할 수있는 방법이 있는지 알고 싶지만 지금까지 입력 한 커밋 메시지를 저장하고 싶습니다.

답변:


85

예. 커밋 메시지를 다른 파일 ( :w /some/other/path.txt)에 씁니다 . 그런 다음 저장하지 않고 편집기를 종료하십시오 ( :q!). 이전에 파일을 원래 경로에 저장 한 경우 모든 것을 삭제하고 빈 파일을 먼저 작성하십시오 (빈 커밋 메시지는 커밋을 중단합니다).

이제 "실제로"커밋 할 준비가되면 대체 경로에 저장 한 메시지 파일을 사용하십시오.

또는 커밋 메시지를 vim의 버퍼 중 하나에 복사하십시오.

그것의 가치는 것을주의 정말로에서이 작업을 수행 할 필요가 없습니다은 : commit --amend당신이 만들어졌다 후 쉬운 해결책은 당신이있어 무엇을 확약하고 밀어 전에 문제를 해결 생산하는 것입니다 그래서이 커밋 변경 할 수 있습니다. 커밋이 손상된 상태에서 커밋을 완료하고 reset HEAD~(작업 복사본이 커밋 이전에 있었던 상태로 재설정) 작업 복사본을 수정 한 다음 commit -a -c HEAD@{1}이전 커밋 메시지를 사용할 수 있습니다.


7
참고 : ": q!"를 사용하여 vim 종료 자동으로 채워진 병합 충돌 메시지가 있으면 커밋을 중단하지 않습니다. 대신 커밋이 계속되고 메시지에 충돌이 발생한 파일이 표시되지 않습니다.
stephenbez

write the empty file (an empty commit message will abort the commit)부분은 매력처럼 작동했습니다, 감사합니다!
Саша Давиденко

182

에디터가 에러 코드로 빠져 나갈 수 있다면-Git은 커밋을 중단합니다. VIM을 사용할 때 다음을 입력하십시오.

:cq

0이 아닌 오류 코드로 종료하고 커밋을 중단합니다.


5
commit --amend기존 커밋 메시지 및를 삭제해야하는 것처럼 a를 중단하는 좋은 방법입니다 :wq.
Alex Jasmin

2
좋은 트릭! 그러나 커밋 메시지를 저장하는 방법은 삭제하지 않고 저장하는 방법이었습니다.
Elijah Lynn

그래서 svn은 어떻게 이것을 관리합니까? 종료 코드 외에 무엇을 봅니까?
Chaim Geretz

1
당신이 부수 커밋 일명 대화 형 REBASE 일을 할 때 좋은
hellatan

리베이스 git commit --amend대신에 내가 할 때 내 생명을 구했습니다 git rebase --continue.
Weishi Zeng

68

커밋 메시지를 작성하기 위해 vim을 연 경우 #으로 시작하지 않는 행을 삭제하면 git이 커밋을 중단합니다.

Aborting commit due to empty commit message.

11
이것은 git commit --amend를 중단하려고 할 때 특히 유용합니다.
edsko

1
문제는 커밋을 중단하고 커밋 메시지를 저장하는 방법이었습니다. #으로 시작하지 않는 행을 삭제하면 커밋 메시지가 효과적으로 삭제되고 커밋 메시지가 저장되지 않습니다. 이것이 얼마나 많은 투표를했는지 확실하지 않습니다.
Elijah Lynn

2
ggdG메시지의 모든 내용을 잘라 내고 다음에 실행할 때 이전에 잘라낸 텍스트 vim만 사용할 수 있습니다 P.
oromoiluig

nano, ctrl + k를 사용하여 작동합니다. 모든 줄을 저장하고 종료하면 중단됩니다
Juh_

9

커밋을 중단 할 수 있지만 나중에 다른 방법으로 커밋 을 수정 하는 방법이 있습니다. 현재 작업을 커밋 한 다음 원하는대로 추가로 변경 git add한 다음 실행하십시오 git commit --amend. 커밋 메시지 편집기로 다시 돌아가고 저장하면 추가 변경 사항과 새 커밋 메시지가 포함되도록 커밋이 수정됩니다.


7

네 가능합니다. 커밋하려면 편집기가 커밋 메시지를 파일에 쓰고 .git/COMMIT_EDITMSG0 상태 코드로 종료해야합니다.

따라서 VI / VIM을 사용하는 경우 다음을 수행 할 수 있습니다.

  1. 커밋 메시지를 작성하십시오.
  2. 커밋 메시지를 저장하십시오 :w(기본적으로 현재 내용을에 저장합니다 .git/COMMIT_EDITMSG)
  3. 오류로 편집기를 종료하십시오. :cq
  4. 스테이징 영역에 파일을 추가 / 제거 할 수도 있습니다.
  5. 기존 커밋 메시지 편집을 계속하십시오. git commit -eF .git/COMMIT_MESSAGE

-F /path/to/file/ 파일에서 / 경로 주어진 내용 /를 사용하여 편집기를 채 웁니다. 그러나 기본적으로 편집을-e 위해 플래그를 추가로 제공하지 않으면 커밋을 즉시 수행합니다 .


이것은 작동하지만 1) CWD가 .git 폴더가있는 곳이라고 가정합니다 .2) git worktrees를 사용하고 git worktrees를 사용하는 경우 .git은 실제로 실제 .git 폴더의 위치를 나타내는 파일 입니다.
Alexander Bird

@AlexanderBird 이것은 사실이 아닙니다 ... 5 단계에서 이전 커밋 메시지를 선택하려면 다음과 같이 상대 경로를 지정해야합니다 (예 : /foo/bar/프로젝트 루트와 관련 하여 디렉토리에 있음).git commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek

@AlexanderBird cool, 아직 자식의 여러 작업 트리 기능으로 눈치 채지 못했습니다. 힌트를위한 Thx! 이것의 유일한 단점은 실제 코드에 집중할 수 없도록 머리에 일반적인 개요를 유지해야한다는 것입니다. 그리고 "내가
멈춘

1
다음 대신 @AlexanderBird :w:sav committmpgit commit -eF committmp
Hashbrown

0

나는 보통 IntelliJ제공된 터미널을 사용하여 커밋 합니다. 불행히도 내 커밋은 수동입니다.

git commit -m'my message' // etc

안전하다고 생각하는 유일한 것은 터미널 창을 닫는 것입니다 ! 저장하려면 텍스트를 강조 표시 한 다음 복사 한 다음 터미널 창을 닫으십시오.


-2

@ bdonlan 답변은이 질문에 좋지만 더 나은 솔루션을 원할 수있는 상황을 지적 할 것입니다.

마지막 커밋에 변경 사항을 추가하고 싶다고 가정 해보십시오. 따라서 @bdolan이 제안한대로하십시오.

git add files
git commit --amend

새 메시지를 작성하는 동안 해당 커밋에 해당 파일을 추가하는 것을 후회한다고 상상해보십시오. 문제는 이미 저장된 커밋 메시지 가 붙어 편집기를 종료하면 (저장 여부에 관계없이) 마지막 변경 사항에 변경 사항이 추가됩니다. 이러한 동작 이전의 시점으로 되돌리려 면 마지막 커밋분할 해야합니다. 피하고 ​​싶을 것입니다.

트릭은 편집기로 줄을 시작 #하거나 줄이없는 동안 편집기를 저장하고 종료하는 것입니다. 종료하면 다음 메시지가 표시됩니다.

Aborting commit due to empty commit message.

그리고 당신은 마지막 커밋을 전혀 바꾸지 않았습니다.


당신이 말하는 것이 문제라는 것을 이해한다면, 당신은 틀립니다. 여기에 설명 된대로 : git commit; vim ....; git commit --amend; git reset HEAD@{1}. 즉, 수정 사항을 "실행 취소"하려면 이전 커밋을 분할 하지 않아도됩니다. 수정하기 전에 HEAD였던 확약 오브젝트는로 저장됩니다 HEAD@{1}. 또한 zetta는 이미 비 주석 줄을 모두 삭제하도록 제안했습니다.
Alexander Bird
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.