말하고자 하는 내용이 명확하지 않을 수도 있지만, 코드를 작성하다 보니 더 이상 하고 싶지 않아서 git reset --hard <版本号>
를 사용하여 이전 버전으로 돌아가서 다시 작성했습니다. 글을 쓰다보니 원격창고에 제출하려고 했더니 오류가 뜹니다
제 버전이 이전 버전이라 병합해서 제출해야 한다고 하더군요. 여러 번 시도했는데 이해가 안 되네요.
黄舟2017-06-16 09:21:00
먼저 귀하의 설명에 따르면 git reset --hard
,那就可以推断出你已经 add
和 commit
过了。
其次,根据报错,可以推断出你已经 push
를 사용했기 때문에 (이 추론은 귀하만이 마스터 브랜치의 변경 권한을 가지고 있다는 사실에 근거합니다.
그런 다음 git reset --hard
을 실행하면 기록 기록을 원격 기록과 직접 병합할 수 없습니다. 그렇기 때문에 이런 오류가 발생하는 것입니다.
예를 들어 리모컨은 A -> B -> C -> D
,你 git reset --hard
之后是 A -> B
。这时候除非远程那边抹掉 C
和 D
이고
A -> B
가 옵니다. 이때, 원격측에서 C
와 D
를 지우지 않으면 병합할 수 없습니다.
git push origin master --force
따라서 이때는 를 이용하여 원격녹화를 강제로 덮어써야 합니다.
git pull
。否则,你的本地又会变成 A -> B -> C -> D
。因为 git pull
相当于 git fetch
+ git merge
설명서대로 사용하지 마세요
A -> B -> C -> D
(다음 내용은 위 예시를 바탕으로 한 것이며, 리모콘은
git revert
。其实,git reset --hard
和 git revert
git revert
가 위에서 언급되었습니다. 실제로
git revert
모두 "롤백 코드"를 달성할 수 있습니다. 하지만 차이점은 다음과 같습니다.
git revert
会把你的本地变成 A -> B -> C -> D -> E
。其中,E
干的事儿是删除 C
和 D
。这样做的好处在于,你 git push origin master
就不会有上面的报错了。但,历史线上还是会保留 C
和 D
这两个 commit。如果使用这个命令,记得要 add
然后 commit
git reset --hard
会直接删掉 C
和 D
,形成 A -> B
这样的结果。好处在于更直接更彻底。缺点在于,首先要通过 git push origin master --force
去强行更改。其次,一旦你后悔了,除非根据本地的 reflog
C
및 D
를 직접 삭제하여 A -> B
와 같은 결과를 생성합니다. 장점은 더 직접적이고 철저하다는 것입니다. 단점은 먼저 를 통해 변경을 강제해야 한다는 것입니다. 둘째, 일단 후회하고 나면 로컬 reflog
에 따라 HEAD 포인터를 직접 복원하지 않는 이상 다른 방법이 없습니다.
漂亮男人2017-06-16 09:21:00
일반적으로 이런 상황은 피하도록 노력하세요.
원격 마스터에 대한 권한이 있는 경우 다음을 수행할 수 있습니다.
으아악보다 합리적인 접근 방식은 git revert를 사용하는 것입니다
분할선 편집
또 다른 학생 @S1ngS1ng이 더 자세한 답변을 했지만, 그는 어떤 것이든 사용할 수 있다는 점을 지적했습니다. 여전히 git revert가 더 적절한 접근 방식이라는 점을 다시 강조하고 싶습니다
다인원 개발 시나리오의 경우 원격 마스터의 다른 사람이 최신 코드를 가져왔거나 다른 브랜치에 병합했을 가능성이 높습니다. 이 경우 상대방이 여전히 푸시할 수 있으므로 재설정이 유효하지 않습니다. 커밋
을 삭제하고 싶습니다.그래서 아무거나 사용할 수 있다는 생각에는 실제로 한계가 있습니다