commit 후 수행 된 모든 변경 사항을 삭제하고 싶습니다 <commit-hash>
. 그래서 나는했다 :
git reset --hard <commit-hash>
이제 리모컨으로도 똑같이하고 싶습니다. 어떻게해야합니까? 나는 몇 가지 커밋 (및 푸시)을 수행 <commit-hash>
했으며 모두 버리고 싶습니다. 뭔가 갔다가 정말 길을 잘못 난 이미보다 더 나쁘게 만들고 싶어하지 않습니다. ; (
나는 기본적으로 내 되감기 할 origin/master
에를<commit-hash>
답변
브랜치를 master
여기와 원격으로 모두 호출 하고 리모트를 호출한다고 가정하면 origin
다음을 수행 할 수 있습니다.
git reset --hard <commit-hash>
git push -f origin master
그러나 다른 사람이 원격 저장소를 작업 중이고 변경 사항을 가져온 경우이 작업을 수행하지 마십시오. 이 경우 원하지 않는 커밋 을 되 돌린 다음 평소대로 푸시하는 것이 좋습니다 .
업데이트 : 당신은 다른 사람들이 당신이 푸시 한 변경 사항을 가져 왔음을 아래에서 설명 했으므로 모든 변경 사항을 되 돌리는 새로운 커밋을 만드는 것이 좋습니다 . Jakub Narębski 의이 답변 에서이 작업을 수행하는 옵션에 대한 좋은 설명이 있습니다 . 가장 편리한 방법은 되돌릴 커밋 수와 가장 적합한 방법에 따라 다릅니다.
귀하의 질문에서 이미 지점 git reset --hard
을 재설정 하는 데 사용 했음이 분명하기 때문에 master
지점 git reset --hard ORIG_HEAD
을 이전 위치로 다시 이동 하는 데 사용해야 할 수도 있습니다 . (와 항상 똑같이, 깨끗하고, 올바른 지점에 git reset --hard
있는지 git status
, git reflog
명백하게 손실 된 커밋을 복구하는 도구로 알고 있는지 확인하십시오.) 또한 ORIG_HEAD
을 사용하여 올바른 커밋 을 가리키는 지 확인해야합니다 git show ORIG_HEAD
.
문제 해결:
” ! [원격 거부 됨] a60f7d85-> 마스터 (수신 수신 거부) ” 와 같은 메시지가 표시되는 경우
그런 다음 특정 지점에 대한 지점 기록 다시 작성을 허용해야합니다. 예를 들어 BitBucket에서는 “분기 기록 다시 쓰기가 허용되지 않습니다”라고 말했습니다. 체크 Allow rewriting branch history
해야하는 체크 박스 가 있습니다.
답변
로컬 변경 내용을 잃어 버릴 염려가 없으면 다른 답변을 사용하십시오. 되돌아 갈 잘못된 커밋 해시를 선택하면이 방법으로 여전히 원격 장치가 손상 될 수 있습니다.
원격 저장소를 로컬 리포지토리의 어느 곳에서나 커밋하려면 다음을 수행하십시오.
- 마십시오 하지 어떤 재설정을한다.
git log
리모컨에 원하는 커밋을 찾는 데 사용하십시오 .git log -p
변경 사항을 보거나git log --graph --all --oneline --decorate
콤팩트 한 트리를 봅니다.- 커밋의 해시 또는 태그 또는 해당 분기의 이름 (팁인 경우)을 복사하십시오.
-
다음과 같은 명령을 실행하십시오.
git push --force <remote> <commit-ish>:<the remote branch>
예 :
git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
또는
git push --force staging v2.4.0b2:releases
git go
2 단계와 같이 기록을 볼 때 편리한 별칭 ( )을 사용 하며, 다음과 같이 추가 할 수 있습니다.
git config --global alias.go 'log --graph --all --decorate --oneline'`
답변
이 명령으로 당신과 같은 문제를 해결했습니다.
git reset --hard <commit-hash>
git push -f <remote> <local branch>:<remote branch>
답변
GitLab에서는 이를 수행하기 전에 브랜치를 보호되지 않은 상태 로 설정해야 할 수도 있습니다 . [repo]> 설정> 리포지토리> 보호 된 분기에서이를 수행 할 수 있습니다. 그런 다음 Mark의 답변 방법이 작동합니다.
git reset --hard <commit-hash>
git push -f origin master
답변
이전 버전의 파일을 원한다면 git checkout을 사용하는 것이 좋습니다.
git checkout <commit-hash>
이렇게하면 시간을 되돌려 보내며 프로젝트의 현재 상태에 영향을 미치지 않습니다. 메인 라인 git checkout mainline에 올 수 있습니다
그러나 인수에 파일을 추가하면 해당 파일이 이전 시간에서 현재 프로젝트 시간으로 다시 가져옵니다. 즉 현재 프로젝트가 변경되어 커밋해야합니다.
git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push
이것의 장점은 기록을 삭제하지 않으며 특정 코드 변경 사항을 되 돌리지 않는다는 것입니다 (git revert)
https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout 여기에서 확인 하십시오
답변
이전 답변에 대한 2 센트 : if
git push --force <remote> <the-hash>:<the remote branch>
여전히 작동하지 않으면 <your-remote-repo>.git/config
파일의 수신 섹션 을 편집 할 수 있습니다 .
[receive]
#denyNonFastforwards = true
denyNonFastforwards = false
답변
브랜치가 개발 또는 프로덕션이 아닌 경우이를 달성하는 가장 쉬운 방법은 로컬로 특정 커밋으로 재설정하고 새 브랜치를 생성하는 것입니다. 당신이 사용할 수있는:
자식 체크 아웃 000000
문제가있는 지점에서 000000은 가고 싶은 커밋 ID입니다.
자식 원격 추가 [name_of_your_remote]
그런 다음 새로운 PR을 만들면 모든 것이 잘 작동합니다!