2012-02-05 3 views
83

나는 커밋 중간에 있습니다. vim에서 커밋 메시지를 입력했습니다. 나는 지금 내가 뭔가를 바꿀 필요가 있음을 기억했다. 내가 원하는 것을 달성하기위한 다른 옵션이 있다는 것을 알고 있지만 커밋을 중단하는 방법이 있는지 알기를 원하지만 지금까지 입력 한 커밋 메시지는 저장하십시오.git : 타이핑 중 메시지가 취소됩니다.

답변

67

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

, 당신이 "진짜야"커밋 할 준비가, 당신은 대체 경로에 저장된 메시지 파일을 사용합니다.

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

그것은 당신이 정말 모든에서이 작업을 수행 할 필요가 없습니다 주목할 필요가있다 : 당신이 만들어졌다 후 쉬운 솔루션이 해결 다음있어 무엇을 확약하고 생산하는 것입니다 그래서이 커밋 변경 할 수 있습니다 commit --amend 그것을 밀기 전에. 깨진 상태 인 커밋을 완료 할 수도 있습니다. reset HEAD~ (커밋 전에 작업 복사본이 있던 상태로 리셋합니다), 작업 복사본을 수정 한 다음 commit -a -c [email protected]{1}은 이전 커밋 메시지를 사용합니다.

+1

참고 : ": q!"를 사용하여 vim을 종료하십시오. autopopulated 병합 충돌 메시지가있는 경우 커밋을 중단하지 않습니다. 대신 커밋이 계속되고 메시지에 충돌이 발생한 파일이 나열되지 않습니다. – stephenbez

+1

작동하지 않았습니다 ... :(여전히 커밋을 완료했습니다.) – phyatt

9

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

54

당신이 정력이 그냥 중단됩니다 #와 자식로 시작하지 않는 행을 삭제 커밋 메시지를 작성하는 열 경우 편집기가 오류 코드로 종료 할 수 있습니다 경우

Aborting commit due to empty commit message. 
+9

이것은 git commit - amend를 중단하고 싶을 때 특히 유용합니다. – edsko

+0

이것은 나노 편집기 –

+1

에서 작동하지 않습니다. commit하지만 커밋 메시지를 저장한다 # 효과적으로 시작하지 않는 라인을 삭제하면 커밋 메시지를 지우지 만 커밋 메시지를 저장하지는 않는다. 이것은 매우 많은 upvotes가있는 지 잘 모르겠다 . –

111

를 저지 - - 힘내는 커밋을 중단합니다. VIM을 사용할 때 0이 아닌 오류 코드로 종료하고 커밋을 중단하려면

:cq 

을 입력하십시오.

+0

이것은 커밋 메시지를 중단시키기위한 좋은 트릭이다. 만약 당신이 기존의 커밋 메시지와': wq'를 삭제해야만했기 때문에 "amend"라고 말하면됩니다. –

+1

좋은 속임수! 그러나 커밋 메시지를 저장하는 방법은 삭제하지 않는 것이 좋습니다 –

+0

그래서 svn이 어떻게 처리합니까? 출구 코드 외에 봐요? –

-1

@bdonlan 대답은 바로이 질문에 대한 좋은하지만 난 당신이 더 나은 솔루션을 할 수 있습니다 상황을 지적합니다.

마지막 커밋에 변경 사항을 추가한다고 가정 해보십시오. @bdolan 제안 그래서 당신이 할 :

git add files 
git commit --amend 

, 당신은 그 커밋에 해당 파일을 추가 후회 새로운 메시지를 작성하는 동안 것을 상상해보십시오. 문제는이 이미 커밋에게 마지막에 변경 사항을 추가합니다 메시지를 커밋 (또는 저장하지 않고) 편집기를 종료 저장된 함께 붙어있다. 이 작업을 수행하기 전의 지점으로 되돌아 가서 split the last commit이 필요합니다. 피하고 ​​싶을 것입니다.

트릭은 저장하고 전혀에만 #로 시작하는 라인 또는 전혀 라인을 가지고있는 동안 편집기를 종료하는 것입니다.퇴장하면 다음 메시지로 인사드립니다 :

Aborting commit due to empty commit message. 

그리고 마지막 커밋을 전혀 변경하지 않았습니다.

+0

내가 이해한다면 다시 말하면 문제가된다. 그렇다면 틀린 말이다. 여기에 설명 된 것처럼 :'git commit; vim ....; git commit --amend; git reset HEAD @ {1}'. 즉, 개정안을 "취소"하려면 이전 커밋을 분할하지 않아도됩니다. 개정 전에 HEAD였던 커밋 객체는'HEAD @ {1}'로 저장됩니다. 또한 zetta는 이미 비 주석 행을 모두 삭제할 것을 제안했습니다. –

4

예 가능합니다. 커밋을하려면 편집자가 파일 .git/COMMIT_EDITMSG에 커밋 메시지를 작성하고 상태 코드 0으로 종료해야합니다. 당신이 VI/VIM을 사용하는 경우

그래서, 당신은 ... 다음을 수행

  1. 을 커밋 메시지를 작성 할 수 있습니다.
  2. 당신이해야 할 일을 ... :w와 커밋 메시지를 오류 :cq
  3. 편집기를 종료 (기본적으로이 .git/COMMIT_EDITMSG 현재 내용을 저장합니다) 저장 ... 심지어 추가/제거 파일을 준비 영역으로 가져옵니다.
  4. 는// 파일에서/경로 주어진 내용으로 편집기를 채 웁니다 git commit -eF .git/COMMIT_MESSAGE

-F /path/to/file으로 기존의 커밋 메시지 편집을 계속합니다. 그러나 을 추가로 추가하지 않는 한 기본적으로이 명령은 즉시 커밋을 수행합니다.

+0

이 작동하지만 덜 바람직합니다. 1) CWD가 .git 폴더 인 것으로 가정하기 때문에 2) [git worktrees] (https://git-scm.com/docs/git-worktree)를 사용하고, git worktrees를 사용하면 실제로 .git은 실제 .git 폴더가있는 곳의 _file_입니다. –

+0

@AlexanderBird 이것이 사실이 아닙니다 ... 5 단계에서 이전 커밋 메시지를 가져 오려면 상대 경로를 지정해야합니다. (예를 들어'/ foo/bar /'디렉토리에 있다고 가정하십시오. , 프로젝트 루트로부터의 상대 경로)'git commit -eF ../../. git/COMMIT_MESSAGE'와 비슷합니다. –

+0

@AlexanderBird는 멋지지만, git에 여러개의 작업 트리가 있다는 것을 눈치 채지 못했습니다. 힌트를위한 Thx! 나는 이것에 대한 유일한 단점은 당신이 실제적인 코드에 집중할 수 없도록 머리 속에 전반적인 개요를 유지해야한다는 것이다. 그리고 그냥 "어디에서 그만 뒀는지"에 대한 커밋 메시지를 가져 오는 것이 조금 무거울뿐입니다. :) –

관련 문제