2014-04-23 2 views
1

작업이 손실되는 이상한 문제가 발생합니다. 동료가 며칠 전에 원격 지사에 커밋을했습니다. 어제 언젠가 원격 지점이 마스터에 병합되었습니다. 내 동료 중 하나가 저지른 모든 변화가 사라졌습니다. 일반적으로 나는 나쁜 병합이라고 말하고 그의 변화를 덮어 썼다. 그러나 로그에는이를 반영하지 않습니다. 내가 gitk로 로그를 확인하면, 커밋 3a2b22f (동료가 원래 커밋) 목록 아래로 좋은 방법을 볼 수 있지만 문제의 파일에서 gitk를 실행하면 (역사를 확인하기 위해) 커밋 3a2b22f는 볼 수없는 곳입니다. 마치 병합 후에 커밋이 파일 기록에 없어졌습니다.병합 후 자식 커밋이 사라집니다.

질문은 다음과 같습니다

  1. 어떻게 지구에이
  2. 이 어떻게 다시 발생하지 않도록 않습니다 일어 났습니까? 당신이 등, 병합이 일어난 위치를 알아낼 수있는 명령 줄 상응 git log --pretty=oneline --graph --all -- filename.txt이 될 것이다, 그래서
+2

'git log --all - filename.txt' 또는'gitk --all - filename.txt'를 시도하십시오. IIRC는 기본적으로 병합을 통해 첫 번째 부모를 따라갑니다 ... – twalberg

+0

좋습니다. 로그와 함께 표시됩니다. 여전히 변경 사항을 덮어 쓰는 방법을 정확히 알지 못합니다. 어쩌면 그것은 결국 나쁜 합병이었을 것입니다. – CountMurphy

+2

변경 사항이 예를 들어 'HEAD ~ 10'을 저지하십시오. 그러나 HEAD에 있지는 않습니다. 병합이 일어난 곳이 바로 그것 일 가능성이 있습니다. 그러나 이것이 유일한 후보는 아닙니다. 간단한'grep' 기반 검사 (또는'git log --all -p-filename.txt'의 육안 검사)로'git bisect'를 사용하면 변경 사항이 손실/되돌리기/반전/대체 위치를 결정하는 합리적인 방법이됩니다 ... – twalberg

답변

1

당신은 파일의 전체 역사를 볼 수 gitk --all -- filename.txt를 사용할 수 있습니다.

기본적으로 gitkgit log은 작업 할 파일 이름이 주어지면 병합 할 때 첫 번째 부모를 따릅니다. --all 플래그를 지정하면 분기에 커밋이 포함됩니다. gitk--merge 옵션을 가지고 있으며, 물론 git log은 커밋이 표시되는 방식과 디스플레이가 수행되는 방식에 영향을 줄 수있는 추적 옵션이 너무 많습니다.

관련 문제