2012-10-09 2 views
1

몇 달 전에 추가 된 기능에 회귀가있었습니다. 이 기능은 세 가지 커밋으로 소개되었습니다. 내가 원하는 기능을 복원하기 위해 git cherry-pick은 커밋이 git describe으로 표시된 생산에 병합되기 전에 만들어진 마지막 태그 (release-0.6.0)에서 생성 된 분기 (rel060)에 세 개의 커밋을 넣었습니다.Git cherry-pick은 커밋되지 않은 blob을 만듭니다?

이 작업의 결과를 현재 제작 헤드의 파일 내용과 비교하고 싶습니다. 이 생산 cron_lp에서 탭 자동 완성 _...를 시도, 가치가 무엇인지에 대한

git co -b rel060 release-0.6.0 
git cherry-pick ead47f2 
    [rel060 f28fed4] Corrects non-display of subtabs. (SITE-657) 
    1 files changed, 5 insertions(+), 8 deletions(-) 
git cherry-pick b22c4d4 
    [rel060 b0014f1] Correct subtab bug in Firefox/IE. (SITE-657) 
    1 files changed, 18 insertions(+), 24 deletions(-) 
git cherry-pick ae5a321 
    [rel060 5b41410] Corrects bug with subtab line collapse. (SITE-657) 
    1 files changed, 5 insertions(+), 1 deletions(-) 
git diff rel060:./cron_lp_functions.php..production:./cron_db_lpgenerate.php 
    error: Object 2ce3dd45e32e1bef6da0b22a9ee7208c63e203d2 is a blob, not a commit 
    error: Object f41574b41b82aba51876b5f7aba0d3ff9c6677c5 is a blob, not a commit 
    fatal: Invalid revision range rel060:./cron_lp_functions.php..production:./cron_db_lpgenerate.php 

: Not a valid object name rel060:.

functions 파일 내용이었다 나중에 lpgenerate에 압연 파일입니다.

자, 내가하고 싶은 일을하는 100 만 가지의 쉬운 대안이 있다는 것을 알았습니다. (3 가지 커밋을 하나의 diff로 보았을 때, 해당 라인의 현재 상태로 기능을 릴리스하는 태그를보십시오).

제가 알고 싶은 것은 이것입니다 : 왜 특정한 오류가 발생 했습니까? 그것이 밝혀지면서, 체리 피킹은 그 문제에 아무런 관련이없는 것처럼 보인다. 태그에서 분기를 작성한 후 diff를 시도하면 동일한 오류가 발생합니다. git에서 근본적인 것을 놓친 적이 있습니까? 릴리즈에서 브랜치를 생성하는 것은 무해한 것처럼 보입니다 ... 내가 가지고 있지 않은 무해한 잡동사니가 있습니까?

+0

'자식 레브 - 구문 분석 말 0.6.0'-해제 (도 rel060'과''에 대한 생산')? 'git co'은 무엇입니까 ('git checkout'의 별칭이라고 생각 합니다만, 확인할 가치가 있습니다)? 거의 어떻게 든 커밋 대신 블롭을 가리키는 태그/브랜치를 만든 것처럼 보입니다.하지만 이것은 분명히 드문 것입니다 ... – twalberg

+0

'''git rev-parse release-0.6.0 533ccfa0660697c6e60fde24f1d4a631d35055cc''' '''git REV-구문 분석 생산 5baacdbafb5e5fefa7d915f384e81f9152b7dcef''' '''자식 레브 - 구문 분석 rel060 34dbae8565c445834ab4bca7cbad490828f26077''' 예, 자식 checkout''''''에 대한 별칭 실제 커밋에 대한 모든 해결 때'''자식 show' '' – kayaker243

+1

'git diff rel060 : ./ cron_lp_functions.php production : ./ cron_db_lpgenerate.php' (두 객체 사이에'..'가 없슴)을 시도해보십시오. – twalberg

답변

1

git diff <commit>..<commit>은 이전 버전과의 호환성을 유지하기 위해서만 존재하며 구문 상 '잘못된'이유입니다.

자식은 diff A..B는 "처음에 말을 비논리적 인 일이다. 단지 역사적 사고로 작업 할 일이, 그가 "수행은 처음부터 지금처럼 작동하는 을 사용 이전 버전과의 호환성 "이유를 아프게하지, 우리는. 일

그것을 유지했다하지만 당신은 새로운 사용자로 학습 자식.

도트 표기법 범위에 관한 것입니다 때 당신의 정신을 유지하기 위해 unlearning 더 낫다. A..B는 집합에 대해 말하며 ancesto입니다. B의 rs하지만 A의 조상은 아닙니다.

$ git log A..B 

은 이러한 범위를 나타내는 데 완벽합니다.

하지만 "diff"는 "두 종점 비교"입니다. 그러한 비교에 대해서는 "범위"가 없습니다. A 과 B에서 상태를 비교할 때 중간에 어떤 것도 보지 못합니다. 즉 정식 방법은

$ git diff A B 

하지

$ git diff A..B ;# WRONG. DO NOT DO THIS. 

그리고라고하는 이유는 다음에 기록 된 트리 에에서 엔티티의 이름을하는 방법입니다. 일반적으로이 구문으로 서브 디렉토리를 나타내는 트리 이 아닌 blob의 이름을 지정합니다.

지금, B1 ..B2는 B1과 B2가 블롭 (또는 커밋 -ish가 아닌)이라면 범위로도 의미가 없으며 은 구문 수준에서 오류로 감지됩니다 (즉, 시작하기조차하지 않음). "비교").

$ git diff HEAD:Makefile..HEAD~4:Makefile ;# WRONG. DO NOT DO THIS. 

두 개의 모양을 비교하려는 경우, 당신은 정식 "두 가지를 비교"구문을 사용하여 수행 할 수 있습니다. 를 통해 Junio ​​C. 하마노에서

$ git diff HEAD:Makefile HEAD~4:Makefile 

대답, [email protected]

무엇
관련 문제