programing

Git에서 최신 로컬 커밋을 취소하려면 어떻게 해야 하나요?

jooyons 2023. 4. 15. 08:47
반응형

Git에서 최신 로컬 커밋을 취소하려면 어떻게 해야 하나요?

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

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

커밋을 취소하고 다시 실행

$ 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. git reset 실행 취소의 원인이 되는 명령어입니다.작업 트리(디스크에 있는 파일 상태)를 변경하지 않고 그대로 두고 마지막 커밋을 취소합니다.다시 커밋하기 전에 다시 추가해야 합니다.)
  2. 작업 트리 파일을 수정합니다.
  3. git add 새로운 커밋에 포함시키고 싶은 모든 것.
  4. 이전 커밋 메시지를 사용하여 변경을 커밋합니다. reset .git/ORIG_HEAD; 와 함께 에디터가 열립니다.에디터에는 처음에 이전 커밋의 로그메시지가 포함되어 있어 편집할 수 있습니다.메시지를 편집할 필요가 없는 경우 옵션을 사용할 수 있습니다.

또는 이전 커밋(또는 해당 커밋메시지)을 편집하려면 현재 인덱스 내의 변경을 이전 커밋에 추가합니다.

서버에 푸시된 커밋을 삭제(복귀하지 않음)하려면 다음 명령을 사용하여 이력을 다시 씁니다.git push origin main --force[-with-lease]필수입니다.사용하는 것은 거의 항상 좋지 않은 아이디어입니다.대신 git 매뉴얼에 기재된 바와 같이 사용하는 것이 좋습니다.

[이력 다시 쓰기]가 이미 출판된 경우 이력 다시 쓰기의 의미를 이해해야 합니다.


상세 정보

를 사용하여 되돌리는 커밋의 SHA-1을 결정할 수 있습니다.이 값을 얻으면 위에서 설명한 일련의 명령을 사용합니다.


HEAD~ is is is is is와 HEAD~1기사 What is the HEAD in git?는 여러 커밋을 해제하는 경우에 도움이 됩니다.

커밋이 어떻게 작동하는지 모르면 커밋을 취소하는 것은 조금 무섭습니다.하지만 당신이 이해한다면 그것은 사실 놀랍도록 쉽다.커밋을 취소할 수 있는 4가지 방법을 보여드리겠습니다.

예를 들어, C는 HEAD, (F)는 파일 상태를 나타냅니다.

   (F)
A-B-C
    ↑
  master

1: § 1:git reset --hard

커밋 C를 파기하고 커밋되지 않은 변경도 폐기합니다.다음을 수행합니다.

git reset --hard HEAD~1

결과는 다음과 같습니다.

 (F)
A-B
  ↑
master

헤드가 되다당신이 사용했기 때문에--hard을 사용하다

2: § 2:git reset

커밋 C가 재앙은 아니었을지 몰라도 조금 어긋났을지도 몰라커밋을 원래대로 되돌리지만 더 나은 커밋을 수행하기 전에 약간의 편집을 위해 변경 사항을 유지합니다.여기서부터 다시 시작하여 C를 HEAD로 합니다.

   (F)
A-B-C
    ↑
  master

해요.--hard:

git reset HEAD~1

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

   (F)
A-B-C
  ↑
master

어느 경우든 HEAD는 최신 커밋에 대한 포인터일 뿐입니다.□□□□□을git reset HEAD~1Git 게 HEAD git git git git git git git git git git git git git git 。 (「」를 하지 않는 한)--hard을 그대로 파일을 그대로 둡니다. 지금 so서 so so so sogit status, C 한 변경을 나타냅니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★!

3: § 3:git reset --soft

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

git reset --soft HEAD~1

이렇게 하면 파일뿐만 아니라 인덱스도 그대로 유지됩니다.할 때git status이전과 동일한 파일이 인덱스에 있습니다.에는 ""를 실행할 수 .git commit방금 한 약속과 똑같은 일을 하게 될 거야

4:: ::git reset --hard 그 한다.

한가지 더: 번째 예시와 같이 커밋을 파기했지만 결국 그것이 필요했다는 것을 알게 되었다고 가정해 봅시다.운이 안 좋지, 그렇지?

아니, 아직 되찾을 방법이 있어입력

git reflog

이동해 온 커밋 쉐이시(즉 해시)의 리스트가 표시됩니다.파기된 커밋을 찾아 다음을 수행합니다.

git checkout -b someNewBranchName shaYouDestroyed

당신은 이제 그 약속을 부활시켰습니다.커밋은 실제로 Git에서 90일 동안 파괴되지 않기 때문에 보통 원래 의도하지 않았던 커밋을 구하면 됩니다.

커밋이 이미 공개되었는지 여부에 따라(리모트 저장소에 푸시됨) 마지막 커밋을 "실행 취소"하는 두 가지 방법이 있습니다.

로컬 커밋을 취소하는 방법

예를 들어 로컬에서 커밋했다고 칩시다만, 이 커밋을 삭제합니다.

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를 참조하십시오.

원하는 방식으로 파일을 추가/제거:

git rm classdir
git add sourcedir

다음으로 커밋을 수정합니다.

git commit --amend

이전의 잘못된 커밋은 새로운 인덱스 상태를 반영하도록 편집됩니다.즉, 처음부터 실수하지 않은 것과 같습니다.

아직 누르지 않은 경우에만 이 작업을 수행해야 합니다.눌렀다면 정상적으로 수정하면 됩니다.

그러면 추가된 파일을 삭제하는 새로운 커밋이 추가됩니다.

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

또는 마지막 커밋을 취소하기 위해 이력을 다시 쓸 수도 있습니다.

경고: 이 명령어는 에 대한 수정 내용을 영구적으로 삭제합니다..java커밋한 파일(및 기타 파일) - 작업 디렉토리에서 모든 변경사항을 삭제합니다.

git reset --hard HEAD~1

hard reset로로 합니다.HEAD-1는 작업복사를 잘못된 커밋 전의 커밋 상태로 설정합니다.

마지막 커밋을 변경하려면

인덱스의 파일을 바꿉니다.

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

그런 다음 프라이빗 브랜치일 경우 커밋을 수정합니다.

git commit --amend

또는 공유 브랜치인 경우 새로운 커밋을 합니다.

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

(이전 커밋을 변경하려면 멋진 인터랙티브리베이스 리베이스를 사용합니다).


: ™ 추가: 추추*.class이런 일이 다시 일어나지 않게 하려고요


커밋을 되돌리려면

커밋을 해야 할 을 수정하는 방법은 커밋을 변경하는 것입니다.reset.

Git을 리셋할 수 있는 커밋은 다음과 같습니다.

git reset @~N

서 ★★★★★N 、 전 、 is 、 is 、 is の is is 까지의 커밋 .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

git revert <commit-id>.

ID 를 하려면 , 「ID」를 합니다.git log.

로컬 커밋을 완전히 취소할 예정이고 커밋에서 변경한 내용이 무엇이든 상관 없이 다음 명령을 수행합니다.

git reset --hard HEAD^1

(이 명령어는 커밋 전체를 무시하고 로컬 작업 트리에서 변경 내용이 완전히 손실됩니다).대로 되돌리고 영역에서 (' after'와 로 커밋하기 전)git add그런 다음 다음 명령을 수행합니다.

git reset --soft HEAD^1

이제 커밋된 파일이 스테이징 영역으로 들어갑니다.잘못된 내용을 편집해야 하므로 파일을 업그레이드하려면 다음 명령을 수행합니다.

git reset HEAD

이제 스테이징된 영역에서 비스테이지 영역으로 커밋된 파일을 가져왔습니다.이제 파일을 편집할 준비가 되었으므로 무엇을 변경하든 편집 및 추가 후 신규/새로 커밋할 수 있습니다.

기타 (링크 절단) (아카이브 버전)

Git Extra가 설치되어 있으면 실행할 수 있습니다.git undo최신 커밋을 취소합니다. git undo 33번으로 나누다

공유 저장소에 있는 최근 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 --amendGUI 에서는, 커밋으로부터 개개의 파일을 추가 또는 삭제할 수 있습니다.커밋 메시지를 변경할 수도 있습니다.

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

을 이전만 하면 를 들어,을 이전 위치로 재설정하면 됩니다).gitk ★★★★★★★★★★★★★★★★★」git rebase그런 다음 저장된 복사본에서 변경 내용을 다시 적용합니다.로컬 저장소에서 가비지 수집 후 불필요한 커밋이 발생하지 않은 것과 같습니다.의 명령어로 하려면 , 「 」를합니다.git reset HEAD~1.

경고: 부주의하게 사용하는 것은 작업복사를 혼란스럽게 만드는 좋은 방법입니다. Git 초보자는 가능하면 피하는 것이 좋습니다.

공개 커밋을 취소하는 방법

변경을 원래대로 되돌리려면 역체리 픽(git-revert)을 실행합니다.

아직 브랜치에 다른 변경을 도입하지 않았다면 간단히 다음 작업을 간단하게 실시할 수 있습니다.

git revert --no-edit HEAD

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

커밋 이력은 양쪽 커밋을 개별적으로 표시합니다.


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

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

주의사항:지사에서 다른 사람이 일하고 있는 경우에는 이 작업을 하고 싶지 않습니다.

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

지점을 로컬로 정리한 후 다시 밀어 넣으십시오.

git push origin (branch_name)

통상의 경우, 프라이빗 브랜치의 커밋 이력이 깨끗한 것에 대해 걱정할 필요는 없습니다.폴로업 커밋을 푸시하고(위의 '공적인 커밋을 취소하는 방법' 참조), 나중에 스쿼시 머지를 실행하여 이력을 숨깁니다.

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

커밋 ID는 다음과 같이 표시됩니다.

git log 

다음 작업을 수행할 수 있습니다.

git reset --hard <commit_id>

git push origin <branch_name> -f

만약 당신이 정크 푸쉬를 범했지만 강요하지 않았다면,

git reset --soft HEAD~1

HEAD~1은 commit before head의 약자입니다.또는 리셋하고 싶은 경우 해시의 SHA-1을 참조할 수 있습니다. --soft 옵션은 커밋을 삭제하지만 git 상태가 나타내는 것처럼 변경된 모든 파일은 "Changes to be commit"로 남습니다.

commit before head 대신 "--hard"를 사용하기 때문에 작업 트리의 추적 대상 파일에 대한 변경을 삭제할 경우.

또는

만약 당신이 이미 밀었고 누군가가 당겼다면, 그것은 보통 나의 경우입니다만, 당신은 git reset을 사용할 수 없습니다.하지만 git revert를 실행할 수 있습니다.

git revert HEAD

이것에 의해, 우발적인 커밋에 의해서 도입된 모든 것을 되돌리는 새로운 커밋이 작성됩니다.

SourceTree(GitHub의 경우 GUI)에서 커밋을 오른쪽 클릭하여 'Reverse Commit'을 실행할 수 있습니다.그러면 변경 내용이 취소됩니다.

터미널:

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

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^1번으로 하다

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

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

"작업 트리를 마지막 커밋으로 리셋"

git reset --hard HEAD^ 

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

git clean    

참고 항목 - Git 빠른 참조

메모: 이 명령어는 이전 커밋을 삭제하므로 주의하여 사용하십시오. git reset --hard더 안전합니다.

마지막 Git 커밋을 취소하려면 어떻게 해야 하나요?

모든 것을 이전 커밋 이전의 상태로 되돌리려면 HEAD 이전 커밋으로 리셋해야 합니다.

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

    git reset --hard HEAD^
    
  2. 변경을 유지하려면 다음 절차를 따릅니다.

    git reset --soft HEAD^
    

이제 Git 로그를 확인합니다.우리의 마지막 약속이 제거되었음을 나타냅니다.

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

git reflog

전에 다시 기록하다 재설정 전 재로그

올바른 reflog(내 경우 f3cb6e2)를 선택하고 다음과 같이 입력합니다.

git reset --hard f3cb6e2

후 는 그 그 to to after [ repo HEAD ]로.리셋 효과 RESET log log log log log

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

이후 다시 기록하다 리플로그 파이널

첫 번째 실행:

git reflog

저장소에서 실행 가능한 모든 작업(예: commit, merge, pull)이 표시됩니다.

그럼 다음 작업을 수행합니다.

git reset --hard ActionIdFromRefLog

마지막 커밋 실행 취소:

git reset --soft HEAD^ ★★★★★★★★★★★★★★★★★」git reset --soft HEAD~

마지막 커밋이 취소됩니다.

서 ★★★★--softstaging로 것을 합니다.

HEAD~ ★★★★★★★★★★★★★★★★★」HEAD^HEAD head head head head head head head head head head head head head head head


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

git commit --amend -m "message"

마지막 커밋이 새로운 커밋으로 대체됩니다.

다른 방법:

되돌리는 브랜치를 체크 아웃 한 후 로컬 작업 복사를 리모트서버의 최신 커밋으로 리셋 합니다(그 후의 모든 것은 bye-bye).이를 위해 SourceTree에서 를 오른쪽 클릭하여 [Reset BRANCHNAME to this commit]를 선택합니다.

그런 다음 리포지토리의 로컬 디렉터리로 이동하고 다음 명령을 실행합니다.

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을 사용하여 결과를 확인합니다.

, 사용방법,reset --soft ★★★★★★★★★★★★★★★★★」reset --hard

@Kyralessa의 답변에 2센트만 더하면 됩니다.

해야 할지 는, 을 참조해 .--soft(저는 이 규칙을 사용하여 --soft for safe를 기억했습니다).

왜요?

★★★★★★★★★★★★★★★★를 선택하면,--hard실수로 인해 이전과 달리 변경 사항을 잃게 됩니다.원하신다면--soft하면 수 --hard

git reset HEAD file.html
git checkout -- file.html

완전한 예

echo "some changes..." > file.html
git add file.html
git commit -m "wrong commit"

# I need to reset
git reset --hard HEAD~1 (cancel changes)
# OR
git reset --soft HEAD~1 # Back to staging
git reset HEAD file.html # back to working directory
git checkout -- file.html # cancel changes

크레딧은 @Kyralessa에게 돌아갑니다.

단순하게 명령줄에서 다음을 수행합니다.

git reset --soft HEAD~ 

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

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

경고: 무엇을 하고 있는지 모를 경우 --hard를 사용하지 마십시오. --hard는 너무 위험하며 파일이 삭제될 수 있습니다.

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

$ git reset --hard <COMMIT -ID>

또는

$ git reset --hard HEAD~<n>

COMMIT-ID: 커밋 아이디

n: 되돌리는 마지막 커밋 수입니다.

다음과 같이 커밋 ID를 얻을 수 있습니다.

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to multiply two numbers

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

이제 몇 가지 사례를 살펴보겠습니다.

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

$ git reset --hard d81d3f1

또는

$ git reset --hard HEAD~1

커밋 'be20eb8'을 되돌리는 경우:

$ git reset --hard be20eb8

자세한 내용은 헤드를 지정된 상태로 리셋하기 위한 다른 명령어를 참조해 시험해 볼 수 있습니다.

$ git reset --help

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

아직 확약을 추진하지 않으셨군요.

"""를 사용하여 할 수 있습니다."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(이것에 대해서는, 다음과 같이 주의해 주세요.이 옵션에 의해, 마지막 커밋의 이력이 고쳐집니다).

로컬 커밋의 경우

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

언급URL : https://stackoverflow.com/questions/927358/how-do-i-undo-the-most-recent-local-commits-in-git

반응형