source

Git reset -- 원격 리포지토리에 하드 및 푸시

ittop 2023. 5. 12. 22:43
반응형

Git reset -- 원격 리포지토리에 하드 및 푸시

잘못된 커밋이 있는 리포지토리가 있었습니다(이 예에서는 D, E 및 F).

A-B-C-D-E-F 마스터 및 오리진/마스터

로컬리특수정다니습했으로 로컬 했습니다.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'  

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

밀어도이 되지 (억지로밀도않면다는되지도이어움▁(▁if면억▁(다않▁forcing는▁push▁doesn▁a't)git push --force origin또는git push --force origin master함), 즉 가 "fast-forward push" 또는 ""를 push를 할 수 .receive.denyNonFastForwards구성 변수(설명은 git config manpage 참조) 또는 업데이트/사전 설정 후크를 통해 설정할 수 있습니다.

오래된 Git를 사용하면 삭제를 통해 해당 제한 사항을 해결할 수 있습니다.git push origin :master:: name 앞)을 선택한 후 합니다.git push origin master일정한 가지

이를 변경할 수 없는 경우 D-E-F에서 변경 내용을 되돌리는 커밋만들기 위해 기록을 다시 쓰는 대신 유일한 해결책이 됩니다.

A-B-C-D-E-F-[(D-E-F)^-1]   master

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

GitHub 사용자의 경우 다음과 같은 이점이 있었습니다.

  1. 변경하려는 분기 보호 규칙에서 강제 푸시 허용이 활성화되었는지 확인합니다.
  2. git reset --hard <full_hash_of_commit_to_reset_to>
  3. git push --force

이렇게 하면 로컬 컴퓨터와 GitHub 서버의 분기 기록이 "수정"되지만 잘못된 커밋 이후 이 분기를 서버와 동기화한 사용자는 로컬 컴퓨터에 기록이 있습니다.분기에 직접 푸시할 수 있는 권한이 있는 경우 이러한 커밋은 동기화할 때 바로 백업으로 표시됩니다.

다른 모든 사람들이 해야 할 일은git reset위에서 명령을 내려 로컬 컴퓨터에서 분기를 "수정"합니다.물론 대상 해시 후 이 지점에 대한 로컬 커밋을 주의해야 합니다.선택/백업 후 필요에 따라 다시 적용합니다. 그러나 보호된 분기에 있는 경우 직접 커밋할 수 있는 사용자 수가 제한될 수 있습니다.

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

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 을 참조하십시오.이렇게 하면 여러 개의 되돌림 로그의 흔적도 남기지 않습니다.

Git reset 사업 전체가 제게는 복잡하기는 커 보이지 않았습니다.

그래서 저는 몇 번 전에 커밋한 상태에서 제 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-push-to-remote-repository

반응형