소개
반복적 인 개발 프로세스의 버전에서는, 나는 오류가 (적어도 좋은 많은 사람들이 여러 가지 그런 경험이 있었다) 때 많은 사람들이 제출 된 것으로 판단된다. 이 경우, 초보 프로그래머가 깜짝 놀란 호랑이를 구동 수, 긴장이 손실이었다. 선임 프로그래머는 버전 롤백 후 자동으로, 반짝이는 이마를 터치 미소됩니다.
롤백의 버전을 위해, 우리는 종종이 사용하는 명령을 :
- 자식 리셋
- 자식 되돌리기
이 두 것을 명령 어떤 차이가 확인합니까? 나중에, 우리는 세부 걱정합니다.
다음과 같이 우리의 시스템은 지금 몇 제출 한 경우 :
상기 C와 D는 날짜가있는 동안 A와 B는 정상으로 제출됩니다. 이제, 우리는 C와 D로 다시 돌아가려면 이 시간까지, HEAD 포인터 D (5lk4er)를 제출합니다. 우리는 자신의 목표를 달성 할 수있는, B의 HEAD 제출 (a0fvf8)로 포인터를 이동해야합니다.
이만큼 이눔 기반의 친구는 자식 reset 명령을 생각할 것이다. 전체 명령은 다음과 같습니다 :
git reset --hard a0fvf8
실행할 명령 후, HEAD 포인터는 다음과 같이 설명, 다음 제출 B로 이동합니다 :
그리고 이번에는 HEAD 포인터 원격 저장소는 D 제출 여전히에 변경되지 않습니다. 그래서, 직접 사용의 자식 푸시 명령, 당신은 원격 저장소에 변경 사항을 푸시 할 수 없습니다. 이 시점에서, 당신은 단지 원격 저장소에 밀어 강제로 -f 옵션을 사용하여 제출 할 수있다 :
git push -f
정보의 제출이 손실됩니다 이후 있도록 이러한 방법으로 HEAD 포인터를 구성하는 대체 코드 명백한 단점은, 다시 이동합니다. 갑자기 미래에 그것을 발견하면, C와 D는 어떤 멋진 아이디어이다, 그러나 이미 역사의 긴 강에서 사라졌다.
또한, (예 : 쑤 리앙의 회사와 같은) 일부 기업 코드, 전술 한 바와 같은 이유를 롤백 사용 자식 리셋 명령을 금지했다. 그래서 우리는 명령을 찾을 수 있습니다, 하나의 코드를 롤백하고, 제출 위반을 유지해야합니다. 이 때, 자식 되돌리기 명령이 유용합니다.
자식은 반은 새 버전의 내용이 버전을 만들 수행하여 역할을 되돌리고 우리는 같은의 대상 버전으로 돌아 퇴각하지만, HEAD 포인터는 새로운 세대 버전이 아닌 대상 버전에 대한 포인터입니다.
위의 예제를 달성하기 위해 명령을 되돌릴 자식을 사용하여, 우리는이 작업을 수행 할 수 있습니다 첫 번째 D를 되돌리려면, 다음 C를 되돌아 (최신 되돌리기가 필요하다면 여러 장의 사진이 롤백이 필요)
git revert 5lk4er
git revert 76sdeb
다음과 같이 D '및 C'설명 : 여기 당신은 두 개의 새로운 제출을 생성합니다 :
제출 된 두가 있습니다 우리가 하나가 다시 한 롤 수, 되돌릴 필요가있다. 그러나 수십이 있다면? 한 대체 확실히 비효율적이고 오류가 발생하기 쉬운. 우리는 다음과 같은 방법 배치 롤백을 사용할 수 있습니다 :
git revert OLDER_COMMIT^..NEWER_COMMIT
이 경우, 오류가 따라야 할 미래도 던져 질 냄비있어서의 C와 D가 남아 제출 및 시간입니다. 또한, 다시 이동이 동작 HEAD 포인터 직접 원격 명령 자식 푸시 창으로 푸시 될 수있다. 그리고이 방법은, 그것은 기업에 의해 권장합니다.
우리가 좀 더 어려운 예는 다른을 제공합니다.
세 가지 제출,하지만 매우 유감스럽게도이있는 경우, 그 중간에 제출 단지 잘못된 것입니다. 다음과 같이 설명 :
분명 아니므로 C를 제출할 수있는 권리이기 때문에이 경우, 직접 사용의 자식 리셋 명령, A와 헤드 포인터를 재설정, 당신은 유지 될 필요가있다. B와 C는 먼저 때문에 B가 롤백 요구 사항을 커밋 달성하기 위해, C는 새로운 제출 C '를'제출을 다시 생성하는 체리 선택 명령을 사용하여 모든 롤백을 제출 제출하여야한다. 다음과 같이 전체 프로세스는 다음과 같습니다
위의 비교에서 찾을 수 있습니다, 자식 재설정하고 자식은 큰 차이가 자식 재설정 제출의 뒷면을 잃게됩니다한다는 것입니다 복귀하고, 자식은 반하기의 방법에 의해 새로운 제출을 다시 만들 복귀, 원본 제출을 유지합니다. 비즈니스에서 우리는 자식 리셋 명령을 수행하려고 할 수없는 자식 되돌리기 명령을 사용하려고합니다.