Git에서 가장 최근의 로컬 커밋을 취소하려면 어떻게해야합니까?


21051

실수로 잘못된 파일을 Git 에 커밋했지만 아직 커밋을 서버로 푸시하지 않았습니다.

로컬 저장소에서 커밋을 실행 취소하려면 어떻게해야합니까?


137
새 답변을 게시하기 전에이 질문에 대한 답변이 이미 65 개 이상인 것을 고려하십시오. 귀하의 답변이 기존 답변 중 아닌 내용에 기여하는지 확인하십시오.
Sazzad Hissain Khan

89
자식이 필요한 것을 알고 있습니까? git undo그게 다야. 그런 다음 필사자들이 저지른 실수를 처리 한 평판은 사라집니다. git명령을 실행하기 전에 git 스택에서 현재 상태를 푸시하여 구현하십시오 . 성능에 영향을 미치므로 사용 여부에 대해 구성 플래그를 추가하는 것이 가장 좋습니다.
Yimin Rong

11
@YiminRong Git의 alias기능 으로 수행 할 수 있습니다 : git-scm.com/book/en/v2/Git-Basics-Git-Aliases
Edric

3
@RomainValeri-다른 곳에서도 작업을 취소 할 수 있습니다.
Yimin Rong

1
@YiminRong 구매하지 않습니다. 사람들은 여전히 ​​되 돌리지 말아야 할 일을 계속 울리고 실행을 취소했습니다. 그러나 더 중요한 git reflog것은 이미 설명 한 것에 가깝지만 사용자가 수행해야 할 일을 더 많이 제어 할 수 있다는 것입니다. 그러나 "undo"는 어느 곳에서나 동일하게 작동하지 않으며, 사람들은 이 기능을 달성하기 위해 많은 다른 것들을 기대할 것입니다. 마지막 커밋을 취소 하시겠습니까? 마지막 작업을 취소 하시겠습니까? 마지막 작업이 푸시 인 경우 얼마나 정확하게 (재설정 및 푸시) 또는 (복귀 및 푸시)를 취소합니까?
RomainValeri

답변:


22852

커밋 실행 취소 및 다시 실행

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. 이것이 취소하려는 것입니다.
  2. 이것은 당신의 작업 트리 (디스크에있는 파일의 상태)로 아무것도하지 않는다,하지만 상태 해제는 커밋에서 "변경 커밋을 위해 개최하지"로 나타나는 것이다 있도록 나뭇잎은 (당신이 unstaged 최선을 다하고 변경 git status당신이 필요합니다, 그래서 커밋하기 전에 다시 추가하십시오). 당신이 경우 에만추가 이전에 더 많은 변경 사항을 커밋하거나 메시지 커밋 변경 일을 , 당신은 사용할 수 git reset --soft HEAD~처럼하는 대신 git reset HEAD~ 있지만, 기존의 변화가 개최 떠난다.
  3. 작업 트리 파일을 수정하십시오.
  4. git add 새로운 커밋에 포함하려는 모든 것.
  5. 이전 커밋 메시지를 재사용하여 변경 사항을 커밋하십시오. reset오래된 머리를 .git/ORIG_HEAD; commitwith -c ORIG_HEAD는 이전 커밋의 로그 메시지를 포함하고 편집 할 수있는 편집기를 엽니 다. 메시지를 편집 할 필요가 없으면 -C옵션을 사용할 수 있습니다 .

그러나 인덱스에 새로운 변경 사항을 추가 한 경우를 사용 commit --amend하면 이전 커밋에 변경 사항 이 추가됩니다.

코드가 이미 서버에 푸시되어 있고 내역 (rebase)을 덮어 쓸 수있는 권한이있는 경우 :

git push origin master --force

이 답변을 볼 수도 있습니다.

HEAD를 이전 위치로 다시 옮기려면 어떻게해야합니까? (분리 된 머리) & 커밋 취소

위의 답변은 git reflog,되돌릴 SHA-1이 무엇인지 알아내는 데 사용됩니다. 일단 위에서 설명한대로 명령 시퀀스를 사용하기 위해 실행 취소하려는 지점을 찾았습니다.


1 주, 그러나, 당신은 당신이 당신에 실수를하면 커밋 이전으로 재설정 할 필요가 없다는 메시지를 저지 . 더 쉬운 옵션은 git reset(이후에 변경 한 내용을 스테이지 해제하는) git commit --amend마지막 커밋 메시지로 미리 채워진 기본 커밋 메시지 편집기를 여는 것입니다.

2 HEAD~ 는와 동일합니다 HEAD~1. 또한 git의 HEAD는 무엇입니까?를 참조하십시오 . . 여러 커밋을 커밋 해제하려는 경우에 유용합니다.


472
커밋이 잘못된 브랜치에 있었다면 git checkout theRightBranch모든 변경 단계를 수행 할 수 있습니다 . 내가 방금했던대로.
Frank Shearar

489
DOS에서 작업하는 경우 대신 git reset --soft HEAD^을 사용해야 git reset --soft HEAD~1합니다. ^는 DOS에서 연속 문자이므로 제대로 작동하지 않습니다. 또한 --soft기본 설정이므로 원하는대로 말하면 생략 할 수 있습니다 git reset HEAD~1.
Ryan Lundy

119
zsh을 사용자가 얻을 수 있습니다 : zsh: no matches found: HEAD^- 당신이 ^ 예를 탈출해야git reset --soft HEAD\^
tnajdek

7
우연히 말해야 git commit -a할 때 실수 로 발부 된 경우 대답은 정확하지 않습니다 -a. 어떤 경우에는 --soft( --mixed기본값이되는 결과를 ) 남기지 말고 커밋하려는 변경 사항을 복원 할 수 있습니다.
dmansfield

6
@IcyBrk git add는 명령입니다. git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ashraf.Shk786

10729

커밋 실행을 모르면 커밋을 취소하는 것이 약간 두려운 일입니다. 그러나 당신이 이해하면 실제로 놀랍습니다.

이것을 가지고 있다고 가정하십시오. 여기서 C는 HEAD이고 (F)는 파일의 상태입니다.

   (F)
A-B-C
    ↑
  master

당신은 할 C를 저지하고 다시 볼 로컬 수정 된 파일의 모든 변경 내용이 손실 결코 핵이라도 . 당신은 이것을합니다 :

git reset --hard HEAD~1

결과는 다음과 같습니다.

 (F)
A-B
  ↑
master

이제 B는 머리입니다. 를 사용했기 때문에 --hard파일은 커밋 B에서 해당 상태로 재설정됩니다.

아, 그러나 커밋 C가 재앙이 아니라 약간 떨어져 있다고 가정 해보십시오. 커밋취소하고 더 나은 커밋을 수행하기 전에 약간의 편집을 위해 변경 사항유지하려고합니다 . C를 HEAD로 사용하여 여기부터 다시 시작하십시오.

   (F)
A-B-C
    ↑
  master

당신은 이것을 제외하고 할 수 있습니다 --hard:

git reset HEAD~1

이 경우 결과는 다음과 같습니다.

   (F)
A-B-C
  ↑
master

두 경우 모두 HEAD는 최신 커밋에 대한 포인터 일뿐입니다. 를 수행하면 git reset HEAD~1Git에게 HEAD 포인터를 한 커밋 뒤로 이동하도록 지시합니다. 그러나 (사용하지 않는 한 --hard) 파일을 그대로 둡니다. 이제 git statusC에 체크인 한 변경 사항이 표시됩니다. 잃어버린 것은 없습니다!

가장 가벼운 터치를 위해 커밋을 취소 할 수는 있지만 파일과 인덱스는 그대로 두십시오 .

git reset --soft HEAD~1

이렇게하면 파일 만 남게 될뿐만 아니라 색인 만 남게됩니다. 당신이 할 때 git status, 당신은 같은 파일이 이전과 인덱스에있는 것을 볼 수 있습니다. 사실,이 명령 바로 다음에 할 수 git commit있으며 방금했던 것과 동일한 커밋을 다시 실행할 수 있습니다.

한 가지 더 : 첫 번째 예에서와 같이 커밋을 삭제 했다고 가정 하지만 결국 에는 커밋 이 필요하다는 것을 알 수 있습니까? 힘든 운 이지요?

아니요, 여전히 되돌릴 방법이 있습니다. 입력 git reflog하면 이동 한 (일부) 커밋 (즉, 해시) 목록이 표시 됩니다. 파괴 한 커밋을 찾아서 다음과 같이하십시오.

git checkout -b someNewBranchName shaYouDestroyed

이제 커밋을 부활 시켰습니다. 커밋은 실제로 90 일 동안 Git에서 파괴되지 않으므로 일반적으로 되돌아 가려고하지 않은 것을 구할 수 있습니다.


15
조심해! 잘못된 커밋이 (앞으로 빨리) 병합 된 경우에는 예상 한대로 수행되지 않을 수 있습니다! 헤드가 병합 커밋에있는 경우 (예 : 병합 된 분기 기능을 마스터로) git reset --hard~1마스터 분기가 기능 분기 내의 마지막 커밋을 가리 킵니다. 이 경우 상대 명령 대신 특정 커밋 ID를 사용해야합니다.
Chris Kerekes

90
결정적인 요점 누락 : 해당 커밋이 이전에 원격으로 '푸시'된 경우, '실행 취소'작업은 아무리 단순하더라도 로컬 커밋에이 커밋을 가진 나머지 사용자에게 엄청난 고통과 고통을 줄 수 있습니다. 그들이 미래에 'git pull'을 할 때. 따라서 커밋이 이미 '푸시'된 경우 대신 다음을 수행하십시오. git revert <bad-commit-sha1-id> git push origin :
FractalSpace

12
@FractalSpace, "큰 고통과 고통"을 일으키지 않습니다. 팀과 함께 Git을 사용할 때 몇 가지 힘을 썼습니다. 필요한 것은 의사 소통입니다.
Ryan Lundy

14
@Kyralessa 직장에서 팀 전체의 작업 흐름을 엉망으로 만든 다음 sh * t를 수정하는 방법을 알려주는 것을 '통신'이라고하지 않습니다. git history re-write는 repo의 일부를 버리는 파괴적인 작업입니다. 명확하고 안전한 대안을 사용할 수 있지만 사용을 주장하는 것은 무책임합니다.
FractalSpace

14
나는 커밋을하고 다시는 보지 않기를 원했습니다. 나는 당신의 예를 사용 --hard했지만, 내가 알지 못하는 것은 작업 트리의 모든 비 무대 변경 사항도 숨겨져 있다는 것입니다! 나중에 커밋의 일부로 이러한 파일을 커밋하려고했습니다. 이제 이러한 파일을 다시 가져올 수없는 것 같습니다. 게시 한 솔루션을 사용해 보았지만 reflog이전에 준비되지 않은 변경 사항은 복원되지 않았습니다.
Adam Burley

2129

커밋을 이미 공개했는지 (원격 저장소로 푸시했는지) 여부에 따라 마지막 커밋을 "실행 취소"하는 두 가지 방법이 있습니다.

로컬 커밋을 취소하는 방법

로컬로 커밋했지만 이제 해당 커밋을 제거하고 싶습니다.

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

마지막 커밋 이전의 상태로 모든 것을 복구하려면 다음 reset과 같이 커밋해야합니다 HEAD.

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

이제 git log마지막 커밋이 제거되었음을 보여줍니다.

공개 커밋을 취소하는 방법

커밋을 이미 공개 한 경우 이전 커밋 (현재 HEAD)에서 변경 한 내용을 "되돌릴"새 커밋을 만들려고합니다.

git revert HEAD

이제 변경 사항이 되돌리고 커밋 할 준비가되었습니다.

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

자세한 내용은 Git Basics-Undoing Things를 확인하십시오 .


101
나는이 대답이 가장 분명하다는 것을 알았습니다. git revert HEAD^이전이 아니며 이전의 이전입니다. 나는했다 : git revert HEAD그리고 다시 밀어 그리고 그것은 작동 :)
nacho4d

Git이 "더보기?"라고 물으면 이 명령을 시도 할 때이 답변에 대체 구문을 사용하십시오. stackoverflow.com/a/14204318/823470
tar

1745

파일을 추가 / 제거하여 원하는 방식으로 작업하십시오.

git rm classdir
git add sourcedir

그런 다음 커밋을 수정하십시오.

git commit --amend

이전의 잘못된 커밋은 새로운 인덱스 상태를 반영하도록 편집됩니다. 즉, 처음부터 실수를 한 적이없는 것처럼 보일 것입니다.

아직 푸시하지 않은 경우에만이 작업을 수행해야합니다. 당신이 밀었다면, 당신은 정상적으로 수정을 커밋해야합니다.


2
참고 : 이렇게하면 모든 파일이 제거되고 변경 내용이 손실됩니다.
egorlitvinenko

UPD : 그러나 reflog를 사용하여 복원했습니다. 그러나 초기 커밋에는 영수증이 작동하지 않았습니다.
egorlitvinenko

1
사용하다 git rm --cached파일 시스템에 파일을 유지하고 git 인덱스에서만 파일을 삭제하는 데 !
xuiqzy

1015
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

또는

git reset --hard HEAD~1

경고 : 위 명령은 .java커밋하려는 파일 (및 기타 파일) 의 수정 사항을 영구적으로 제거합니다 .

hard reset하는 HEAD-1당신의 잘못이 커밋하기 전에 커밋의 상태로 작업 복사본을 설정합니다.


19
git commit -a -m ""또는 git commit -am ""자연스럽게! :]
trejder 2016 년

숨김의 또 다른 '바로 가기'사용; 당신은 unstage 모든 (취소 자식 추가), 단지 원하는 경우 git stash, 다음git stash pop
seanriordan08

778

마지막 커밋을 변경하려면

색인에서 파일을 바꾸십시오.

git rm --cached *.class
git add *.java

그런 다음 개인 브랜치 인 경우 커밋을 수정 하십시오.

git commit --amend

또는 공유 브랜치 인 경우 새 커밋을 만듭니다.

git commit -m 'Replace .class files with .java files'


( 이전 커밋을 변경하려면 멋진 대화식 리베이스를 사용하십시오 .)


ProTip은 ™ : 추가 *.classA를 gitignore 이 다시 발생을 중지 할 수 있습니다.


커밋을 되돌리려면

마지막 커밋을 변경해야하는 경우 커밋을 수정하는 것이 이상적인 솔루션이지만보다 일반적인 솔루션은 reset입니다.

다음을 사용하여 Git을 커밋으로 재설정 할 수 있습니다.

git reset @~N

어디 N커밋의 수는 이전이다 HEAD, 그리고 @~이전으로 다시 커밋.

따라서 커밋을 수정하는 대신 다음을 사용할 수 있습니다.

git reset @~
git add *.java
git commit -m "Add .java files"

이 기능에 대한 이해를 git help reset높이려면에서 --soft --mixed및 특히 섹션을 확인하십시오 --hard.

Reflog

엉망인 경우 언제든지 reflog를 사용하여 삭제 된 커밋을 찾을 수 있습니다.

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



2
미래에 읽는 사람들에게는 git revert기본적으로 단일 통신을 '재설정'하는 별도의 명령입니다.
BKSpurgeon

680

사용하십시오 git revert <commit-id>.

커밋 ID를 얻으려면을 사용하십시오 git log.


15
체리가 커밋을 선택한다는 것은 무엇을 의미합니까? 제 경우에는 파일을 편집 할 때 잘못된 브랜치에있었습니다. 나는 그것이 잘못된 지점에 있다는 것을 깨달았다. "git reset --soft HEAD ~ 1"을 사용하면 커밋 직전에 다시 돌아 왔지만 올바른 분기를 체크 아웃하면 잘못된 분기에서 파일 변경 사항을 취소하고 대신 동일한 이름으로 변경합니다. 파일) 올바른 분기에?
astronomerdave

나는 단지 git revert commit-id매력처럼 일했다. 물론 변경 사항을 푸시해야합니다.
Casey Robinson

8
나는 그것이 git cherry-pick <<erroneous-commit-sha>>@astronomerdave 일 것이라고 믿습니다 . 거의 2 년 후반부터 파티까지.
Tom Howard

@Kris : Cherry-pick 대신 rebase를 사용하십시오. 그것은 고급 체리 따기이기 때문에
오이겐 Konkov

커밋을 이미 푸시 한 경우에만 되돌리기를 사용합니다. 그렇지 않으면 재설정이 더 나은 옵션입니다. 되돌리기는 새로운 커밋을 생성한다는 것을 잊지 마십시오. 일반적으로 이것은 목표가 아닙니다.
Hola Soy Edu Feliz Navidad

532

로컬 커밋을 완전히 취소하려는 경우 커밋에서 변경 한 내용이 무엇이든 상관없이 걱정하지 않으려면 다음 명령을 수행하십시오.

git reset --hard HEAD^1

(이 명령은 전체 커밋을 무시하고 변경 사항이 로컬 작업 트리에서 완전히 손실됩니다). 커밋을 취소하고 스테이징 영역에서 변경을 원하면 (after처럼 커밋하기 전에 git add) 다음 명령을 수행하십시오.

git reset --soft HEAD^1

이제 커밋 된 파일이 준비 영역으로 들어갑니다. 잘못된 내용을 편집해야하므로 파일을 업그레이드하려는 경우 다음 명령을 수행하십시오.

git reset HEAD

이제 스테이지 영역에서 스테이지되지 않은 영역으로 파일을 가져 오도록 커밋했습니다. 이제 파일을 편집 할 준비가되었으므로 변경 한 내용이 있으면 편집하고 추가하여 새로운 커밋을 만들 수 있습니다.


13
@SMR, 귀하의 예에서, 모두는 현재 HEAD만을 가리 킵니다. HEAD ^ = HEAD ^ 1. 뿐만 아니라 HEAD ^ 1 = HEAD ~ 1. HEAD ~ 2를 사용하면 ~ 기호와 ^ 기호 사이에 차이가 있습니다. ~ 2를 사용하면 "첫 번째 부모의 첫 번째 부모"또는 "조부모"를 의미합니다.
Madhan Ayyasamy


470

공유 저장소에서 최신 5 개의 커밋을 취소하고 싶었습니다. 롤백하려는 개정 ID를 찾았습니다. 그런 다음 다음을 입력했습니다.

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

25
공유 리포지토리에서 기록을 다시 작성하는 것은 일반적으로 매우 나쁜 생각입니다. 나는 당신이하고있는 일을 알고 있다고 가정합니다. 나는 미래 독자들도 그렇게하기를 바랍니다.
Brad Koch

예 롤백은 위험합니다. 푸시하기 전에 작업중인 사본이 원하는 상태인지 확인하십시오. 푸시하면 원하지 않는 커밋이 영구적으로 삭제됩니다.
neoneye

6
"현실에서와 마찬가지로, 역사를 다시 쓰려면 음모가 필요합니다. 모든 사람은 음모에 '적어도'있어야합니다. " 출처 : stackoverflow.com/a/2046748/334451
Mikko Rantalainen

440

git rebase -i제거 할 커밋을 선택할 수있는 멋진 목록이 표시되므로이 작업 에 사용하는 것을 선호합니다 . 다른 답변만큼 직접적이지는 않지만 느낌이 듭니다 .

나열하려는 커밋 수를 선택하고 다음과 같이 호출하십시오 (마지막 세 개를 참여시킵니다).

git rebase -i HEAD~3

샘플 목록

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

그런 다음 Git은 제거하는 모든 행에 대한 커밋을 제거합니다.


422

이전 로컬 커밋을 수정하는 방법

git-gui (또는 이와 유사한)를 사용하여을 수행하십시오 git commit --amend. GUI에서 커밋에서 개별 파일을 추가하거나 제거 할 수 있습니다. 커밋 메시지를 수정할 수도 있습니다.

이전 로컬 커밋을 취소하는 방법

지점을 이전 위치로 재설정하기 만하면됩니다 (예 : gitk또는git rebase ). 그런 다음 저장된 사본에서 변경 사항을 다시 적용하십시오. 로컬 리포지토리에서 가비지 수집 후 원하지 않는 커밋이 발생하지 않은 것처럼됩니다. 단일 명령으로 모든 것을 수행하려면git reset HEAD~1 .

경고 단어 : 부주의 한 사용git reset 작업 사본을 혼란스러운 상태로 만드는 좋은 방법입니다. Git 초보자는 가능하면 이것을 피하는 것이 좋습니다.

공개 커밋을 취소하는 방법

수행 역 벚꽃 선택을 ( 자식-되돌리기 변경 사항을 취소 할).

아직 다른 변경 사항을 지점으로 가져 오지 않은 경우 간단하게 수행 할 수 있습니다 ...

git revert --no-edit HEAD

그런 다음 업데이트 된 분기를 공유 저장소로 푸시하십시오.

커밋 기록은 두 커밋을 개별적으로 표시합니다 .


고급 : 공용 저장소 의 개인 브랜치 수정

위험 할 수 있습니다. 리핑 할 지점의 로컬 사본이 있는지 확인하십시오.

또한 참고 : 다른 사람이 지점에서 작업하고있는 경우이 작업을 수행하지 않으려 고합니다.

git push --delete (branch_name) ## remove public version of branch

지점을 로컬로 정리 한 다음 다시 시작하십시오 ...

git push origin (branch_name)

일반적인 경우 개인 브랜치 커밋 히스토리가 깨끗하지 않아도됩니다. 후속 커밋을 푸시하고 (위의 '공개 커밋을 취소하는 방법'참조) 나중에 스쿼시 병합 을 수행하여 히스토리를 숨기십시오.


8
gitk --all $(git reflog | cut -c1-7)&'--amend'커밋을 실행 취소하려는 경우 이전 개정을 찾는 데 도움이 될 수 있습니다.
nobar

4
공유 리포지토리로 푸시하기 전에 비밀 정보를 제거하려고하면 정보가 이전 커밋의 기록에 남아 있으므로 되돌리기를 수행해도 도움이되지 않습니다. 변경 사항이 다른 사람에게 표시되지 않도록하려면 사용해야합니다.git reset
Jherico

'private'/ 'public'이 더 정확하게 'local'/ 'remote'이 될 것이라고 생각합니다.
nobar

원격 저장소에서 개인 브랜치를 수정하는 것도 간단하게 수행 할 수 있습니다git push origin (branch_name) --force
nobar

335

영구적으로 실행 취소하고 일부 저장소를 복제 한 경우

커밋 ID는 다음과 같이 볼 수 있습니다.

git log 

그럼 당신은 할 수 있습니다-

git reset --hard <commit_id>

git push origin <branch_name> -f

"<commit_id>"를 사용하지 않고 "git reset --hard"를 사용하면 어떻게됩니까? 나는 일반적으로 아직 커밋하지 않은 최신 업데이트를 제거하고 최근에 만든 커밋으로 돌아 왔으며 항상 "git reset --hard"를 사용합니다.
Jaime Montoya

3
@JaimeMontoya 최신 변경 사항을 취소하려면 사용할 수 git reset --hard있지만 마지막 "n"커밋을 강제로 제거해야하는 경우 SHA
poorva

334

정크를 커밋했지만 푸시하지 않은 경우

git reset --soft HEAD~1

HEAD ~ 1 은 커밋 이전의 약칭입니다. 또는 재설정하려는 경우 해시 의 SHA-1 을 참조 할 수 있습니다 . --soft 옵션은 커밋을 삭제하지만 git status에 의해 변경된 모든 파일을 "Commit to be commit"상태로 둡니다.

헤드 이전 커밋 이후 작업 트리에서 추적 된 파일에 대한 변경 사항을 제거하려면 대신 " --hard "를 사용하십시오.

또는

이미 밀고 누군가가 내 경우 인 경우, git reset을 사용할 수 없습니다 . 그러나 git revert을 수행 할 수 있습니다 .

git revert HEAD

이것은 실수로 커밋 된 모든 것을 되 돌리는 새로운 커밋을 만듭니다.


나는 두 번째 경우에 있지만 "git revert HEAD"를 수행하면 "error : Commit [ID]는 병합되었지만 -m 옵션이 제공되지 않았습니다. 치명적인 : 되돌리기에 실패했습니다." 어떤 제안?
metaforge

2
아마도 대신 HEAD~1git log --stat또는에 의해 표시된 실제 해시를 사용할 수 있다고 언급 할 가치 가 있습니다 git reflog. 하나 이상의 커밋을 '실행 취소'해야 할 때 유용합니다.
ccpizza December

284

SourceTree (GitHub의에 대한 GUI), 당신은 커밋과 '역 커밋'할 마우스 오른쪽 단추로 클릭 할 수 있습니다. 변경 사항이 취소됩니다.

터미널에서 :

대신 다음을 사용할 수 있습니다.

git revert

또는:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.

263

단일 명령 :

git reset --soft 'HEAD^' 

마지막 로컬 커밋을 취소하는 것이 좋습니다!


11
Windows 명령 프롬프트에서 git reset --soft "HEAD ^"를 큰 따옴표로 작성해야했습니다.
Ena

253

아래 명령을 사용하여 재설정하십시오 git.

git reset --soft HEAD~1

설명 :git reset 기본적으로 reset돌아 가려는 커밋이 무엇인지 , --soft키 와 결합하면 돌아가지만 파일의 변경 사항은 유지하므로 무대로 돌아갑니다. 파일이 방금 추가 HEAD된 지점의 지점이며 결합하면 ~1(이 경우에도 사용 HEAD^) 원하는 한 커밋 만 다시 이동합니다 ...

실제 상황에서 발생할 수있는 모든 단계와 코드 커밋을 포함하여 자세한 내용은 아래 이미지의 단계를 작성하십시오.

Git의 마지막 커밋을 취소하는 방법은 무엇입니까?


239

마지막 Git 커밋을 취소하는 방법?

마지막 커밋 이전의 상태로 모든 것을 복원하려면 HEAD 전에 커밋으로 재설정해야합니다.

  1. 변경 한 내용을 유지하지 않으려면 다음을 수행하십시오.

    git reset --hard HEAD^
    
  2. 변경 사항을 유지하려면 다음을 수행하십시오.

    git reset --soft HEAD^
    

이제 자식 로그를 확인하십시오. 마지막 커밋이 제거되었음을 보여줍니다.


193

"작업 트리를 마지막 커밋으로 재설정"

git reset --hard HEAD^ 

"작업 트리에서 알 수없는 파일 정리"

git clean    

참조 -Git 빠른 참조

참고 : 이 명령은 이전 커밋을 삭제하므로주의해서 사용하십시오! git reset --hard더 안전합니다.


190

Reflog를 사용하여 올바른 상태를 찾으십시오.

git reflog

전에 거절하다 재설정하기 전에 재확인

올바른 reflog (필자의 경우 f3cb6e2)를 선택하고 다음을 입력하십시오.

git reset --hard f3cb6e2

그 후 repo HEAD가 재설정 후 HEADid 리셋 효과 LOG로 재설정됩니다.

마지막으로 reflog는 아래 그림과 같습니다.

이후에 reflog REFLOG FINAL


164

첫 실행 :

git reflog

커밋, 병합, 풀 등과 같이 리포지토리에서 수행 한 모든 가능한 작업을 보여줍니다.

그런 다음 수행하십시오.

git reset --hard ActionIdFromRefLog

155

마지막 커밋 실행 취소 :

git reset --soft HEAD^ 또는 git reset --soft HEAD~

마지막 커밋을 취소합니다.

여기에서 --soft스테이징으로 재설정됩니다.

HEAD~또는 HEAD^HEAD 전에 커밋으로 이동하는 수단.


새 커밋으로 마지막 커밋을 교체하십시오.

git commit --amend -m "message"

마지막 커밋을 새 커밋으로 바꿉니다.


153

또 다른 방법:

되돌리려는 지점을 체크 아웃 한 다음 로컬 작업 사본을 원격 서버에서 최신으로 유지하려는 커밋으로 다시 재설정하십시오 (이후에는 계속됩니다). 이를 위해 SourceTree에서 마우스 오른쪽 단추를 클릭하고 "BRANCHNAME을이 커밋으로 재설정"을 선택했습니다.

그런 다음 저장소의 로컬 디렉토리로 이동하여 다음 명령을 실행하십시오.

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

로컬 리포지토리에서 현재 커밋 이후 모든 커밋이 지워지지 만 해당 커밋 하나만 지워집니다.


144

입력 git log마지막 커밋 해시 코드를 찾은 다음 입력 :

git reset <the previous co>

139

제 경우에는 실수로 원하지 않는 파일을 커밋했습니다. 그래서 나는 다음을했고 효과가 있었다.

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

gitk 또는 git log --stat로 결과 확인


133

간단하게, 명령 행에서 이것을 실행하십시오 :

git reset --soft HEAD~ 

126

여러 가지 방법이 있습니다.

마지막 커밋 / 이전 커밋을 취소하는 Git 명령 :

경고 : 수행중인 작업을 모르는 경우 --hard를 사용하지 마십시오. --hard는 너무 위험 하며 파일을 삭제할 수 있습니다.

Git에서 커밋을 되 돌리는 기본 명령은 다음과 같습니다.

$ git reset --hard <COMMIT -ID>

또는

$ git reset --hard HEAD~<n>

COMMIT-ID : 커밋 ID

n : 되돌리려는 마지막 커밋 수

아래와 같이 커밋 ID를 얻을 수 있습니다.

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

여기서 d81d3f1be20eb8 은 커밋 ID입니다.

이제 몇 가지 경우를 보자.

마지막 커밋 'd81d3f1'을 되돌리려 고한다고 가정합니다. 두 가지 옵션이 있습니다.

$ git reset --hard d81d3f1

또는

$ git reset --hard HEAD~1

커밋 'be20eb8'을 되돌리고 싶다고 가정 해보십시오.

$ git reset --hard be20eb8

더 자세한 정보는 헤드를 지정된 상태로 재설정하기 위해 다른 명령을 참조하고 시도 할 수 있습니다.

$ git reset --help

5
git reset --hard HEAD~1입니다 너무 위험 ! 이것은 '마지막 커밋 취소'뿐만 아니라 repo를 이전 커밋으로 완전히 되돌립니다. 따라서 마지막 커밋에서 커밋 된 모든 변경 사항을 잃게됩니다!
Arnis Juraga 2012 년

당신은 바로 이것을 취소하기 위해 사용할 수 있습니다git push -f <remote> HEAD@{1}:<branch>
Benny

불행히도 --hard를 사용하면 파일이 삭제됩니다! 주석이 축소되어 있으므로 먼저 주석을 확인하지 않았습니다. 하고있는 일을 모른다면 --hard를 사용하지 마십시오!
익명

125

로컬 커밋

git reset --soft HEAD~1

또는 커밋이 정확히 무엇인지 기억하지 못하면

git rm --cached <file>

푸시 된 커밋

저장소 기록에서 파일을 제거하는 올바른 방법은을 사용하는 것 git filter-branch입니다. 그건,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

그러나이 명령을주의해서 사용하는 것이 좋습니다. git-filter-branch (1) 매뉴얼 페이지 에서 자세한 내용을 읽으십시오 .


125

두 가지 주요 시나리오가 있습니다

아직 커밋을 푸시하지 않았습니다.

문제가 커밋 한 추가 파일 (및 리포지토리에 원하지 않는 파일) 인 경우 git rm다음을 사용하여 커밋 할 수 있습니다.--amend

git rm <pathToFile>

로 전체 디렉토리를 제거 -r하거나 다른 Bash 명령 과 결합 할 수도 있습니다

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

파일을 제거한 후 --amend 옵션을 사용 하여 커밋 할 수 있습니다

git commit --amend -C HEAD # the -C option is to use the same commit message

추가 파일을 제거하여 최근 로컬 커밋을 다시 작성하므로 이러한 파일은 푸시로 전송되지 않으며 GC에 의해 로컬 .git 저장소에서도 제거됩니다.

이미 커밋을 푸시했습니다

다른 시나리오와 동일한 솔루션을 적용한 다음 옵션 을 git push사용하여 수행 할 -f수 있지만 변경 사항이있는 원격 히스토리를 겹쳐 쓰므로 (저장소를 망칠 수 있음) 권장하지 않습니다 .

대신, 커밋하지 않고 커밋을 수행해야합니다 --amend(-amend`에 대해 기억하십시오 : 해당 옵션은 마지막 커밋의 기록을 다시 작성합니다).


125

커미트되지 않은 모든 변경 사항을 영구적으로 삭제하여 이전 개정으로 재설정하려면 다음을 수행하십시오.

git reset --hard HEAD~1

23
어쩌면 그의 명령이 더 이상 묻지 않고 커밋 과 작업 디렉토리의 변경 사항을 버릴 것이라고 메모 / 경고 할 수 있습니다 .
cr7pt0gr4ph7

6
그러나 실수로이 작업을 수행하더라도 모든 것이 손실되는 것은 아닙니다. stackoverflow.com/questions/10099258/… , stackoverflow.com/questions/15479501/…stackoverflow.com/questions/7374069/undo-git-reset-hard/7376959를 참조하십시오 .
cr7pt0gr4ph7

13
사용 --soft으로 변경 사항을 유지하기는 uncommitted changes, --hard(가) 완전히 하나 되돌리기 다시 커밋 핵무기합니다. 아직 푸시되지 않은 변경 사항에 대해서만 이러한 작업을 수행해야합니다.
Yunus Nedim Mehel

@ 자즈 : 네 말이 맞아. 어쩌면 나는 그것을 분명히해야했을 것입니다. 색인에 추가되거나 (/ 스테이징 된) 커밋 된 파일 / 변경 사항 만 복구 할 수 있습니다. 당신이 말했듯 커밋되지 않은 비 단계적 변경 완전히 버려집니다 git reset --hard.
cr7pt0gr4ph7 2009 년

1
참고로 : 파일이 준비 될 때마다 git해당 내용을 객체 데이터베이스에 저장합니다. 저장된 내용은 가비지 수집이 실행될 때만 제거됩니다. 따라서 현재 git reset --hard실행될 때 준비되지 않은 파일의 마지막 준비된 버전을 복구 할 수 있습니다 (자세한 내용은 위에 링크 된 게시물 참조).
cr7pt0gr4ph7
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.