etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 9. 25. 02:02
반응형

질문자 :Community Wiki


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

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

유일한 방법은 일종의 GUI 텍스트 편집기에서 편집 내용을 복사한 다음 전체 로컬 복제본을 지운 다음 저장소를 다시 복제한 다음 편집 내용을 다시 적용하는 것 같습니다. 하지만,

  • 이로 인해 데이터가 손실될 수 있습니다.
  • git commit 만 실행되었을 때는 이것을 하기가 매우 어렵습니다.

더 좋은 방법이 있습니까?



답변자 : Community Wiki


커밋 취소 및 다시 실행

 $ git commit -m "Something terribly misguided" # (0: Your Accident) $ git reset HEAD~ # (1) [ edit files as necessary ] # (2) $ git add . # (3) $ git commit -c ORIG_HEAD # (4)
  1. 이 명령은 실행 취소를 담당합니다. 작업 트리(디스크에 있는 파일의 상태)를 건드리지 않은 채로 마지막 커밋을 취소합니다. 다시 커밋하려면 다시 추가해야 합니다.)

  2. 작업 트리 파일을 수정합니다.

  3. git add 새 커밋에 포함하려는 모든 것을 추가합니다.

  4. 이전 커밋 메시지를 재사용하여 변경 사항을 커밋합니다. reset 은 이전 헤드를 .git/ORIG_HEAD 복사했습니다. commit-c ORIG_HEAD 처음 이전의 로그 메시지 커밋을 포함하고 당신이 그것을 편집 할 수있는 편집기를 엽니 다. 메시지를 편집할 필요가 없으면 -C 옵션을 사용할 수 있습니다.

또는 이전 커밋(또는 커밋 메시지만)을 편집하기 위해 commit --amend 는 현재 인덱스 내의 변경 사항을 이전 커밋에 추가합니다.

서버에 푸시된 커밋을 제거(되돌리기가 아님)하려면 git push origin master --force 하여 기록을 다시 작성해야 합니다.


추가 읽기

HEAD를 이전 위치로 다시 이동하려면 어떻게 해야 합니까? (분리된 헤드) & Undo 커밋

위의 답변은 되돌리려는 커밋에 대한 SHA-1을 결정하는 데 사용할 수 있는 git reflog 이 값이 있으면 위에서 설명한 대로 명령 시퀀스를 사용합니다.


HEAD~ HEAD~1 과 동일합니다. 기사 git의 HEAD란? 여러 커밋을 커밋 해제하려는 경우에 유용합니다.



답변자 : Ryan Lundy


커밋을 취소하는 것은 작동 방식을 모르는 경우 약간 무섭습니다. 그러나 이해하면 실제로 놀라울 정도로 쉽습니다. 커밋을 취소할 수 있는 4가지 방법을 보여 드리겠습니다.

옵션 1: git reset --hard

C는 HEAD이고 (F)는 파일 상태입니다.

 (F) ABC ↑ master

커밋 C를 핵으로 만들고 다시는 보지 않으려고 로컬로 수정된 파일의 모든 변경 사항을 잃게 됩니다 . 당신은 이것을 할:

 git reset --hard HEAD~1

결과는 다음과 같습니다.

 (F) AB ↑ master

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

옵션 2: git reset

아, 하지만 커밋 C가 재앙이 아니라 약간 빗나갔다고 가정해 보겠습니다. 커밋을 취소하고 싶지만 더 나은 커밋을 수행하기 전에 약간의 편집을 위해 변경 사항을 유지합니다. C를 HEAD로 사용하여 여기에서 다시 시작합니다.

 (F) ABC ↑ master

--hard 하고 이 작업을 수행할 수 있습니다.

 git reset HEAD~1

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

 (F) ABC ↑ master

두 경우 모두 HEAD는 최신 커밋에 대한 포인터일 뿐입니다. git reset HEAD~1 을 수행하면 Git에 HEAD 포인터를 한 커밋 뒤로 이동하도록 지시합니다. --hard 를 사용하지 않는 한) 파일을 그대로 둡니다. 이제 git status 는 C에 체크인한 변경 사항을 보여줍니다. 아무것도 잃지 않았습니다!

옵션 3: git reset --soft

가장 가벼운 터치를 위해 커밋을 취소 할 수도 있지만 파일과 인덱스는 그대로 둘 수 있습니다.

 git reset --soft HEAD~1

이렇게 하면 파일이 그대로 유지될 뿐만 아니라 인덱스 도 그대로 유지됩니다. git status 를 수행하면 이전과 동일한 파일이 인덱스에 있는 것을 볼 수 있습니다. 사실, 이 명령 직후에 git commit 수행할 수 있으며 방금 했던 것과 동일한 커밋을 다시 수행할 수 있습니다.

옵션 4: git reset --hard 했으며 해당 코드를 다시 가져와야 합니다.

한 가지 더: 첫 번째 예에서와 같이 커밋을 삭제 했지만 결국 필요하다는 것을 발견했다고 가정해 보겠습니다. 운이 좋지 않죠?

아니요, 되돌릴 수 있는 방법이 아직 있습니다. git reflog 입력하면 이동한 (부분) 커밋 shas (즉, 해시) 목록이 표시됩니다. 삭제한 커밋을 찾고 다음을 수행합니다.

 git checkout -b someNewBranchName shaYouDestroyed

이제 해당 커밋을 부활시켰습니다. 커밋은 약 90일 동안 Git에서 실제로 파괴되지 않으므로 일반적으로 돌아가서 제거할 의도가 없었던 것을 구할 수 있습니다.



답변자 : Andrew


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

로컬 커밋을 취소하는 방법

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

 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 기본 사항 - 실행 취소 를 확인하세요.



답변자 : bdonlan


원하는 방식으로 파일을 추가/제거하세요.

 git rm classdir git add sourcedir

그런 다음 커밋을 수정합니다.

 git commit --amend

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

아직 푸시하지 않은 경우에만 이 작업을 수행해야 합니다. 푸시한 경우 정상적으로 수정 사항을 커밋하면 됩니다.



답변자 : Lennart Koopmann


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

또는

 git reset --hard HEAD~1

.java 파일(및 기타 파일)에 대한 수정 사항을 영구적으로 제거합니다.

HEAD-1 hard reset 하면 잘못된 커밋 이전의 커밋 상태로 작업 복사본이 설정됩니다.



답변자 : Zaz


마지막 커밋을 변경하려면

인덱스의 파일을 교체합니다.

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

그런 다음 개인 브랜치인 경우 커밋을 수정합니다.

 git commit --amend

또는 공유 분기인 경우 새 커밋을 수행합니다.

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

( 이전 커밋을 변경하려면 멋진 대화형 rebase를 사용하세요.)


ProTip™: gitignore *.class 를 추가하여 이러한 일이 다시 발생하지 않도록 합니다.


커밋을 되돌리려면

커밋 수정은 마지막 커밋을 변경해야 하는 경우 이상적인 솔루션이지만 더 일반적인 솔루션은 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를 사용하여 삭제된 커밋을 찾을 수 있습니다.

 $ 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





답변자 : Jaco Pretorius


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

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



답변자 : Madhan Ayyasamy


로컬 커밋을 완전히 취소할 계획이라면 커밋에서 변경한 사항을 무엇이든 변경하고 이에 대해 걱정하지 않는다면 다음 명령을 실행하면 됩니다.

 git reset --hard HEAD^1

(이 명령은 전체 커밋을 무시하고 변경 사항은 로컬 작업 트리에서 완전히 손실됩니다.) 커밋을 취소하고 싶지만 스테이징 영역에서 변경 사항을 원하면( git add 이후와 마찬가지로 커밋 전) 다음 명령을 수행합니다.

 git reset --soft HEAD^1

이제 커밋된 파일이 스테이징 영역으로 들어옵니다. 잘못된 내용을 편집해야 하기 때문에 파일을 업스테이지하려면 다음 명령을 수행하십시오.

 git reset HEAD

이제 커밋된 파일이 준비된 영역에서 준비되지 않은 영역으로 들어옵니다. 이제 파일을 편집할 준비가 되었으므로 무엇을 변경하든 편집하고 추가하고 새 커밋을 만들고 싶습니다.

더 보기(링크 끊김) ( 보관된 버전 )



답변자 : nickf


Git Extras가 설치되어 있는 경우 git undo 를 실행하여 최신 커밋을 취소할 수 있습니다. git undo 3 은 마지막 세 커밋을 취소합니다.



답변자 : neoneye


공유 저장소에서 최근 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>


답변자 : Steven Penny


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은 제거한 모든 줄에 대한 커밋을 제거합니다.



답변자 : Community Wiki


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

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

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

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

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

공개 커밋을 취소하는 방법

변경 사항을 취소하려면 역 체리 선택 ( git-revert )을 수행합니다.

아직 다른 변경 사항을 브랜치로 가져오지 않았다면 간단히 할 수 있습니다...

 git revert --no-edit HEAD

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

커밋 기록에는 두 커밋이 별도로 표시됩니다 .


고급: 공개 저장소 의 개인 분기 수정

이것은 위험할 수 있습니다 -- 푸시할 분기의 로컬 복사본이 있는지 확인하십시오.

또한 참고: 다른 사람이 지점에서 작업 중일 수 있는 경우에는 이 작업을 수행하지 마십시오.

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

지점을 로컬로 정리한 다음 다시 푸시...

 git push origin (branch_name)

일반적인 경우에는 개인 브랜치 커밋 히스토리가 깨끗한지 걱정할 필요가 없을 것입니다. 후속 커밋을 푸시하고(위의 '공개 커밋을 취소하는 방법' 참조) 나중에 스쿼시 병합 을 수행하여 기록을 숨깁니다.



답변자 : Community Wiki


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

커밋 ID는 다음을 통해 볼 수 있습니다.

 git log

그런 다음 다음과 같이 할 수 있습니다.

 git reset --hard <commit_id> git push origin <branch_name> -f


답변자 : Community Wiki


정크를 저질렀지만 밀어내지 않았다면,

 git reset --soft HEAD~1

HEAD~1 은 헤드 이전 커밋의 약어입니다. 또는 재설정하려는 경우 해시 의 SHA-1 을 참조할 수 있습니다. --soft 옵션은 커밋을 삭제하지만 git status에 표시되는 대로 변경된 모든 파일을 "커밋할 변경 사항"으로 남깁니다.

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

또는

일반적으로 내 경우 인 이미 푸시하고 누군가가 당겨지면 git reset 사용할 수 없습니다. 그러나 git revert를 할 수 있습니다.

 git revert HEAD

이것은 우발적 커밋에 의해 도입된 모든 것을 되돌리는 새로운 커밋을 생성할 것입니다.



답변자 : Community Wiki


SourceTree (GUI for GitHub)에서 커밋을 마우스 오른쪽 버튼으로 클릭하고 '역 커밋'을 수행할 수 있습니다. 이렇게 하면 변경 사항이 취소됩니다.

터미널에서:

또는 다음을 사용할 수 있습니다.

 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.


답변자 : Community Wiki


단일 명령:

 git reset --soft 'HEAD^'

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



답변자 : Community Wiki


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

 git reset --soft HEAD~1

설명: git reset 이 하는 일은 기본적으로 돌아가고 싶은 모든 커밋 reset --soft 키와 결합하면 뒤로 돌아가지만 파일의 변경 사항은 유지되므로 파일이 방금 추가된 단계로 돌아가고 HEAD 는 분기의 머리이며 ~1 과 결합하면(이 경우 HEAD^ 도 사용) 원하는 커밋 하나만 되돌아갑니다. ..

실제 상황에서 발생할 수 있는 모든 단계와 코드 커밋을 포함하여 아래 이미지의 단계를 더 자세히 설명합니다.

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



답변자 : Community Wiki


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

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

  1. 변경 사항을 유지하지 않으려면:

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

     git reset --soft HEAD^

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



답변자 : Community Wiki


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

 git reset --hard HEAD^

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

 git clean

참조 - Git 빠른 참조

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



답변자 : Community Wiki


reflog를 사용하여 올바른 상태 찾기

 git reflog

전에 리플로그 재설정하기 전에 다시 로그

올바른 reflog(내 경우에는 f3cb6e2)를 선택하고 다음을 입력합니다.

 git reset --hard f3cb6e2

그 후 repo HEAD는 해당 HEADid로 재설정됩니다.리셋 효과 재설정 후 로그

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

reflog 후 리플로그 파이널



답변자 : Community Wiki


첫 실행:

 git reflog

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

그런 다음 다음을 수행합니다.

 git reset --hard ActionIdFromRefLog


답변자 : Community Wiki


마지막 커밋 실행 취소:

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

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

여기서 --soft 는 스테이징으로 재설정됨을 의미합니다.

HEAD~ 또는 HEAD^ 는 HEAD 이전에 커밋으로 이동하는 것을 의미합니다.


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

 git commit --amend -m "message"

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



답변자 : Community Wiki


또 다른 방법:

되돌리려는 브랜치를 체크아웃한 다음 로컬 작업 복사본을 원격 서버의 최신 커밋이 되도록 다시 설정합니다(이후의 모든 작업은 바이바이). 이렇게 하려면 SourceTree에서 를 마우스 오른쪽 버튼으로 클릭하고 "BRANCHNAME을 이 커밋으로 재설정"을 선택했습니다.

그런 다음 저장소의 로컬 디렉터리로 이동하여 다음 명령을 실행합니다.

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

이렇게 하면 로컬 리포지토리에서 현재 커밋 이후의 모든 커밋이 지워지지만 해당 브랜치에 대해서만 지워집니다.



답변자 : Community Wiki


git log 를 입력하고 마지막 커밋 해시 코드를 찾은 다음 다음을 입력합니다.

 git reset <the previous co>


답변자 : Community Wiki


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

 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로 결과 확인



답변자 : Community Wiki


간단합니다. 명령줄에서 다음을 실행하세요.

 git reset --soft HEAD~


답변자 : Community Wiki


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

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

문제가 커밋한 추가 파일인 경우(그리고 저장소에 있는 파일을 원하지 않는 경우) 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 저장소에서도 제거됩니다.

이미 커밋을 푸시했습니다.

다른 시나리오의 동일한 솔루션을 적용한 다음 -f 옵션을 사용하여 git push 를 수행할 수 있지만 분기 변경으로 원격 기록을 덮어쓰므로 권장하지 않습니다 (리포지토리를 엉망으로 만들 수 있음).

--amend 없이 커밋을 수행해야 합니다(-amend`에 대해 기억하세요. 이 옵션은 마지막 커밋의 기록을 다시 씁니다).



답변자 : Community Wiki


로컬 커밋의 경우

 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) 매뉴얼 페이지 를 참조하십시오 .



답변자 : Community Wiki


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

 git reset --hard HEAD~1


답변자 : Community Wiki


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

마지막 커밋/이전 커밋을 취소하는 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


출처 : Here


출처 : http:www.stackoverflow.com/questions/927358/how-do-i-undo-the-most-recent-local-commits-in-git">

반응형