2011-04-06 7 views
3

그래서 저는 우리 파일 중 하나에 패치를 작성하고 있었으며 거기에 없어야하는 코드를 보았습니다. (이 불법 코드로 인해 웹 페이지에 오류가 발생했습니다.) 코드는 몇 달 전에 패치에 추가 된 다음 약 1 개월 전에 커밋을 취소하여 삭제되었습니다. 그래서 정말로 거기에 있지 않아야합니다.git : 삭제 된 코드가 신비하게 다시 나타났습니다

  1. 자식 비난 : 그것은 어디에서 온

    내가 추적하는 몇 가지 방법을 시도 이상하게 나를 되돌리기는 결코 일어나지 않았다 것처럼 즉, 코드를 추가 투입 원래의 태그와 커밋 메시지를 보여 주었다 .
  2. git log - filename : 되돌리기를 포함하여 거기에있을 것으로 예상되는 모든 커밋을 표시했지만 다시 나타나야한다고 제안한 후에는 아무 것도 표시하지 않습니다.
  3. 수동 검사 패치 (bisect) : 되돌리기 직후 커밋에 코드가 다시 나타 났지만 패치를 체크 아웃하면 로그가 완전히 다르고 되돌리기 기능이 없습니다.

이 마지막 관찰은 문제의 패치가 병합 된 병합 이었지만 커밋 메시지에는 병합에 대한 언급이 없으며 우리 팀은 보통 git이 생성하는 병합 메시지를 유지한다고 결론 내릴 수 있습니다.

그렇다면 어떻게 될까요? 충돌 해결 중에 잘못된 선택을함으로써 코드가 다시 도입 되었습니까? 그렇다면, 이런 종류의 것을 찾는 더 빠른 방법이 있습니까? 예를 들어, git의 비난은 코드가 원래 패치에서 나온 것이라고 말했습니다. 하지만 패치 X에서 되돌리기가 시작되었다고 직접 알려주는 방법이 있습니까? git은 병합 중에 영향을 받는지 여부를 모르는 경우 각 코드 부분의 위치를 ​​어떻게 추적합니까? 병합 충돌시 누군가가 코드 조각을 엉망으로 만들었다 고 말할 수 있습니까? 병합 자체가 비난에 나타나야한다고 생각했습니다.

+0

커밋과 되돌리기 사이에 한 달이 있다면, 커밋 범위에서 분기했지만 분기 된 분기 수는 몇 개입니까? 되 돌린 후에? 'git log --merges .. '와 같은 것을 시도해보십시오. 또한 병합 직후에 커밋이 병합 커밋을 가리킨 것입니까? –

답변

4

이것은

Git merge, then revert, then revert the revert

의미의 최종 경우 다음과 같습니다 당신은 정말, 병합 같은 커밋 을 되돌릴 수 없습니다해야한다. 대신 '리셋 - 그전의 지점까지'합니다. 다른 저레벨 기술도 적용되지만, 빨리 감기가 불가능한 경우 (비공식적으로 이전 커밋으로 재설정하면 나중에 새로운 작업을 푸시 할 때 '강제'푸시로 이어질 수 있음) 절대적으로 볼 수없는 경우에도 해당 옵션을 살펴 보는 것이 좋습니다.

되돌리기는 무엇입니까? 내용은입니다. 그러나 원래 병합 커밋은 여전히 ​​병합 원본을 부모 커밋으로 표시합니다. 이것은 콘텐츠가 되돌려 졌음에도 불구하고 원격 브랜치가 완전히 병합되었다고 생각하는 것을 망설이게합니다 (!). 모든 가능한 불쾌한 결과.

git show-branch mybranch previouslymergedbranch` 

git log --no-walk $(git merge-base -a mybranch previouslymergedbranch) 

당신의 관계 (들)을 보여주는 계몽해야한다


@Tesserex 확인는 ..., 나는 말했다 여전히 :)

"처럼 보인다" 확률 적으로는 git [1]의 놀라운, 그러나 필연적 인 불완전한 병합 추적 (기본 탐지)에 물린 것입니다. 아마도 show-branch 및 merge-base 의 출력을에 병합 한 시간을 검토 할 수 있습니다.이번이 마지막 병합 된 경우

git rev-list --merges --parents -1 mybranch 

이 세 가지 SHA1 년대를 반환해야 할 수 있습니다 <mergecommit> <mergetarget> <mergesource>를. 여기서 mergecommit은 단순히 병합이 발생했을 때, mergetarget은 'mybranch'이고 mergesource는 'earliermerbranch'이므로 위 명령을 실행할 수 있습니다.

탄력 커밋 (당신이 복귀 있음) 여전히 (자식)에 따라 병합을 계류 등이 모든 것을 통합 한 바와 같이, 당신의 '되돌리기'를 취소 ...이가 일어날 수있는 실행 취소 가능성이 있습니다 다양한 이유 (예 : 원래의 커밋이 수동으로 전송되거나 체리 피킹이 충돌하여 병합이 병합 대상에 이미 적용되었음을 감지 할 수 없음)

잘 모르겠습니다. git이 병합 중간에 커밋되지 않은 ('순수한') cherrypick을 적극적으로 감지하는지 여부. 그것은 확실히 할 수 있지만 :

git log --left-right --oneline --cherry-pick --graph --boundary mergetarget...mergesource 

이것은의 델타로 보는 것을 자식을 보여줍니다 병합시의 두 심판 사이에 '커밋'. git-log에 대한 man 페이지는 -cherry-pick이 다른 커밋 ID (해시)가 이지만 인 경우에도 출력에서 ​​커밋을 제거하도록 git에 지시합니다. 차이점은 모든 의도와 목적에 대해 동일합니다.


[1] OT :이 수수께끼입니다 : 우리는 똑똑한 소프트웨어를 만들 수 있지만, 한 새는 추상화가 있기 때문에, 문제가있을 것입니다 :

  • 병합 추적이 자식에 밀폐되지 않은
  • 패치 세트에서 git이 병합되어 커밋을 재생하지만 모든 데이터가 스냅 샷에만 저장됩니다. 병합 커밋을 되돌릴 때이 표면. 또는 때 using grafts to 'fake' historical relations

엄지 손가락의 규칙은 다음과 같이 보입니다. 가장 세련된 도구는 문제를 줄입니다. 그러나 abtraction이 깨지면, 그 똥은 세련된 다양성의 것일뿐입니다 :)

+0

병합을 취소하지 않았습니다. 나는 평범한 패치를 되 돌렸다. 되돌리기 패치가없는 다른 브랜치와 병합 된 * 병합 후 * 병합이있었습니다. – Tesserex

+0

대답 업데이트, 5 분 체크인 – sehe

관련 문제