로컬 자식 커밋을 취소하는 방법


744

내 문제는 파일을 변경 한 것입니다. 예 : README, ' 이것은 내 테스트 줄에 새 줄을 추가 하고 파일을 저장 한 다음 다음 명령을 발행했습니다.

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

코드를 github에 푸시하지 않았습니다.이 커밋을 취소하고 싶습니다.

이를 위해 나는

   git reset --hard HEAD~1

그러나 README 파일에서 새로 추가 된 ' this for my testing line '을 잃어 버렸습니다 . 이런 일은 일어나지 않아야합니다. 콘텐츠가 있어야합니다. 콘텐츠를 유지하고 로컬 커밋을 취소하는 방법이 있습니까?


3
확실히 요구하지 않는 것처럼 들리면 git revert되 돌린 커밋의 역 차이로 새로운 커밋을 만듭니다. 재설정은 단순히 현재 분기를 다른 커밋 (이 경우 커밋 전 "잊어 버릴"커밋)으로 지정합니다.
Cascabel

1
NB : git-commit메시지를 비워두면 중단 될 수 있다는 점을 언급 할 가치가 있습니다. 실제로 커밋을 마치지 않으면 도움이 될 수 있습니다.
GKFX

답변:


1420

플래그 git reset없이 사용 하십시오 --hard.

git reset HEAD~1

추신 : 유닉스 기반 시스템에서는 다음 HEAD^과 같은 것을 사용할 수 있습니다 HEAD~1. 회선 연속 신호를 보내 HEAD^므로 Windows 에서는 작동하지 않습니다 ^. 따라서 명령 프롬프트가 표시됩니다 More?.


13
그건 그렇고, 이것은 --mixed 매뉴얼에서 호출 됩니다 .
Josh Lee

10
최신 버전의 Git도 @^속 기어로 사용할 수 HEAD^있습니다.
Koraktor

이 작업이 무엇인지 모르지만 변경 목록에 많은 파일이 나타났습니다. 만지지 않은 파일
FRR

@feresr 마지막 ​​커밋 또는 작업 트리에서 해당 파일을 실제로 만지지 않은 경우 작업 트리의 다른 불일치로 인해 발생합니다. 예를 들어 Windows에 있고 파일 끝이 일치하지 않습니다.
Koraktor

1
한 번에 모든 커밋을 재설정 할 수 있습니까?
Webwoman

185

플래그 --soft대신 사용하십시오 --hard.

git reset --soft HEAD^

18
두 플래그의 차이점을 설명 할 수 있습니까?
John Giotta

1
패키지 관리자 콘솔을 열고이 "git reset --soft HEAD ^"를 실행하면 원하는 작업과 필요한 작업을 수행합니다.
David Cornelson

54
@JohnGiotta- git reset --soft HEAD^마지막 로컬 (푸시되지 않은) 커밋을 제거하지만 변경 한 내용유지 합니다
52 초

@fider 구세주! 허용 된 답변이 여전히 작동하는지 확실하지 않지만 OP가 필요한 정확한 답변이어야합니다.
Babu

git reset --soft HEAD~창에서
Jack0fshad0ws

34

커밋 중간에있는 경우 (즉, 이미 편집기에서) 첫 번째 위의 모든 행을 삭제하여 커밋을 취소 할 수 있습니다 #. 커밋이 중단됩니다.

커밋 메시지가 비어 있도록 모든 줄을 삭제 한 다음 파일을 저장하십시오.

이렇게 보일 것입니다.

그런 다음 메시지가 나타납니다 Aborting commit due to empty commit message..

편집 :

모든 줄을 삭제할 수도 있으며 결과는 정확히 동일합니다.

vim에서 모든 줄을 삭제하려면 (기본 편집기 인 경우) 편집기 gg에 들어가면 첫 번째 줄로 이동하여 dG모든 줄을 삭제하십시오. 마지막으로 파일을 작성하고 종료하면 wq커밋이 중단됩니다.


3
이것이 바로 내가 찾던 것입니다! 이 답변에는 더 많은
투표

참고로, 이것은rebase -i mybranchname
inostia

18

커밋 메시지를 삭제하기 전에 로컬 변경 내용을 유지할지 여부를 결정해야합니다.

사용 git log전류가 커밋 메시지를 보여주고, 다음이 발견 commit_id 하기 전에 를 사용해서 삭제를 커밋이 아닌 삭제하려는 커밋합니다.

로컬로 변경된 파일을 유지하고 커밋 메시지를 삭제하려면 다음을 수행하십시오.

git reset --soft commit_id

로컬로 변경된 모든 파일과 커밋 메시지를 삭제하려는 경우 :

git reset --hard commit_id

소프트하드 의 차이


1
나는 그 반대라고 생각합니다.
Ruff9

9

매개 변수 중 하나를 사용하여 git reset을 수행 할 때 Git에게 인덱스 (다음 커밋이 될 파일 세트) 및 작업 디렉토리로 수행 할 작업을 알려줄 수 있습니다.

--soft: 커밋 만 재설정되고 Index 및 작업 디렉토리는 변경되지 않습니다.

--mixed: HEAD와 일치하도록 인덱스가 재설정되지만 작업 디렉토리는 건드리지 않습니다. 모든 변경 사항은 작업 디렉토리에 유지되며 수정 된 것으로 나타납니다.

--hard: HEAD와 일치하도록 모든 (커밋, 색인, 작업 디렉토리)을 재설정합니다.

귀하의 경우 git reset --soft색인 및 작업 디렉토리에 수정 된 변경 사항을 유지 하는 데 사용 합니다. 확인하시기 바랍니다 이것을 좀 더 자세한 설명.


1

아래 명령을 사용하십시오.

$ git reset HEAD~1

이 후에는 아래 응답과 같이 되돌아 간 파일을 볼 수도 있습니다.

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