2014-05-22 2 views
1

누군가가 나쁜 의도로 파일을 변경한다고 말합니다 (놀랍게도 이것은 때로는 발생합니다). 그런 다음 그는 그것을 깨닫고 실수를 되 돌렸다.힘내 : 파일 그룹이 과거의 어떤 파일과 동일한 지 확인하는 방법

파일이 나중에 변경되지 않았 음을 어떻게 확인할 수 있습니까? 즉, 그가 실수로 자신의 실수를 성공적으로 취소했다는 것을 어떻게 확인할 수 있습니까?

파일 그룹에 대해 어떻게합니까?

마지막으로 다른 버전의 파일 (현재 버전과 현재 버전이 아닌 파일)을 비교하는 경우 어떻게합니까? 자체

+1

잘 알려진 커밋 (좋은 상태에 있다는 것을 알 수있는 시간/날짜에 해당하는 커밋)과 diff가있는 경우 (1) 파일을보고 2) 커밋하면 . – AD7six

+0

이것은 [git] 태그가 있기 때문에, 'git rev-parse commit1 : path/to/file''commit2 : path/to/maybe/another/file'입니다. 출력 선이 같지 않으면 파일이 다릅니다. – jthill

+0

@ AD7six : 그것은 논리적으로 들립니다. 어떻게 구문이 어떻게 생겼는지 궁금하네요. – Skuli

답변

2

https://www.kernel.org/pub/software/scm/git/docs/git-diff.html : 그래서

git diff [--options] <commit> <commit> [--] [<path>…] 
This is to view the changes between two arbitrary <commit>. 
... 
<path>… 
The <paths> parameters, when given, are used to limit the diff to the named 
paths (you can give directory names and get diff for all files under them). 

:

git diff deadbeef cafebabe -- pom.xml src/main/resources src/test/resources 

날 SRC에서 내 pom.xml 파일에 대한 두 (약칭 함) 커밋 해시의 차이점 및 모든 파일을 볼 수있게된다/주/리소스 및 src/test/resources.

[이 개정판에있는 전체 파일/디렉토리를 비교한다는 점에 유의하십시오. 이 아닌 경우은이 두 가지 커밋에 의해 도입 된 특정 변경 사항을 단순히 비교합니다. ]]

-

영업 이익은 묻는다 : 물론

Can't you skip the -- ? That's what I did and didn't notice problems. 

. -- 옵션은 명령에서 가능한 모호성을 제거하는 것입니다. 명령이 모호성을 해결할 정도로 똑똑한 경우 (보통 git 명령과 마찬가지로) '-'는 생략 할 수 있습니다 (맨 페이지의 -- 주위의 대괄호로 표시).

가능한 모호성은 무엇입니까? 정상적인 파일 이름과 지점/태그 이름을 사용하면이 파일은 드문 경우지만 가능합니다.

(1) git diff [--options] [<commit>] [--] [<path>…] 
This form is to view the changes you have in your working tree 
relative to the named <commit>. ... 

(2) git diff [--options] <commit> <commit> [--] [<path>…] 
This is to view the changes between two arbitrary <commit>. 

하는의 내가 현재 디렉토리에 '갑'라는 파일이 있다고 가정 해 봅시다 : 예를 들어, 사람이 페이지가 모두 유효한 자식은 diff 명령이 있습니다 말했다 있습니다. 나는 또한 'foo'라는 태그를 가지고있다. (이것은 'foo'라는 파일을 추가 한 커밋이다.)

git diff deadbeef foo 

이 명령의 기능은 무엇입니까? (1) 파일 foo과 수정본 deadbeef을 파일 foo과 현재 작업 디렉토리에 비교 했습니까? (2) 또는 deadbeef의 전체 소스 트리를 foo 태그의 전체 소스 트리와 비교합니까?

나는 그것이 (2) 할 것이라고 믿는다.그래서 경우에 정말 해석 (1), 내가 사용할 수 있습니다 원하는 :

git diff deadbeef -- foo 

- 자식에 대한 좋은

한 가지 명령이 구조에 상당히 일치한다. 대부분의 명령은 사용

git <command> [--options] <commit reference(s), if needed?> [--] [<path> ...] 

git diff HEAD^ -- README 
git log HEAD^ -- README 
git checkout HEAD^ -- README 
git reset HEAD -- foo 

이 아마도 당신이 매우 자주 git diff에 대한 모호성으로 실행되지 않습니다 당신이 그것으로 실행 않은 경우, 그 어떤 쉽게 고쳐 다시 사용하여 명령을 실행하는 데 '-'. 그러나 때로는 명령이 잠재적으로 파괴적 일 경우 (예 : checkout, reset) 모호성을 방지하기 위해 이중 대시를 사용하거나 (실제로는 모호성을 해결하기 위해) 유용합니다.

+1

-을 건너 뛸 수 없습니까? 그게 내가 한 일이고 문제를 발견하지 못했던 것이다. – Skuli

+0

@ Skúli - 대답에 대한 답장 편집. –

1

DIFF 파일이 :

git diff HEAD^^ HEAD file 

당신은 file는 커밋은 diff 것이다 생략 할 경우.

+0

아. HEAD ^^ HEAD 이전에 2 개의 커밋을 위해 서 있습니다. – Skuli

+1

HEAD와 HEAD^^를 2 개의 다른 커밋 ID로 대체 할 수 있습니까? 그것은 그것을 시도 할 때 작동하는 것 같습니다. – Skuli

+0

@ Skúli 예, HEAD가 커밋을 가리키고 있습니다. 커밋 해시를 사용하면 문제가 없습니다. –

0

귀하의 요구 사항이 정확하게 제목 질문이라면, 이것은 약간 더 현저하게 나아질 것입니다. - diff는 매우 좋지만, 이미 가지고있는 한쌍의 20 바이트 코드를 비교하는 것은 모든 다른 파일. rev-parse 때문에, 그것을 참조하는 개체의 샤에 대한 참조를 전환 :

if test "$(git rev-parse commit1:path/to/file)" \ 
     = "$(git rev-parse commit2:path/to/maybe/another/file)"; then 
     # the files are the same 
else 
     # they're different 
fi 

또는 당신이 그것을 째려하는 경우,

git rev-parse commit1:path/to/blob-or-tree commit2:path/to/another 

트릭을 할 것, 디렉토리 트리 당신이 다른 경우이지만 ' 조만간 두 개의 트리 참조에 git diff --name-only을 사용하여 어떤 트리를 찾으십시오.

+0

downvote 설명해주세요. 이것은 작동하며 전체 서브 디렉토리를 검사 할 때 훨씬 효율적입니다. – jthill

+0

어떻게 작동하는지 더 자세히 설명하면이 답변을 크게 향상시킬 수 있습니다. git rev-parse가 파일을 "diff"하기 위해 사용될 수 있다는 것은 명백하지 않습니다. (문서를 읽은 후에조차도 아닙니다. (https://www.kernel.org/pub/software/scm/git/docs/git- rev-parse.html)). 또한'git diff'는 이미 효율적이기 때문에'git rev-parse'가 때로는 더 좋은 이유가 무엇인지에 대한 강력한 주장을해야 할 것입니다. –

+0

고마워, 네 말이 맞아. 고정. – jthill

관련 문제