2016-11-09 1 views
1

누군가는 몇 달 전에 뭔가를 저지른 사람입니다. 그 후에 여러 다른 커밋이 수행되었습니다. 어떤 사람이 수정이나 리베이스하여 해당 커밋의 내용을 변경했는지 확인할 수 있습니까? 그렇다면 어떻게?git commit이 변경되었는지 어떻게 알 수 있습니까?

+0

정보로 무엇을 하시겠습니까? – NiVeR

+0

나는 방해 행위가 있었고 이것이 사실인지 알고 싶습니다. –

+3

이전 저장소에 동일한 저장소가 여전히 복제되어있는 경우 두 커밋의 해시 코드를 비교하면됩니다. – choroba

답변

3

커밋에서 Git은 이 아니며이 변경되었습니다. rebase도 git commit --amend도 커밋을 변경하지 않습니다. 불가능합니다.

여기서 트릭은 "커밋"을 정의하는 것입니다. 어떤 커밋인지 어떻게 알 수 있습니까? "Git for Git 저장소에서 커밋하기"라고 말하면, 거기에는 4 만 개가 넘는 커밋이있다. 어느 쪽이을 의미합니까?

확실한 확실한 방법은 입니다.에게 알려 주시면 해시 ID (예 : 9b7cbb315923e61bb0c4297c701089f30e116750)를 알려 드릴 수 있습니다. 이는 하나의 특정 커밋에 대한 실제 이름입니다.

$ git cat-file -p 9b7cbb315923e61bb0c4297c701089f30e116750 | sed 's/@/ /' 
tree 4ba58c32960dcecc1fedede9c9362f5c10158f08 
parent 77933f4449b8d6aa7529d627f3c7b55336f491db 
author Junio C Hamano <gitster pobox.com> 1418845774 -0800 
committer Junio C Hamano <gitster pobox.com> 1418845774 -0800 

Git 2.2.1 

Signed-off-by: Junio C Hamano <gitster pobox.com> 

이 이름은이 커밋에 영구적으로 첨부됩니다. 그것은 확실히 다루기 힘들고 못생긴 이름이다. 더 짧고, 예쁘다, wieldy 이름을 갖는 것이 좋지 않겠습니까? 그리고 일이 : 나는 v2.2.1 당신을 가리킬 수 있습니다

$ git rev-parse v2.2.1^{commit} 
9b7cbb315923e61bb0c4297c701089f30e116750 

그러나 사실

, v2.2.1는 전혀, 그것은 태그의 커밋되지 않습니다.

$ git rev-parse v2.2.1 
7c56b20857837de401f79db236651a1bd886fbbb 

태그 개체 : 구체적으로는, 태그 이름 (refs/tags/v2.2.1 또는 이름 v2.2.1 아래 packed-refs 파일에)를 주석 태그 오브젝트를 가리키는, 2 오히려 직접보다 미트로는

$ git cat-file -p v2.2.1 | sed 's/@/ /' 
object 9b7cbb315923e61bb0c4297c701089f30e116750 
type commit 
tag v2.2.1 
tagger Junio C Hamano <gitster pobox.com> 1418851265 -0800 

Git 2.2.1 
-----BEGIN PGP SIGNATURE----- 
Version: GnuPG v1 

iQIcBAABAgAGBQJUkfPBAAoJELC16IaWr+bLjfgP/iA78fk3NkTEROoyIVq6kPDH 
pZAlm4ObsKXAdl6sFqWe7xFxGExHYzJ5L3qGXs3VM+9Z3iDe2WZN3WbK3aFtYqfU 
AYRSTpnPzDf4L0vfyqiFS7//+LoeM2TogAV7SLdehMlodsL5HR6FiSz1zffSq8D0 
Ci4XpGWHkqXLhfvUPC7foCgGpf7l38gsbJPbdkyKLK9/wtLSfkk45vK+wY6o3CCv 
JKBFr468958fvw+j73nxiT+Vne7TeL1Bq1kCq9M65dAjOpFjZiD408NaF7jTcNcx 
TMjdKoVlDNFHcUPMv9B5C308sRVUylmeUzb8XrQNji0+1NA5ivVgDfZsudWUtlTj 
jo9xku0Np4IdXPwxJNlO5tC2rnof4gdD4jWPJj/DvellNKCDXuLuXDZSKZDI9GSr 
OzLsad8uFX3MySPe+evIVF6qGS2KzI8PGNrohqWaPkX8cug22EW7lKJFpjYJb5gP 
3nJUJvbsrMeyoH/GqxPzA5clqMGtsirnTiapMILNRmlC+3rzc0DkLw90BM6vKNOC 
eDTOI9Xj1JS9qbD6fEkxVNrXRDz0TFbtpFbFTtKk4zfAc/jTOqE9fqpV7afoQfON 
e1NwrjR5Kcts7ev23Y0G1WH3t2L0N2/q27kcjrulCEH1vtXlmaZFU6o+WKUVV7iH 
/YQnjNUOgRxQ1zBGof7h 
=yJ4Q 
-----END PGP SIGNATURE----- 

가 PGP 서명이 우리가 Junio ​​C 하마노 정말 만든이 태그를 체결 믿고 여부를 결정할 수 있습니다 것입니다 :는 "PGP 서명"을 포함하여 그 안에 커밋 ID, 플러스 추가 버릇의 전체 무리가있다. SHA-1보다 더 강력한 형태의 암호화 디지털 서명을 사용합니다 (SHA-1은 적어도 이론상 깨뜨릴 수 있기 때문에 분해가 가능함). 서명 (SHA-1 그 자체는하지 않습니다).

결국 우리가 신뢰할 수 있고/또는 확인할 수있는 사람이 그러한 PGP 서명 태그를 만들었거나 PGP 서명이 커밋 된 경우에만 도움이됩니다. 이론적으로 각 커밋에 서명하는 것은 커밋에 직접 디지털 서명이 있기 때문에 조금 더 강력 할 수 있습니다. 그러나 실제적으로, 태그를 서명하는 것이 훨씬 편리하고, SHA-1을 끊는 것에 대해 정기적으로 가지 않기 때문에 (그리고 적어도 현재의 무차별 대항법에서는 적어도 우리가했다면 명백한 표시가 남을 것입니다. 이 대답의 범위를 벗어나는 방법, 그리고 나보다 다소 적절하게 설명하는 것 - 암호화는 내 분야가 아닙니다. 당신이 break the SHA-1 hash을 할 수있는 경우에


1 글쎄, 그것은 이론적으로 가능합니다. 그럼에도 불구하고 괴짜가 새로운 객체를 만들면 같은 해시을 생성하는 방식으로 이전 객체를 이미 가지고 있다면이 새로운 객체를 선택하지 않아도됩니다.이 규칙은 모든 Git 객체 (커밋, 트리, 주석이 달린 태그 및 블롭)에 적용되며이 모든 객체는 해시로 명명됩니다.

무엇 git rebasegit commit --amend들이 커밋을 변경 것처럼 을 보일 수 있도록, 수행, 기존의 커밋의 새 복사본을 만드는 것입니다, 다음 주위에 이름을 섞는다. 새로운 커밋에는 새롭고 다른 해시가 있고 이후에 (자손) 커밋은 말 그대로 직계 조상 (부모) 커밋의 해시를 포함하고 커밋의 해시를 "변경"합니다 (즉, 커밋 개체를 새로운 다른 커밋 객체)는 변경 사항이 나머지 커밋을 통해 버블 다운되도록합니다. 그런 다음 기존 (짧은, 가지 또는 태그) 이름을 새 체인 끝으로 다시 지정합니다.

우리가 믿을 수있는 엔드 포인트가 주어지면 체인 또는 트리의 이전 개체 각각으로 신뢰를 확장 할 수 있습니다. 이에 대한 전문 용어는 Merkle tree입니다.

이 힘내는 "주석 태그"를 호출 무엇을하게

2 다음으로, 망할 놈의 저장소에 저장 주석 태그 객체를 가리키는 (그 자체로 "경량 태그"가 될 것입니다) 태그 이름을, 다른 Git 객체를 가리키는 태그 객체 (일반적으로 커밋이지만 다른 태그 또는 심지어 트리 또는 blob). 그러나 "다른 태그"조차도 다소 드물다. Git의 Git 저장소에는이 중 세 가지가 있으며 나머지 두 개는 실제로 전례가 없다.

+0

놀라운 설명. 고맙습니다. –

관련 문제