itsource

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

mycopycode 2023. 5. 7. 11:24
반응형

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

제가 실수로 이전 약속을 수정했습니다.특정 파일에 대한 변경 내역을 보관하려면 커밋이 별도로 설정되어 있어야 합니다.

마지막 약속을 취소할 방법이 있습니까?만약에 제가 이런 걸 하면요.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.)
# The -C option takes the given commit and reuses the log message and
# authorship information.
git commit -C HEAD@{1}

ref-log를 사용합니다.

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

그러면 이전에 수정된 모든 변경 사항을 작업 복사본에만 저장하고 다시 커밋할 수 있습니다.

다음과 같이 입력합니다.git reflog

다음을 사용하여 답변하지 않습니다.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 --reflog

참고: 추가할 수 있습니다.--patch명확한 확인을 위해 커밋의 본문을 확인합니다.과 동일git reflog.

그런 다음 다음 문제가 발생한 시점에서 HEAD를 이전 커밋으로 재설정합니다.

git reset SHA1 --hard

참고: SHA1을 실제 커밋 해시로 대체합니다.또한 이 명령은 커밋되지 않은 변경사항을 손실하므로 이전에 저장할 수 있습니다.또는 최신 변경사항을 유지한 후 커밋하려면 를 대신 사용합니다.

그런 다음 필요한 다른 커밋을 선택합니다.

git cherry-pick SHA1

커밋을 원격으로 푸시한 다음 해당 커밋의 변경 내용을 잘못 수정한 경우 문제가 해결됩니다.를 발행합니다.git log(이것이름이 (원격 이름이 오리진이라고 가정함).이제 해당 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지휘권

매뉴얼에서 커밋을 언제든지 분할할 수 있습니다.

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

사용할 수 있음git reflog수정 전과 수정 후 두 번의 커밋을 받는 것.

사용할 경우git diff before_commit_id after_commit_id > d.diff수정 전과 수정 후 사이에 차이가 나는 것.

다음 용도git checkout before_commit_id약속하기 전으로 되돌아가다

그리고 마지막 사용git apply d.diff당신이 한 진짜 변화를 적용하는 것.

그것으로 제 문제가 해결됩니다.

아래에서 실행 취소할 수 있습니다.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>지점으로 이동합니다.

거의 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

다 했어요.

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

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

  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. 새 커밋에 파일을 추가하고 커밋합니다.

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

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

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

언급URL : https://stackoverflow.com/questions/1459150/how-to-undo-git-commit-amend-done-instead-of-git-commit

반응형