특정 커밋으로 원격 재설정 나는 몇

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해야하는 체크 박스 가 있습니다.


답변

로컬 변경 내용을 잃어 버릴 염려가 없으면 다른 답변을 사용하십시오. 되돌아 갈 잘못된 커밋 해시를 선택하면이 방법으로 여전히 원격 장치가 손상 될 수 있습니다.

원격 저장소를 로컬 리포지토리의 어느 곳에서나 커밋하려면 다음을 수행하십시오.

  1. 마십시오 하지 어떤 재설정을한다.
  2. git log리모컨에 원하는 커밋을 찾는 데 사용하십시오 . git log -p변경 사항을 보거나 git log --graph --all --oneline --decorate콤팩트 한 트리를 봅니다.
  3. 커밋의 해시 또는 태그 또는 해당 분기의 이름 (팁인 경우)을 복사하십시오.
  4. 다음과 같은 명령을 실행하십시오.

    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을 만들면 모든 것이 잘 작동합니다!