답변:
--no-commit
( -n
) 옵션을 사용 git revert
하여을 변경 한 다음 단계를 취소하고 다음을 사용하십시오 git add --patch
.
$ git revert -n $bad_commit # Revert the commit, but don't commit the changes
$ git reset HEAD . # Unstage the changes
$ git add --patch . # Add whatever changes you want
$ git commit # Commit those changes
참고 : git add --patch를 사용하여 추가 한 파일은 유지하려는 파일이 아니라 되돌리려는 파일입니다.
git reset --hard
것이 좋습니다.
git reset --hard
원하는 편집 내용을 잃을 수 있으므로 초보자에게는 위험합니다. 대신에 익숙해 git status
이 힌트, git checkout -- FILE..
보다 안전하게 되돌리기 것들.
git
; git revert
그냥 --patch
논쟁을 해야합니다 .
git revert
전체 커밋을 되 돌리는 데 사용됩니다. git checkout -p
되돌릴 비트를 대화식으로 선택 하는 데 사용할 수 있습니다 .
commit
첫째, 또는 stash
다음보십시오 revert
.
나는 다음을 성공적으로 사용했다.
먼저 전체 커밋을 되돌리고 (인덱스에 넣음) 커밋하지 마십시오.
git revert -n <sha1> # -n is short for --no-commit
그런 다음 색인에서 되 돌린 GOOD 변경 사항을 대화식으로 제거하십시오.
git reset -p # -p is short for --patch
그런 다음 나쁜 변경 사항을 역으로 비교하십시오.
git commit -m "Partially revert <sha1>..."
마지막으로 되 돌린 GOOD 변경 사항 (재설정 명령으로 준비되지 않은 변경 사항)은 여전히 작업 트리에 있습니다. 그들은 청소해야합니다. 작업 트리에 커밋되지 않은 다른 변경 사항이없는 경우 다음을 수행 할 수 있습니다.
git reset --hard
reset HEAD .
작업 디렉토리의 최종 정리가 필요하지 않기 때문에 허용되는 답변 (을 사용하는 )에 대한 탁월한 대안이 아닙니까?
reset -p
나오는 것보다 짧기 때문에 우수 reset HEAD
합니다 add -p
. 그러나 재설정 된 "양호한"덩어리는 여전히 커밋 후에 작업 디렉토리에 있기 때문에 여전히 정리가 필요합니다.
개인적으로, 나는 자동 생성 된 커밋 메시지를 재사용하고 최종 커밋하기 전에 "부분적으로"라는 단어를 편집하고 붙일 수있는 기회를 제공하는이 버전을 선호합니다.
# generate a revert commit
# note the hash printed to console on success
git revert --no-edit <hash to revert>
# undo that commit, but not its changes to the working tree
# (reset index to commit-before-last; that is, one graph entry up from HEAD)
git reset HEAD~1
# interactively add reversions
git add -p
# commit with pre-filled message
git commit -c <hash from revert commit, printed to console after first command>
# reset the rest of the current directory's working tree to match git
# this will reapply the excluded parts of the reversion to the working tree
# you may need to change the paths to be checked out
# be careful not to accidentally overwrite unsaved work
git checkout -- .
해결책:
git revert --no-commit <commit hash>
git reset -p # every time choose 'y' if you want keep the change, otherwise choose 'n'
git commit -m "Revert ..."
git checkout -- . # Don't forget to use it.
또 다른 대안은 (현재 버전의 파일이 되돌리려는 버전과 너무 멀지 않은 경우) 부분적으로 되돌릴 (from ) 직전 에 커밋 의 해시를 얻는 것 git log
입니다. 그러면 당신의 명령은 :
$ git checkout -p <hash_preceding_commit_to_revert> -- file/you/want/to/fix.ext
이것은 작업 트리의 파일을 변경하지만 커밋을 생성하지 않으므로 실제로 채워 넣으면 다시 시작할 수 있습니다 git reset --hard -- file/you/want/to/fix.ext
.