etc./StackOverFlow

"git commit" 대신 수행된 "git commit --amend"를 실행 취소하는 방법

청렴결백한 만능 재주꾼 2022. 2. 15. 08:49
반응형

질문자 :Jesper Rønn-Jensen


실수로 이전 커밋을 수정했습니다. 특정 파일에 대한 변경 기록을 유지하려면 커밋을 분리해야 합니다.

마지막 커밋을 취소하는 방법이 있습니까? git reset --hard HEAD^ 와 같은 작업을 수행하면 첫 번째 커밋도 취소됩니다.

(아직 원격 디렉토리로 푸시하지 않았습니다)



HEAD 커밋과 동일한 세부 사항으로 새 커밋을 만드는 것입니다. 그러나 부모는 HEAD 의 이전 버전입니다. git reset --soft 는 다음 커밋이 현재 분기 헤드가 있는 위치와 다른 커밋의 맨 위에서 발생하도록 분기 포인터를 이동합니다.

 # Move the current head so that it's pointing at the old commit # Leave the index intact for redoing the commit. # HEAD@{1} gives you "the commit that HEAD pointed at before # it was moved to where it currently points at". Note that this is # different from HEAD~1, which gives you "the commit that is the # parent node of the commit that HEAD is currently pointing to." git reset --soft HEAD@{1} # commit the current tree using the commit details of the previous # HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the # previous command. It's now pointing at the erroneously amended commit.) git commit -C HEAD@{1}

CB Bailey

ref-log 사용 :

 git branch fixing-things HEAD@{1} git reset fixing-things

그러면 이전에 수정한 모든 변경 사항이 작업 복사본에만 있어야 하며 다시 커밋할 수 있습니다.

이전 인덱스의 전체 목록을 보려면 git reflog


knittl

다음을 통해 수정된 커밋을 찾습니다.

 git log --reflog

참고: 명확성을 위해 커밋 본문을 보려면 --patch 를 추가할 수 있습니다. git reflog 와 동일합니다.

그런 다음 HEAD를 다음과 같이 괜찮았던 시점의 이전 커밋으로 재설정합니다.

 git reset SHA1 --hard

참고 : 실제 커밋 해시 SHA1를 교체합니다. 또한 이 명령은 커밋되지 않은 변경 사항을 잃게 되므로 이전에 숨길 수 있습니다. 또는 --soft 대신 사용하여 최신 변경 사항을 유지 한 다음 커밋합니다.

그런 다음 그 위에 필요한 다른 커밋을 선택하십시오.

 git cherry-pick SHA1

kenorb

HEAD@{1} 사용한 답변 중 어느 것도 나에게 적합하지 않았으므로 다음과 같은 해결책을 제시합니다.

git reflog

 d0c9f22 HEAD@{0}: commit (amend): [Feature] - ABC Commit Description c296452 HEAD@{1}: commit: [Feature] - ABC Commit Description

git reset --soft c296452

이제 스테이징 환경에 실수로 c296452 커밋과 병합한 모든 변경 사항이 포함됩니다.


Oisín Foley

커밋을 원격으로 푸시한 다음 해당 커밋에 대한 변경 사항을 잘못 수정하면 문제가 해결됩니다. git log 를 실행하여 SHA를 찾습니다. (여기서는 원격 이름이 origin이라고 가정합니다). 이제 해당 SHA를 사용하여 이 명령을 실행합니다.

 git reset --soft <SHA BEFORE THE AMMEND> #you now see all the changes in the commit and the amend undone #save ALL the changes to the stash git stash git pull origin <your-branch> --ff-only #if you issue git log you can see that you have the commit you didn't want to amend git stash pop #git status reveals only the changes you incorrectly amended #now you can create your new unamended commit

David Sopko

항상 커밋을 나눌 수 있습니다. 매뉴얼에서

  • git rebase -i commit^로 대화형 리베이스를 시작합니다. 여기서 commit은 분할하려는 커밋입니다. 사실, 그 커밋을 포함하는 한 모든 커밋 범위는 그렇게 할 것입니다.
  • "편집" 작업으로 분할하려는 커밋을 표시합니다.
  • 해당 커밋을 편집할 때 git reset HEAD^를 실행합니다. 그 효과는 HEAD가 1씩 되감기되고 인덱스가 그에 따른다는 것입니다. 그러나 작업 트리는 그대로 유지됩니다.
  • 이제 첫 번째 커밋에 포함하려는 인덱스에 변경 사항을 추가합니다. git add(대화식으로 가능) 또는 git-gui(또는 둘 다)를 사용하여 이를 수행할 수 있습니다.
  • 지금 적절한 커밋 메시지로 현재 인덱스를 커밋합니다.
  • 작업 트리가 깨끗해질 때까지 마지막 두 단계를 반복합니다.
  • git rebase --continue를 사용하여 리베이스를 계속합니다.

Arkaitz Jimenez

아직 커밋 메시지가 있는 편집기에 있는 경우 커밋 메시지를 삭제할 수 있으며 git commit --amend 명령이 중단됩니다.


Justin Schulz

git reflog 를 사용하여 수정 전과 수정 후 두 개의 커밋을 얻을 수 있습니다.

그런 다음 git diff before_commit_id after_commit_id > d.diff 를 사용하여 수정 전과 수정 후의 차이를 확인합니다.

다음으로 커밋하기 전으로 돌아가려면 git checkout before_commit_id 를 사용하십시오.

그리고 마지막으로 git apply d.diff 를 사용하여 실제 변경 사항을 적용합니다.

내 문제를 해결합니다.


utzcoz

git commit —amend 를 실행 취소할 수 있습니다.

  1. git reset --soft HEAD^
  2. git checkout files_from_old_commit_on_branch
  3. git pull origin your_branch_name

======================================

이제 변경 사항은 이전과 같습니다. git commit —amend 대한 실행 취소가 완료되었습니다.

이제 git push origin <your_branch_name> 을 수행하여 분기로 푸시할 수 있습니다.


Pratik

이것에 거의 9 년이 늦었지만 동일한 작업을 수행하는 것에 대해 언급 한이 변형을 보지 못했습니다 (최고 답변과 유사한 몇 가지 조합입니다 ( https://stackoverflow.com/a/1459264/4642530 ) .

분기에서 분리된 모든 헤드 검색

git reflog show origin/BRANCH_NAME --date=relative

그런 다음 SHA1 해시를 찾으십시오.

이전 SHA1로 재설정

git reset --hard SHA1

그런 다음 다시 밀어 올리십시오.

git push origin BRANCH_NAME

완료.

이렇게 하면 이전 커밋으로 완전히 되돌아갑니다.

(이전에 덮어쓴 분리된 커밋 헤드의 날짜 포함)


garrettmac

  1. 마지막 커밋으로 임시 분기로 체크아웃

    git branch temp HEAD@{1}

  2. 마지막 커밋 재설정

    git reset temp

  3. 이제 모든 파일에 커밋과 이전 커밋이 있습니다. 모든 파일의 상태를 확인하십시오.

    git status

  4. git 단계에서 커밋 파일을 재설정합니다.

    git reset myfile1.js (등)

  5. 이 커밋 다시 연결

    git commit -C HEAD@{1}

  6. 새 커밋에 파일을 추가하고 커밋합니다.


Priyanshu Chauhan

간단한 솔루션 솔루션 작동 : HEAD 커밋이 원격 커밋과 동기화된 경우.

  • 로컬 작업 공간에 하나 이상의 분기를 만들고 원격 분기와 동기화 상태를 유지합니다.
  • 새로 생성된 분기에 대해 수행된 분기(git commit --amend)에서 HEAD 커밋을 체리 선택합니다.

체리 선택 커밋에는 이전 변경 사항이 아닌 최신 변경 사항만 포함됩니다. 이제 이 커밋의 이름을 바꿀 수 있습니다.


Vasudeva H

출처 : http:www.stackoverflow.com/questions/1459150/how-to-undo-git-commit-amend-done-instead-of-git-commit

반응형