2016-12-29 17 views
3

내가 작은 커밋의 몇 가지를 가지고 REPO가 제거되지 커밋. 이 상태에 나는 실행 $ git reset initial
는 지금 참조하십시오는 자식 리셋 후, 도달 할 수없는이

* e6e6a8b (master) hello world now 
* f308f53 Made it echo 
* f705657 Added hello 
* 08a2de3 (HEAD -> testbranch, tag: initial) initial 

내가 기대 한 것 :이 도달 할 수없는 때문에 a0fc4f8 삭제 될 커밋합니다. 무슨 일
: git show a0fc4f8을하는
1) 여전히이
2) git status을하는 커밋 표시에 의해 추가 된 file.txt이 같은 추적되지 a0fc4f8 커밋하고 또한 비 추적 나타 ​​안녕하세요이이 f705657 커밋에서 추가 된 파일을 보여줍니다.
3) git gc 또는 git gc --prune=all을 실행해도 a0fc4f8은 더 이상 도달 할 수 없으며 해당 이름/태그가 연관되어 있지 않지만 삭제되지 않습니다.
왜 이런 일이 발생합니까?

업데이트 : 2

$ git fsck 
Checking object directories: 100% (256/256), done. 
Checking objects: 100% (15/15), done.  

업데이트 : 커밋

$ git log --all --decorate --graph --oneline 
* e6e6a8b (master) hello world now 
* f308f53 Made it echo 
* f705657 Added hello 
* 08a2de3 (HEAD -> testbranch, tag: initial) initial 

$ git gc --force 
Counting objects: 15, done. 
Delta compression using up to 4 threads. 
Compressing objects: 100% (8/8), done. 
Writing objects: 100% (15/15), done. 
Total 15 (delta 1), reused 15 (delta 1) 

$ git log --all --decorate --graph --oneline 
* e6e6a8b (master) hello world now 
* f308f53 Made it echo 
* f705657 Added hello 
* 08a2de3 (HEAD -> testbranch, tag: initial) initial 

$의 자식 쇼 a0fc4f8 아직도 보여줍니다

업데이트 3 :

을하는
$ git reflog testbranch 
08a2de3 [email protected]{0}: reset: moving to initial 
a0fc4f8 [email protected]{1}: commit: added file.txt 
e6e6a8b [email protected]{2}: branch: Created from HEAD 
+0

'git gc --prune = all' 다음에'git fsck'는 무엇을 말합니까? –

+0

@ MichałWalenciak : 업데이트를 확인하십시오. – Jim

+1

'git reset (--mixed) initial'을 실행하면 작업 디렉토리가 변경되지 않습니다. 이것이 변경 사항이 모두 a0fc4f8 커밋에있는 이유입니다. – C1sc0

답변

5

1) 여전히 이것은 의도적으로 설계된 동작입니다

커밋 보여줍니다.

  • 어쩌면 실수로 마지막 명령을 실행 (또는에 잘못된 인수를 제공), 오류를 실현하고 이전 상태로 되돌아 가고 싶어; 연결할 수없는 개체가 여러 가지 이유로 즉시 제거되지 않습니다
  • 도달 할 수없는 개체를 제거 할 때 얻을 수있는 이점 (디스크 공간을 약간 절약 함)은 작업을 완료하는 데 필요한 작업량에 비해 너무 적습니다.

도달 할 수없는 개체를 가지런 히하는 것은 때때로 자동으로 수행됩니다. 그것은 또한 일부 자식 명령 (fetchpush 중 일부입니다)에 의해 수행됩니다. git status를하는

2) a0fc4f8만큼 추적 된 커밋 f705657 커밋하여 첨가 hello 파일로 추가 된 file.txt는 또한 비 추적 나타 ​​나타낸다.

당신은 모드를 지정하지 않고 git reset을 달렸다. 기본 모드 --mixed이며 그 의미

  • 지점이이 명령 (이 경우 initial)에 지정된 이동 저지된다;
  • 색인은 분기가 가리키는 새 확약과 일치하도록 재설정됩니다.
  • 작업 트리가 수정되지 않았습니다. (; 인덱스는 initial 커밋과 일치하지만이 생성 될 때 이러한 파일도 존재하지 않았다 두 번째 글 머리 기호) 파일이 디렉토리 (세 번째 글 머리 기호) 그리고 왜 그들이 추적되지 있습니다에 왜

이 설명합니다. 그것은 더 이상 도달 할 수없는 그것과 관련된 이름/태그가 없음에도 불구하고 a0fc4f8 삭제되지 않습니다 git gc 또는 git gc --prune=all을 실행

3).

git gc 또한 참조 용 분기 reflog를 확인합니다. testbranch 브랜치에 reflog이 활성화 된 경우 reflog의 가장 최근 항목이 a0fc4f8 (여기에는 을 실행하기 전에 testbranch 브랜치가 있었던 지점 임)가 지정됩니다. git reflog testbranch을 실행하여 testbranch 지점에 대한 reflog가 활성화되어 있는지 확인할 수 있습니다. 인쇄물이 있으면 [email protected]{1} 위치의 두 번째 줄에 커밋 a0fc4f8이 표시됩니다. [email protected]{n}이라는 표기법은 이전에 n 브랜치의 값이 name (커밋을 가리키며, n이 과거 임)이라는 것을 의미합니다.

git gc의 작동 방식에 대한 자세한 내용은 documentation에서 확인할 수 있습니다. 노트에서

는 읽기 섹션 :

git gc 시도는 아주 열심히 수집하는 쓰레기에 대한 안전합니다. 특히 현재 브랜치와 태그 집합에서 참조하는 객체뿐만 아니라 색인, 원격 추적 분기, git filter-branch에 저장된 참조를 refs/original/에 저장하거나 reflog (참조 된 분기의 커밋을 참조 할 수 있음)를 유지합니다. 나중에 개정 또는 되감기).

일부 개체가 수집 될 것으로 예상되는 경우, 해당 개체를 모두 확인하고 해당 참조를 제거하는 것이 바람직한지 여부를 결정하십시오.

+0

reflog에'a0fc4f8'가 표시되어 있지만 가장 최근 항목이 아닙니까? 업데이트 된 OP – Jim

+0

을 참조하십시오. 맞습니다. 두 번째 항목입니다. 첫 번째 항목 ('testbranch @ {0}', 가장 최근 항목)은 브랜치의 현재 위치입니다. ['testbranch @ {1}'] (https://git-scm.com/docs/gitrevisions#gitrevisions-emltrefnamegtltngtemegemmaster1em)은 이전 위치입니다 (즉,'git reset'이 이동하기 전의 위치). – axiac

+0

그래서 reflog git gc가 무시하는 것에 대한 참조가 있습니까? 하지만 그러면 git gc가 커밋을 삭제하지 않는다는 것을 의미합니다. 커밋이 항상 reflog 기록에 포함되지 않을까요? – Jim