힘내, 원산지 / 마스터를 커밋으로 재설정하는 방법?


245

이 명령으로 로컬 마스터를 커밋으로 재설정했습니다.

git reset --hard e3f1e37

$ git status명령을 입력 하면 터미널이 말합니다.

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

출발지 / 헤더도 재설정하고 싶어서 출발지 / 마스터로 체크 아웃합니다.

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 2aef1de... master problem fixed for master. its okay now.

이 명령으로 헤더를 재설정하십시오.

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

그런 다음 내가 성공하지 못했다는 출처 / 헤더에 커밋을 추가하려고했습니다.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

마지막으로 로컬 마스터에게 체크 아웃합니다.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

원산지 / 마스터 헤드를 재설정했기 때문에 로컬 및 원산지 방향이 동일해야하지만 git은 내 로컬 / 마스터가 7 커밋에 의해 원산지 / 마스터 뒤에 있다고 말합니다.

이 문제를 어떻게 해결할 수 있습니까? 내가 찾고있는 것은 로컬 / 마스터 및 원산지 / 마스터 책임자가 동일한 커밋을 가리킨다는 것입니다. 다음 이미지는 내가 한 일을 보여줍니다. 감사.

여기에 이미지 설명을 입력하십시오


우선, 프로젝트의 보호 된 브랜치에 푸시 코드를 적용 할 수 있는지 확인하십시오. 그렇지 않으면 할 수 없습니다 ...
DarmVillegas

답변:


563

origin/xxx분기는 항상 리모컨을 가리 킵니다. 로컬 저장소를 가리키는 포인터가 아니기 때문에 체크 아웃 할 수 없습니다 (커밋 만 체크 아웃하십시오. 명령 행 인터페이스 분기 마커에 작성된 이름이 표시되지 않고 커밋 해시 만 표시됩니다).

리모컨을 업데이트하기 위해해야 ​​할 일은 로컬 변경 사항을 마스터로 강제 푸시하는 것입니다.

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
그것은 요청 된 작업을 수행하지만 이미 커밋을 마스터 한 사람들을 불행하게 만들 것입니다.
mnagel

나는이 단계를 따르고 롤백했다. 그러나 원점 / HEAD는 이제 마스터 이외의 지점을 가리키고 있습니다. 이 문제를 해결하려면 어떻게해야합니까?
Daniil Shevelev

1
당신은 단순히 원산지 / 심판에 좋은 심판 밀어 원산지 / 머리에 대해 신경 안
사이먼 Boudrias

합의는 오늘 실수로 잘못된 가지를 병합 한 다음 원점으로 밀고 나서야했습니다. 잘 작동하지만 다른 사람들이 영향을받는 지점을 원산지에서 확인하면 매우 파괴적 일 수 있습니다 . 주의해서 사용하십시오.
Nick W.

1
작동하지 않습니다. remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

여기에 있는 솔루션 은 이미 푸시 된 이전 커밋으로 마스터를 업데이트하는 데 도움이되었습니다.

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

허용되는 답변과의 주요 차이점은 push 명령에서 마스터 전에 커밋 해시 "e3f1e37 :"입니다.


1
작동하지 않습니다 :remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

@ m0skit0 메시지가 말한대로 you should pull first:)
직관적

이에 대한 대답은 stackoverflow.com/a/10544328/1019307에 있습니다 . git config receive.denynonfastforwards false그러나 실제로 /opt/git여기 아이디어를 가지고 만들기 위해 만든 로컬 자식 저장소에 수동으로 설정했습니다 . 비트 버킷, github 등에서이 작업을 수행 할 수 있는지 여부는 확실하지 않습니다. @ intuitivepixel은 하드 리셋으로 달성하려고했던 것을 뒤집을 때 의미가 없습니다.
행카

안녕하세요 @jkovacs, 마스터의 새로운 변경 사항을 제거하고 싶지 않습니다. 커밋 해시 "e3f1e37"을 원래 마스터로 푸시하고 싶습니다. 두 번째 명령 git reset --hard "e3f1e37"을 건너 뛰어도 가능합니까?
KarenAnne

안녕하세요 @jkovacs, 방금 2 단계를 건너 뛸 수 있음을 확인했습니다. :)
KarenAnne

2

브랜치를 master여기와 원격으로 모두 호출 하고 리모트를 호출한다고 가정하면 origin다음을 수행 할 수 있습니다.

git reset --hard <commit-hash>
git push -f origin master

그러나 다른 사람이 원격 저장소를 작업 중이고 변경 사항을 가져온 경우이 작업을 수행하지 마십시오. 이 경우 원하지 않는 커밋을 되 돌린 다음 정상적으로 푸시하는 것이 좋습니다.


1

비슷한 상황이 있었기 때문에 내 상황과 이러한 답변이 어떻게 도움이 되었습니까 (모든 사람에게 감사함).

그래서 나는 메인 브랜치에서 진행 상황을 저장하고 싶을 때마다 마지막 커밋을 수정하여 로컬로 일하기로 결정했습니다.

어느 늦은 밤, 하드웨어 고장이나 이더의 무언가에 대한 나의 진보를 잃어버린 것에 대한 편집증에 대한 두려움 속에서, 나는 주인을 원점으로하기로 결정했다. 나중에 나는 내 로컬 마스터 지점을 개정 보관하고 나는 다시 밀어 그것의 시간을 결정했을 때, 나는 다른 마스터 가지에 직면하고 있었고, 난 원산지 / 업스트림 (수정 할 수없는 발견 대만족을! 나는 지역 개발 가지를 할 수있는 것처럼).

이미 커밋을 마친 후에 로컬에서 마스터를 체크 아웃하지 않았습니다. 주인은 변하지 않았다. 심지어 재설정 할 필요조차 없었습니다. 현재 커밋이 정상이었습니다.

이 경우 HEAD가있는 것이기 때문에 마스터에 강제로 커밋하려는 커밋을 지정하지 않고도 원점으로 강제로 밀었습니다. git diff master..origin/master차이점이 없었는지 확인 했습니다. 모두 고정되었습니다. 감사! (나는 알고있다, 나는 자식 초보자이다, 용서해주세요!).

따라서 로컬에서 마스터 브랜치에 대해 이미 괜찮다면 다음을 수행하십시오.

git push --force origin master
git diff master..origin/master
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.