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 go2 단계와 같이 기록을 볼 때 편리한 별칭 ( )을 사용 하며, 다음과 같이 추가 할 수 있습니다.
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을 만들면 모든 것이 잘 작동합니다!