문제

실수로 잘못된 파일을 커밋했습니다 git, 그러나 나는 아직 서버에 커밋을 추진하지 않았습니다.

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

도움이 되었습니까?

해결책

커밋을 취소하고 다시 실행하십시오

$ 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. 이렇게하면 작업 트리 (디스크의 파일 상태)가 변경되지 않지만 커밋을 취소하고 범위를 취소 한 변경 사항을 무대에 맡깁니다. git status, 따라서 커밋하기 전에 다시 추가해야합니다). 만약 너라면 ~ 고 싶어요 추가하다 이전 커밋에 대한 더 많은 변경 또는 커밋 메시지 변경1, 당신은 사용할 수 있습니다 git reset --soft HEAD~ 대신, 어떤 것 같아요 git reset HEAD~ (어디 HEAD~ 와 같다 HEAD~1) 그러나 기존의 변화를 무대에 맡깁니다.
  3. 작업 트리 파일을 수정하십시오.
  4. git add 새로운 커밋에 포함시키고 싶은 모든 것.
  5. 기존 커밋 메시지를 재사용하면서 변경 사항을 커밋하십시오. reset 오래된 머리를 복사했습니다 .git/ORIG_HEAD; commit ~와 함께 -c ORIG_HEAD 처음에는 이전 커밋의 로그 메시지를 포함하여 편집자를 열고 편집 할 수 있습니다. 메시지를 편집 할 필요가 없다면 -C 옵션.

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

코드가 이미 서버로 푸시되고 기록을 덮어 쓰는 권한이있는 경우 (Rebase).

git push origin master --force

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

헤드를 이전 위치로 다시 이동시키는 방법? (분리 된 머리) & 실행 취소 커밋

위의 답변이 당신을 보여줄 것입니다 git reflog 이는 되돌려 놓고자하는 SHA-1이 무엇인지 알아내는 데 사용됩니다. 위에서 설명한대로 명령 시퀀스를 사용하기 위해 실행 취소하려는 지점을 찾은 후.


1 그러나, 당신이 당신이 당신의 실수를 한 경우에도 이전 커밋으로 재설정 할 필요가 없음을 주목하십시오. 커밋 메시지. 더 쉬운 옵션은 git reset (그 이후로 변경 한 모든 변경 사항을 해제하려면) git commit --amend, 마지막 커밋 메시지로 사전 인구를 찍은 기본 커밋 메시지 편집기를 열게됩니다.

다른 팁

커밋을 취소하는 것은 어떻게 작동하는지 모른다면 약간 무섭습니다. 그러나 이해한다면 실제로 놀랍게도 쉽습니다.

C가 머리이고 (f)는 파일의 상태 인 경우에 이것을 가지고 있다고 가정 해보십시오.

   (F)
A-B-C
    ↑
  master

당신은 원합니다 Nuke Commit C는 다시는 보지 못합니다. 당신은 이것을합니다 :

git reset --hard HEAD~1

결과는 다음과 같습니다.

 (F)
A-B
  ↑
master

이제 B는 머리입니다. 당신이 사용했기 때문에 --hard, 귀하의 파일은 Commit B에서 주에 재설정됩니다.

아, 그러나 Commit C가 재앙이 아니라고 가정 해 봅시다. 당신은 원합니다 커밋을 취소하지만 변경 사항을 유지하십시오 더 나은 커밋을하기 전에 약간의 편집을 위해. 여기에서 다시 시작하여 C를 머리로 사용합니다.

   (F)
A-B-C
    ↑
  master

당신은 이것을 할 수 있습니다 --hard:

git reset HEAD~1

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

   (F)
A-B-C
  ↑
master

두 경우 모두 헤드는 최신 커밋에 대한 포인터 일뿐입니다. 당신이 할 때 git reset HEAD~1, 당신은 Git에게 헤드 포인터를 다시 한 번 커밋하라고 말합니다. 그러나 (당신이 사용하지 않는 한 --hard) 파일을 그대로두고 있습니다. 그래서 지금 git status C로 확인한 변경 사항을 보여줍니다.

가장 가벼운 터치를 위해서도 할 수 있습니다 커밋을 취소하지만 파일과 당신의 파일을 남겨 두십시오 인덱스:

git reset --soft HEAD~1

이것은 파일을 혼자서 떠날뿐만 아니라 심지어 당신의 인덱스 홀로. 당신이 할 때 git status, 동일한 파일이 이전과 인덱스에 있음을 알 수 있습니다. 사실,이 명령 직후에 git commit 그리고 당신은 당신이 방금 가지고 있었던 것과 같은 커밋을 다시 만들 것입니다.

하나 더: 당신이 커밋을 파괴한다고 가정합니다 첫 번째 예에서와 같이 그러나 결국 필요하다는 것을 알게됩니다? 힘든 행운, 맞습니까?

아니, 거기 있습니다 아직 그것을 되 찾는 방법. 유형 git reflog 그리고 당신은 (부분) 커밋 목록을 볼 수 있습니다 Shas (즉, 해시) 당신이 이사 한 것입니다. 당신이 파괴 한 커밋을 찾아서 이것을하십시오.

git checkout -b someNewBranchName shaYouDestroyed

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

알아내는 데 시간이 걸렸으므로 누군가가 누군가를 도울 것입니다 ...

당신이 이미 커밋을 공개했는지 여부에 따라 마지막 커밋을 "취소"하는 두 가지 방법이 있습니다 (원격 저장소로 밀려 났음).

로컬 커밋을 취소하는 방법

내가 현지에서 커밋했지만 이제 그 커밋을 제거하고 싶다고 가정 해 봅시다.

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 우리의 마지막 커밋이 제거되었음을 보여줄 것입니다.

공공 커밋을 취소하는 방법

이미 커밋을 공개 한 경우 이전 커밋 (현재 헤드)에서 변경 한 변경 사항을 "되돌릴"새로운 커밋을 만들고 싶을 것입니다.

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 기본 사항 - 실행 취소 사물

원하는 방식으로 물건을 얻기 위해 파일 추가/제거 :

git rm classdir
git add sourcedir

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

git commit --amend

이전의 잘못된 커밋은 새로운 인덱스 상태를 반영하기 위해 편집 될 것입니다. 즉, 처음에는 실수를 한 적이없는 것과 같습니다.

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

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 잘못된 커밋 전에 작업 사본을 커밋 상태로 설정합니다.

마지막 커밋을 변경합니다

인덱스의 파일 교체 :

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

그런 다음 개인 지점이라면 개정하다 커밋 :

git commit --amend

또는 공유 지점 인 경우 새로운 커밋을 만드십시오.

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


(이전 커밋을 변경합니다, 굉장한 것을 사용하십시오 대화식 레바이스)


PRIPIP ™ : 추가 *.class a 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, 이것이 무엇을하는지 더 잘 이해하기 위해.

리플 로그

엉망이되면 언제든지 리플 로그를 사용하여 삭제 된 커밋을 찾을 수 있습니다.

$ 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


사용 git revert <commit-id>

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

지역 커밋을 완전히 취소하려는 경우, 당신이 바꾸는 것에 대해 무엇을 변경했는지, 그리고 그것에 대해 걱정하지 않으면 다음 명령을하십시오.

git reset --hard HEAD^1

(이 명령은 전체 커밋을 무시하고 지역 작업 트리에서 변경 사항이 완전히 손실됩니다). 커밋을 취소하고 싶지만 스테이징 영역의 변경을 원한다면 (후에 커밋하기 전에 git add) 그런 다음 다음 명령을 수행하십시오.

git reset --soft HEAD^1

이제 커밋 된 파일이 스테이징 영역으로 나옵니다. 파일을 무대 위하려면 잘못된 콘텐츠를 편집해야하기 때문에 다음 명령을 수행한다고 가정 해 봅시다.

git reset HEAD

이제 무대 영역에서 무대 영역으로 나오도록 파일을 커밋했습니다. 이제 파일을 편집 할 준비가되었으므로 변경하든 편집하고 추가하여 신선한/새로운 커밋을 만들고 싶습니다.

당신이 가지고 있다면 git 엑스트라 설치하면 실행할 수 있습니다 git undo 최신 커밋을 취소합니다. git undo 3 마지막 3 커밋을 취소합니다.

공유 저장소에서 가장 마지막 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>

나는 사용하는 것을 선호한다 git rebase -i 이 직업의 경우, 내가 제거 할 커밋을 선택할 수있는 좋은 목록이 나타나기 때문에. 여기서 다른 답변만큼 직접적인 것은 아니지만 옳은 느낌.

목록에 몇 개의 커밋을 선택한 다음 이렇게 호출하십시오 (지난 3 번의 입대하려면)

git rebase -i HEAD~3

샘플 목록

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

그런 다음 GIT는 제거한 라인에 대한 커밋을 제거합니다.

이전 지역 커밋을 수정하는 방법

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

이전 지역 커밋을 취소하는 방법

지점을 이전 위치로 재설정합니다 (예 : 사용 gitk 또는 git rebase). 그런 다음 저장된 사본에서 변경 사항을 다시 적용하십시오. 현지 저장소에서 쓰레기 수집 후에는 원치 않는 커밋이 일어나지 않은 것 같습니다. 단일 명령으로 모든 것을 수행하려면 사용하십시오. git reset HEAD~1.

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

공공 커밋을 취소하는 방법

수행 a 리버스 체리 픽 (git-revert) 변경 사항을 취소합니다.

아직 다른 변경 사항을 지점으로 끌어 당기지 않았다면 간단히 할 수 있습니다 ...

git revert --no-edit HEAD

그런 다음 업데이트 된 지점을 공유 저장소로 푸시하십시오.

커밋 역사는 별도로 커밋을 모두 보여줄 것입니다.


고급 : 수정 사적인 공공 저장소 분야

이것은 위험 할 수 있습니다. 반환 할 지점의 현지 사본이 있는지 확인하십시오.

또한 참고 : 다른 사람이 지점에서 일하고 있다면이 작업을 수행하고 싶지 않습니다.

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

지점을 현지에서 정리 한 다음 repush ...

git push origin (branch_name)

정상적인 경우, 당신은 아마도 당신의 개인 지점 커밋 역사가 깨끗하다는 것에 대해 걱정할 필요가 없을 것입니다. 후속 커밋을 밀고 (위의 '공공 커밋을 취소하는 방법'참조), 나중에 스쿼시-머지 역사를 숨기기 위해.

쓰레기를 투입했지만 밀지 않았다면

git reset --soft HEAD~1

머리 ~ 1 머리 앞에 커밋을위한 속기입니다. 또는 당신은 참조 할 수 있습니다 SHA-1 재설정하려면 해시의. --부드러운 옵션은 커밋을 삭제하지만 GIT 상태가 제시된대로 변경된 모든 파일을 "커밋 될 변경"을 남깁니다.

헤드 사용 전 커밋 이후로 작업 트리의 추적 파일을 변경하려면 "--딱딱한" 대신에.

또는

당신이 이미 밀고 누군가가 보통 내 사건 인 사람을 끌어 당겼다면, 당신은 사용할 수 없습니다 git 재설정. 그러나 당신은 할 수 있습니다 git 되돌립니다,

git revert HEAD

이로 인해 우연한 커밋이 소개 한 모든 것을 취소하는 새로운 커밋이 만들어집니다.

영구적으로 취소하고 싶고 리포지토리를 복제 한 경우

커밋 ID는 볼 수 있습니다

git log 

그런 다음 할 수 있습니다.

git reset --hard <commit_id>

git push origin <branch_name> -f

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.

단일 명령 :

git reset --soft 'HEAD^' 

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

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

git reset --soft HEAD~1

설명: 무엇 git reset 기본적으로 그렇습니다 reset 당신이 다시 가고 싶은 모든 커밋에, 당신이 그것을 결합하면 --soft 키, 다시 돌아가지만 파일의 변경 사항을 유지하므로 파일이 추가 된 단계로 돌아갑니다. HEAD 지점의 머리이며 당신이 결합하는 경우 ~1 (이 경우에도 사용합니다 HEAD^), 그것은 당신이 원하는 것을 하나의 커밋 만 거슬러 올라갈 것입니다 ...

실제 상황에서 발생할 수있는 모든 단계와 코드를 커밋하는 모든 단계를 포함하여 귀하를위한 자세한 내용으로 아래 이미지의 단계를 만듭니다.

How to undo the last commits in Git?

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

마지막 커밋 이전의 방식으로 모든 것을 복원하려면 머리 앞에 커밋으로 재설정해야합니다.

  1. 당신이 만든 변화를 유지하고 싶지 않다면 :

    git reset --hard HEAD^
    
  2. 변경 사항을 유지하려면 :

    git reset --soft HEAD^
    

이제 git 로그를 확인하십시오. 그것은 우리의 마지막 커밋이 제거되었음을 보여줄 것입니다.

리플 로그를 사용하여 올바른 상태를 찾으십시오

git reflog

reflog before 재설정하기 전에 리플 로그

올바른 리플 로그 (내 경우 F3CB6E2)를 선택하고 유형

git reset --hard f3cb6e2

그 후 레포 헤드가 해당 Headid로 재설정됩니다.reset effect 재설정 후 로그

마지막으로 리플 로그는 아래 그림처럼 보입니다

reflog after 리플 로그 결승

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

git reset --hard HEAD^ 

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

git clean    

보다 - git 빠른 참조

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

첫 번째 실행 :

git reflog

저장소에서 수행 한 가능한 모든 작업 (예 : 커밋, 병합, 당기기 등)을 보여줍니다.

그런 다음 :

git reset --hard ActionIdFromRefLog

최후의 커밋 취소 :

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

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

여기 --soft 스테이징에 재설정을 의미합니다.

HEAD~ 또는 HEAD^ 머리 앞에 커밋하는 것을 의미합니다.


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

git commit --amend -m "message"

마지막 커밋을 새로운 커밋으로 대체합니다.

또 다른 방법:

되돌릴 지점을 확인한 다음 원격 서버에서 최신 사본이되기를 원하는 커밋으로 로컬 작업 사본을 다시 재설정하십시오 (이후의 모든 것이 바이 색으로 갈 것입니다). 이를 위해 Sourcetree에서 나는 "이 커밋에 대한 BranchName을 재설정"에서 마우스 오른쪽 버튼으로 클릭했습니다.

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

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

이것은 로컬 저장소의 현재 커밋 후에 모든 커밋을 지우지 만 해당 분기에 대해서만 지우칩니다.

유형 git log 마지막 커밋 해시 코드를 찾은 다음 다음을 입력하십시오.

git reset <the previous co>

제 경우에는 실수로 원하지 않는 일부 파일을 저질렀습니다. 그래서 나는 다음을 수행했고 그것은 효과가있었습니다.

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로 결과를 확인하십시오

간단하고 명령 줄에서 이것을 실행하십시오.

git reset --soft HEAD~ 

이를 수행하는 방법에는 여러 가지가 있습니다.

마지막 커밋/ 이전 커밋을 취소하기위한 git 명령 :

경고: 당신이 무엇을하고 있는지 모르는 경우 사용하지 마십시오. -하드도 마찬가지입니다 위험한, 그리고 아마도 파일을 삭제하십시오.

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

어디 D81D3F1 그리고 Be20EB8 커밋 ID입니다.

이제 몇 가지 경우를 보겠습니다.

마지막 커밋 'd81d3f1'을 되돌려보십시오. 다음은 두 가지 옵션입니다.

$ git reset --hard d81d3f1

또는

$ git reset --hard HEAD~1

Commit 'Be20EB8'을 되돌리고 싶다고 가정 해 봅시다.

$ git reset --hard be20eb8

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

$ git reset --help

이전 개정판으로 재설정하려면 모든 커밋되지 않은 변경 사항을 영구적으로 삭제합니다.

git reset --hard HEAD~1

사용 Sourcetree (git의 그래픽 도구) 커밋과 나무를 볼 수 있습니다. 마우스 오른쪽 버튼을 클릭하여 직접 재설정 할 수 있습니다.

지역 커밋을 위해

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) 매뉴얼 페이지.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top