실수로 이전 커밋을 수정했습니다. 특정 파일에 대한 변경 기록을 유지하려면 커밋을 분리해야 합니다.
마지막 커밋을 취소하는 방법이 있습니까? git reset --hard HEAD^
와 같은 작업을 수행하면 첫 번째 커밋도 취소됩니다.
(아직 원격 디렉토리로 푸시하지 않았습니다)
질문자 :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}
git branch fixing-things HEAD@{1} git reset fixing-things
그러면 이전에 수정한 모든 변경 사항이 작업 복사본에만 있어야 하며 다시 커밋할 수 있습니다.
이전 인덱스의 전체 목록을 보려면 git reflog
다음을 통해 수정된 커밋을 찾습니다.
git log --reflog
참고: 명확성을 위해 커밋 본문을 보려면 --patch
를 추가할 수 있습니다. git reflog
와 동일합니다.
그런 다음 HEAD를 다음과 같이 괜찮았던 시점의 이전 커밋으로 재설정합니다.
git reset SHA1 --hard
참고 : 실제 커밋 해시 SHA1를 교체합니다. 또한 이 명령은 커밋되지 않은 변경 사항을 잃게 되므로 이전에 숨길 수 있습니다. 또는 --soft
대신 사용하여 최신 변경 사항을 유지 한 다음 커밋합니다.
그런 다음 그 위에 필요한 다른 커밋을 선택하십시오.
git cherry-pick SHA1
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 커밋과 병합한 모든 변경 사항이 포함됩니다.
커밋을 원격으로 푸시한 다음 해당 커밋에 대한 변경 사항을 잘못 수정하면 문제가 해결됩니다. 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
항상 커밋을 나눌 수 있습니다. 매뉴얼에서
아직 커밋 메시지가 있는 편집기에 있는 경우 커밋 메시지를 삭제할 수 있으며 git commit --amend
명령이 중단됩니다.
git reflog
를 사용하여 수정 전과 수정 후 두 개의 커밋을 얻을 수 있습니다.
그런 다음 git diff before_commit_id after_commit_id > d.diff
를 사용하여 수정 전과 수정 후의 차이를 확인합니다.
다음으로 커밋하기 전으로 돌아가려면 git checkout before_commit_id
를 사용하십시오.
그리고 마지막으로 git apply d.diff
를 사용하여 실제 변경 사항을 적용합니다.
내 문제를 해결합니다.
git commit —amend
를 실행 취소할 수 있습니다.
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull origin your_branch_name
======================================
이제 변경 사항은 이전과 같습니다. git commit —amend
대한 실행 취소가 완료되었습니다.
이제 git push origin <your_branch_name>
을 수행하여 분기로 푸시할 수 있습니다.
이것에 거의 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
완료.
이렇게 하면 이전 커밋으로 완전히 되돌아갑니다.
(이전에 덮어쓴 분리된 커밋 헤드의 날짜 포함)
마지막 커밋으로 임시 분기로 체크아웃
git branch temp HEAD@{1}
마지막 커밋 재설정
git reset temp
이제 모든 파일에 커밋과 이전 커밋이 있습니다. 모든 파일의 상태를 확인하십시오.
git status
git 단계에서 커밋 파일을 재설정합니다.
git reset myfile1.js
(등)
이 커밋 다시 연결
git commit -C HEAD@{1}
새 커밋에 파일을 추가하고 커밋합니다.
간단한 솔루션 솔루션 작동 : HEAD 커밋이 원격 커밋과 동기화된 경우.
체리 선택 커밋에는 이전 변경 사항이 아닌 최신 변경 사항만 포함됩니다. 이제 이 커밋의 이름을 바꿀 수 있습니다.
출처 : http:www.stackoverflow.com/questions/1459150/how-to-undo-git-commit-amend-done-instead-of-git-commit
Bash 셸 스크립트에서 입력 인수의 존재 확인 (0) | 2022.02.15 |
---|---|
Java에 임시 필드가 있는 이유는 무엇입니까? (0) | 2022.02.15 |
숨김에 대한 Git diff (0) | 2022.02.15 |
가계도 소프트웨어의 주기 (0) | 2022.02.15 |
Mathematica로 Waldo를 어떻게 찾나요? (0) | 2022.02.15 |