Programing

힘내 재설정-하드 및 원격 저장소

lottogame 2020. 5. 13. 08:00
반응형

힘내 재설정-하드 및 원격 저장소


나는 약간의 커밋이있는 저장소를 가지고있었습니다 (이 예에서는 D, E 및 F).

ABCDEF 마스터 및 원산지 / 마스터

로컬 저장소를 특별히로 수정했습니다 git reset --hard. 재설정 전에 지점을 가져 왔으므로 이제는 다음과 같은 저장소가 있습니다.

A-B-C master  
     \ D-E-F old_master

A-B-C-D-E-F origin/master

이제 나쁜 커밋의 일부가 필요했기 때문에 필요한 비트를 선택하고 새로운 커밋을 만들었으므로 이제 로컬로 다음을 수행했습니다.

A-B-C-G-H master
     \ D-E-F old_master

이제이 상태를 원격 저장소로 푸시하고 싶습니다. 그러나 git pushGit을 정중하게 하려고 하면 솔이 나옵니다.

$ git push origin +master:master --force  
Total 0 (delta 0), reused 0 (delta 0)  
error: denying non-fast forward refs/heads/master (you should pull first)  
To git@git.example.com:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to 'git@git.example.com:myrepo.git'  

원격 저장소를 로컬 저장소의 현재 상태로 가져 오려면 어떻게해야합니까?


강제 푸시가 도움이되지 않는 경우 ( " git push --force origin"또는 " git push --force origin master"이면 충분합니다.) 원격 서버가 receive.denyNonFastForwards 구성 변수 ( 설명 git config 맨 페이지 참조) 를 통해 비 빨리 감기 푸시를 거부하고 있음을 의미 할 수 있습니다 . 또는 업데이트 / 사전 수신 후크를 통해.

이전 Git을 사용하면 " git push origin :master"(분기 이름 앞의 ':'참조) 를 삭제 한 다음 git push origin master지정된 분기 " " 를 다시 작성 하여 해당 제한 사항을 해결할 수 있습니다 .

이것을 변경할 수 없다면, 유일한 해결책은 기록을 다시 쓰는 대신 DEF에서 커밋 되돌리기 변경 사항만드는 것입니다 .

ABCDEF-[(DEF) ^-1] 마스터

ABCDEF 원산지 / 마스터

Jakub의 답변을 보완하기 위해 ssh에서 원격 git 서버에 액세스 할 수 있다면 git remote 디렉토리로 이동하여 다음을 설정할 수 있습니다.

user@remote$ git config receive.denyNonFastforwards false

그런 다음 로컬 리포지토리로 돌아가서 다시 커밋을 수행하십시오 --force.

user@local$ git push origin +master:master --force

마지막으로 서버 설정을 원래 보호 상태로 되돌립니다.

user@remote$ git config receive.denyNonFastforwards true

"마스터"브랜치를 수정하는 대신 브랜치의 이름을 바꾸어 "원하는 마스터"와 쉽게 교환 할 수 있습니다. https://stackoverflow.com/a/2862606/2321594를 참조 하십시오 . 이렇게하면 여러 되돌리기 로그를 남기지 않아도됩니다.


전체 자식 재설정 사업은 나를 복잡하게 만들었습니다.

그래서 몇 줄 전에 커밋 한 상태에서 src 폴더를 얻기 위해 선을 따라 무언가를했습니다.

# reset the local state
git reset <somecommit> --hard 
# copy the relevant part e.g. src (exclude is only needed if you specify .)
tar cvfz /tmp/current.tgz --exclude .git  src
# get the current state of git
git pull
# remove what you don't like anymore
rm -rf src
# restore from the tar file
tar xvfz /tmp/current.tgz
# commit everything back to git
git commit -a
# now you can properly push
git push

이런 식으로 src의 업무 상태는 tar 파일로 유지되며 git은 너무 많은 방해 없이이 상태를 수락해야합니다. 기본적으로 src 디렉토리는 여러 커밋 이전 상태로 바뀝니다.

참고 URL : https://stackoverflow.com/questions/1377845/git-reset-hard-and-a-remote-repository

반응형