내 로컬 사본 이 해당 커밋에서 작성된 변경 사항을 유지 하지만 작업 사본에서 커밋되지 않은 변경 사항이 되도록 커밋을 되 돌리는 방법이 있습니까? 커밋을 롤백하면 이전 커밋으로 이동합니다. 변경 사항을 유지하고 싶지만 잘못된 브랜치에 커밋했습니다.
이것은 밀리지 않았으며 커밋되었습니다.
내 로컬 사본 이 해당 커밋에서 작성된 변경 사항을 유지 하지만 작업 사본에서 커밋되지 않은 변경 사항이 되도록 커밋을 되 돌리는 방법이 있습니까? 커밋을 롤백하면 이전 커밋으로 이동합니다. 변경 사항을 유지하고 싶지만 잘못된 브랜치에 커밋했습니다.
이것은 밀리지 않았으며 커밋되었습니다.
답변:
예를 들어, 여러 가지 방법이 있습니다.
커밋을 아직 공개적으로 푸시 하지 않은 경우 :
git reset HEAD~1 --soft
즉, 커밋 변경 사항이 작업 디렉토리에있는 반면 LAST 커밋은 현재 분기에서 제거됩니다. git reset man 참조
경우에 당신은 한 ( '마스터'라는 분기)에 공개적으로 푸시 :
git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )
커밋을 정상적으로 되돌리고 푸시
git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master
이제 작업 복사본에서 로컬 변경 사항을 적용하면서 변경 사항을 원한다면 ( "로컬 복사본이 해당 커밋에서 변경 사항을 유지하도록") --no-commit
옵션을 사용 하여 되돌리기 커밋을 되 돌리십시오 .
git revert --no-commit 86b48ba (hash of the revert commit).
나는 작은 예를 만들었습니다 : https://github.com/Isantipov/git-revert/commits/master
reset
언급 된 첫 번째 명령은 "부드럽게"헤드 이전에 1 rev로 재설정하여 모든 로컬 변경 사항을 유지하는 것입니다. 이것은 SourceTree에서 사용하기 위해 즉시 나에게 분명하지 않았습니다. 재설정하려는 개정이 아닌 이전 개정으로 소프트 재설정하고 있는지 확인하십시오.
"Already up to date"
. 병합을 수행 할 때 나타납니다.
변경 사항을 적용한 경우 undo
다른 분기를 사용하지 않고 변경 사항을 적용 하고 파일을 다시 스테이지로 이동할 수 있습니다 .
git show HEAD > patch
git revert HEAD
git apply patch
마지막 분기 변경 사항이 포함 된 패치 파일을 만듭니다. 그런 다음 변경 사항을 되돌립니다. 마지막으로 패치 파일을 작업 트리에 적용하십시오.
rm patch
도
사례 : "이것은 푸시되지 않았으며 커밋되었습니다 ." - 당신이 사용하는 경우 인 IntelliJ (또는 다른 JetBrains의 IDE)을하고 아직 변경을 추진하지 않은 당신은 다음에 할 수 있습니다.
끝난.
변경 사항을 "커밋 해제"하고 git 상태를 마지막 로컬 커밋 이전 지점으로 되돌립니다. 변경 한 내용은 손실되지 않습니다.
git reset --soft "HEAD^"
Windows의 btw 와 같습니다 . :)
나와 함께 주로 잘못된 지점으로 변경 사항을 푸시하고 나중에 깨닫게됩니다. 그리고 다음과 같은 대부분의 시간에 작동합니다.
git revert commit-hash
git push
git checkout my-other-branch
git revert revert-commit-hash
git push