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 push
Git은 정중하게 나에게 털어놓습니다.
$ 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 사용자의 경우 다음과 같은 이점이 있었습니다.
- 변경하려는 분기 보호 규칙에서 강제 푸시 허용이 활성화되었는지 확인합니다.
git reset --hard <full_hash_of_commit_to_reset_to>
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
'source' 카테고리의 다른 글
GitLab 원격: HTTP Basic:액세스 거부 및 치명적인 인증 (0) | 2023.05.12 |
---|---|
Git에서 두 커밋 간에 변경된 줄 수를 계산하려면 어떻게 해야 합니까? (0) | 2023.05.12 |
WPF의 진행률 표시줄에 있는 텍스트 (0) | 2023.05.12 |
stackOverflow의 입력 태그와 같은 jQuery 자동 완성 태그 플러그인? (0) | 2023.05.12 |
Bash에서 파일 경로를 어떻게 정규화합니까? (0) | 2023.05.12 |