실수로 이전 커밋을 수정했습니다. 커밋은 특정 파일에 대한 변경 기록을 유지하기 위해 분리되어 있어야합니다.
마지막 커밋을 취소하는 방법이 있습니까? 내가 같은 것을 git reset --hard HEAD^
하면 첫 번째 커밋도 취소됩니다.
(아직 원격 디렉토리로 푸시하지 않았습니다)
실수로 이전 커밋을 수정했습니다. 커밋은 특정 파일에 대한 변경 기록을 유지하기 위해 분리되어 있어야합니다.
마지막 커밋을 취소하는 방법이 있습니까? 내가 같은 것을 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 commit --amend
. 두 번째는 새로운 커밋에 대한 "재실행"입니다. 이것들은 git commit
단지 어떤 것이 든 작동 하지 않습니다 --amend
.
git commit
.
git reset --soft HEAD@{1}
: fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
. 내가 대체하는 경우 HEAD@{1}
에 표시된 해당 커밋 해시 git reflog
(감사 JJD!),이 대답은 놀라 울 정도 일했다!
HEAD@{1}
. echo HEAD@{1}
예를 들어 tcsh에서 실행 하면 출력은 HEAD@1
중괄호가 tcsh에 의해 해석 되었기 때문입니다. 작은 따옴표를 사용하면 중괄호가 유지됩니다.
ref-log를 사용하십시오 :
git branch fixing-things HEAD@{1}
git reset fixing-things
그런 다음 이전에 수정 한 모든 변경 사항을 작업 사본에만 적용해야하며 다시 커밋 할 수 있습니다.
이전 지수 유형의 전체 목록을 보려면 git reflog
HEAD@{1}
와 사이에 차이점이 HEAD~1
있습니까?
HEAD~1
정확히 동일 HEAD^
하고 식별자 입니다. 반면에 HEAD가이 커밋 전에 지적한 커밋을 말합니다. 즉, 다른 브랜치를 체크 아웃하거나 커밋을 수정할 때 다른 커밋을 의미합니다. HEAD@{1}
git reset HEAD@{1}
.
다음과 같이 수정 된 커밋을 찾으십시오.
git log --reflog
참고 : --patch
명확성을 위해 커밋 본문을 보려면 추가 할 수 있습니다 . 와 동일합니다 git reflog
.
그런 다음 HEAD를 이전 커밋으로 재설정하십시오.
git reset SHA1 --hard
참고 : 교체 실제 커밋 해시 SHA1을. 또한이 명령은 커밋되지 않은 변경 내용 을 잃어 버리므로 미리 변경하지 않아도 됩니다 . 또한, 사용 --soft
의 최신 변경 사항을 유지하는 대신 다음을 커밋합니다.
그런 다음 필요한 다른 커밋을 체리 선택하십시오.
git cherry-pick SHA1
git reset SHA1 --soft
하면 최신 변경 사항을 유지 한 다음 커밋 할 수 있습니다.
매뉴얼 에서 언제든지 커밋을 분할 할 수 있습니다
git reflog
당신이 필요한 전부
git reset
대신 git reset --soft
다음 수행합니다 git add --patch
.
커밋을 원격으로 푸시 한 다음 해당 커밋의 변경 사항을 잘못 수정하면 문제가 해결됩니다. git log
커밋 전에 SHA를 찾으려면 a 를 발행하십시오 . (이것은 remote의 이름이 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
거의 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
끝난.
이전 커밋으로 되돌아갑니다.
(이전에 덮어 쓴 분리 커밋 헤드의 날짜 포함)
--soft
변경 사항을 유지하기 위해 재설정 하고 싶습니다. 난 그냥 개별적으로 최선을 다하고 싶어
git reflog
올바른 숫자를 찾기 위해 두 번째 마지막 수정보기로 그것을했다{2}
.