Skip to content
isdnetworks
Go back

출력에 남은 해시로 한 복원

브랜치를 지웠는데 그 안에 아직 기본 브랜치로 합치지 않은 작업이 있었다. 그리고 지우고 나서 얼마 지나지 않아 그 안의 작업이 다시 필요해졌다.

Table of contents

Open Table of contents

지우고 나서 필요해진 작업

브랜치 목록에는 아무것도 안 나왔고 이름을 가지고 찾을 방법도 없었다. 브랜치를 지웠으니 그 안의 작업도 함께 사라진 것으로 보이는 상태였다.

그런데 브랜치는 커밋을 가리키는 이름일 뿐이므로 이름이 없어져도 커밋 자체는 남는다. 그러면 남은 문제는 이름을 잃은 그 커밋을 무엇으로 찾아내느냐 하나였다.

출력에 남은 해시

지울 때 나온 메시지 안에 그 브랜치가 가리키던 커밋의 짧은 해시가 들어 있었다. 그 값으로 커밋을 조회해 보니 객체가 지워지지 않고 그대로 살아 있었다.

되돌릴 수 없어 보이는 조작에도 그 시점의 좌표가 출력에 남는 경우가 있고 그것이 유일한 단서가 된다. 그 해시를 가리키는 브랜치를 다시 만드니 원래 상태로 돌아왔다.

출력을 놓쳤을 때의 경로

터미널을 이미 닫아서 그 출력이 남아 있지 않으면 다른 경로가 필요해진다. 참조 이동 기록에 브랜치를 오간 흔적이 남아 있으므로 거기서 해시를 찾을 수 있었다.

가리키는 것이 없는 커밋을 훑어 주는 점검 명령으로도 찾을 수 있었다. 세 경로 중 하나로는 대체로 그 해시가 나오므로 순서대로 시도하면 된다.

남는 기간과 거부되는 명령

가리키는 것이 없는 커밋이 영원히 남지는 않고 설정된 기간이 지나면 정리된다. 바로 알아채면 되살릴 수 있고 한참 지난 뒤에는 그것도 불가능해진다.

그래서 삭제 자체를 안전한 쪽으로 바꿔서 합치지 않은 커밋이 있으면 거부하는 명령을 쓰게 했다. 거부되면 무엇이 안 합쳐졌는지 목록으로 보고 지울지 정하며 지운 것과 해시는 파일로 남겼다.

되살리는 것과 합치는 것

브랜치를 되살린 뒤에 그 안에 무엇이 들어 있는지를 변경 목록으로 확인했다. 들어 있던 커밋 중 일부는 그 사이에 다른 방식으로 이미 다시 만들어져 있었다.

그래서 전부 합치지 않고 지금 실제로 필요한 커밋만 골라서 가져왔다. 되살리는 것과 합치는 것은 다른 판단이고 되살렸다고 그대로 합치면 이미 있는 것과 겹친다.

정리


Share this post on:

Previous Post
잠긴 것이 아니라 기다리는 중
Next Post
인코딩해서 통째로 넘긴 스크립트