2016-07-06 6 views
4

필자는 특별한 문제가 없지만 이전에 실수로 색인을 날려 버렸고 어떤 시점에서 색인이 생성 된 파일의 이전 상태로 되돌릴 수 있기를 바랬습니다. .인덱스에 대한 reflog가 있습니까?

일부 예제의 경우는 다음과 같습니다

$ git add <file> 
# find out that I already had an indexed version of <file>, 
# and that for some reason I shouldn't have added the extra modifications 

$ git stash pop 
# find out afterwards that I have a mix of "the index I had" 
# and "the index in the stash" 

$ git stash 
# with an active index, which is now mixed with the state of the working tree 

$ git reset <typo> 
# accidentally resetting the wrong file, or the whole directory 

하나는 (here를 제안)이 할 수있는 더 편리한 방법이 있다면, 내가 궁금 git fsck --full --unreachable --no-reflog를 통해 파고에 의존 할 수있다.

질문 :

인덱스에 대한 reflog의 어떤 종류가 있습니까?

답변

1

아니요, 색인에 대한 reflog가 없습니다. 명령에 --lost-found 플래그가 있거나 없으면 git fsck으로 알아 냈으므로 돌아 가야합니다.

파일 (SHA-1)의 타임 스탬프를 사용하여 파일을 생성 날짜별로 "정렬"하고 파일 생성 시간을 기준으로 몇 가지 기본 reflog를 사용할 수 있습니다.

+0

생성 날짜 트릭은 좋은 생각입니다. 감사. – LeGEC

+0

테스트를 위해 필자는'fsck --unreachable'에 의해 리턴 된 모든'.git/objects/ab/cdef ... '모양을 찾아 보려고했습니다. 매달려있는 얼룩 중 일부는 거기에 없기 때문에 아마도 팩 파일에 저장됩니다. blob이 속한 팩 파일을 찾는 빠른 방법을 알고 있습니까? – LeGEC

+0

파일의 수정 날짜를 찾고있었습니다. blob의 수정 날짜를 찾기 위해 다른 트릭을 염두에 두시겠습니까? – LeGEC

4

reflog에는 색인이 아닌 참조 용 항목이 있습니다.

하지만 워크 플로를 조정하면 여기에 대한 답변이 될 것입니다. (나를위한 것이 었습니다.)

대 이상 5-10분, 을 무언가 작업을 커밋 - 당신 - 가서 - (이전 추진 및 정리)을. 그렇지 않으면 단계로 이동.

index ... 나는 하루 종일 사용합니다! 하지만 단 1-2 분 안에 커밋 할 것이라는 것을 안다면 정말 사용합니다 (기본적으로 원자 흐름 워크 플로). 나는 무언가 어리석은 짓을하고 내 색인을 날려 버릴 까봐 두렵기 때문입니다.

제가 작업하는 동안 약간의 목표를 달성 할 때마다 개인 정리 작업을 수행합니다. 개인 커밋 작업을 수행 할 때까지 먼저 정리 작업을 수행해야합니다. 나는 그 특정 문제에 대해 작업하면서 커밋을 계속하고, 대개 수정합니다.

그런 다음 공개 커밋을 만들려는 안정적인 지점에 도달하면 (필 요에 따라) 필자의 모든 작은 윕이 함께 커밋되고 멋진 커밋 메시지와 푸시가 제공됩니다.

이렇게하면 필요한 경우 내 reflog에 탐색 경로를 거의 만들지 않아도됩니다. 다음이 방법이된다

# start work 
git checkout -b featurea 
# work 
vim file.txt 
# reach a little milestone 
git commit -a -m "working on feature..." 
# work some more 
vim file.txt 
# reach another little milestone 
git commit -a --reuse-message=HEAD --amend 
# work some more 
vim file.txt 
# another little milestone... 
git commit -a --reuse-message=HEAD --amend 
# finishing touches... 
vim file.txt 
# ok, done now, put everything back in working dir so I can review 
git reset HEAD~ 
# decide what goes in this commit 
# perhaps use `git add -p` 
git add file.txt 
# give a nice commit message (use editor) 
git commit 
# now merge to master and push with confidence! 

이 입력의 많은처럼 보일지도 모르지만, 당신이 쉘에 비행에서 좋은 얻을 경우 (set -o emacs 또는 set -o vi의 좋은 방법을 이용됩니다 복용) : 여기

내 워크 플로 거의 즉시.

내가 진정으로 노력하고있는 것이 매우 빠른 해결책 인 경우 일반적으로 무대 위에서 실행하는 방식을 사용하지만 그보다 오래간만해도 내 reflog를 채울 수있는 안전성이 필요합니다.

+0

워크 플로에서 +1. 또한 다소 긴 작업 (하루 이상 또는 때로는 몇 시간 이상 걸릴 수있는 작업)의 경우 로컬 지사를 만듭니다. Git의 브랜치는 거의 자유 롭다 : 그들은 약간의 디스크 공간을 차지하지만, 가장 비싼 리소스는 내 자신의 헤드 스페이스이다 ("실험 1 ~ 실험 45", 위대한, 지금은 * 내가 실험했던 것). *?) ... – torek

+0

@torek off topic -하지만 당신의 git book은 언제 나옵니까? :-) –

+0

@ Alok-- 풀 타임 일을하고 그 일을 그만두고, 아아! – torek