이 문서는 마인크래프트 pixel 플러그인의 부가기능 중 시간 이동 및 평행세계 대해 설명합니다.
본 README.md 문서는 여기입니다.
*이 문서는 단계별로 읽을 수 있습니다. 순서대로 읽으면서 '아 이정도면 이 커맨드가 무슨 기능을 하는지 알 것 같아!'라는 생각이 드신다면 거기까지만 읽으셔도 상관 없습니다.
백업지점, 평행세계, 시공간 이동
시공간 이동과 모든 시공간을 아우르는 시계
시계가 자신이 속한 세계를 알 수 없을 때
백업지점은 시간의 흐름에 따라 생성되므로 백업지점의 나열은 시간의 흐름이라고 볼 수 있습니다.
평행세계는 특정 시점까지는 똑같지만 그 시점 이후로는 진행양상이 전혀 다른 또 하나의 세계입니다.
/pixel commit
가 백업지점 하나를 만든다면, /pixel branch
는 현재 시계가 가리키는 시점(일반적으로 플레이어가 속한 시점)으로부터 갈라져나온 새로운 평행세계를 만듭니다.
그리고 /pixel checkout
을 사용하면 시간의 흐름을 거슬러 특정 시점으로 이동할 수 있습니다.
다시말해, 시간의 흐름을 /pixel checkout
을 통해 돌면서 '이 시점 이후로는 다르게 전개해보고싶어' 싶은 시점이 있다면, 그 시점에서 /pixel branch
를 사용해 새로운 평행세계를 만들 수 있다는 뜻입니다.
그리고 /pixel checkout
을 통해, 이미 만들어진 특정 평행세계의 가장 최근 시점으로 이동하는 것도 가능합니다.
그러니까 /pixel checkout
이 할 수 있는 것은 시간 이동과 더불어 평행세계간 이동 까지입니다.
플러그인을 처음 초기화했을 때 기본적으로 등록된 메인 월드의 세계 이름은 'master'이며, 다른 평행세계는 원하는 이름으로 만들 수 있습니다.
그렇다면 자신이 어디에 있는지, 어느 시점에 있는지에 대한 사항을 나타내는 시계가 필요할 것 같습니다.
그것은 당연히 있고, 평행세계 혹은 시간대를 이동할 때마다 갱신됩니다.
그것을 Git에서는 HEAD라고 부르는데, 여기에서는 편의상 시계라고 부르겠습니다.
만약 /pixel checkout
을 통해 특정 평행세계로 이동했다면, 이 시계는 그 평행세계를 가리킵니다.
평행세계를 가리킨다의 의미는, 시계가 '지금은 이 평행세계에 있고 가장 최근 시점(현재)에 있어'를 나타냄을 의미합니다.
만약 /pixel checkout
을 통해 특정 시점(백업지점)으로 이동했다면, 이 시계는 그 시점을 가리킵니다.
시점을 가리킨다의 의미는, 시계가 '어느 평행세계인지는 모르겠는데, 일단 이 백업지점을 만든 시점에 있어'를 나타냄을 의미합니다.
이 시계가 필요한 이유는 /pixel branch
명령에 있습니다.
평행세계를 만드려면, 새로운 평행세계가 가질 새로운 현재를 알아야합니다. 그래야 이 평행세계에서 이후에 만들어질 백업지점이 시간의 흐름에 따라 계속 쌓일테니까요.
그 현재가 시계가 나타내는 시점입니다. 시계는 항상 존재하고, 평행세계간 이동 및 시간 이동마다 업데이트되므로 어느 시점, 세계에서 /pixel branch
를 수행한다면 그 때 시계의 시점으로부터 갈라진 새로운 평행세계를 만듭니다.
위에서 시점을 가리킬 때는 어느 평행세계인지 모른다고 서술되어있습니다.
당연히 이동하기 전에 소속되어있던 세계가 아닌가? 하는 생각이 드시는 분이 분명 계실거라 생각합니다.
그것은 Git의 버전관리 방식에서 이유를 찾을 수 있습니다.
예를 들어 A, B, C라는 흐름이 있는 평행세계 X가 있고, B에서 갈라져나온 A, B, D라는 흐름이 있는 평행세계 Y가 있다고 생각해볼게요.
나는 X의 C에 있었고, 여기서 A로 이동했다고 한다면, '나는 분명 X의 A에 있겠지' 싶겠지만, 사실은 그렇지 않습니다.
Git의 시점에서 보면 X, Y에서 A는 공통된 과거이고, 서로 같습니다. 서로 같은 시점을 두 개나 보관하는건 큰 낭비이기 때문에, Git은 이것을 하나만 만들어둡니다.
그렇기 때문에 단순히 A로만 이동했다면, 이게 X의 A인지 Y의 A인지 알 수 없습니다.
그리고 이 시점으로 이동하는 이유, 그리고 할 수 있는 일을 종합했을 때 굳이 이 시점이 어느 세계인지 알 필요가 없기 때문에, 시계도 그 사항을 나타내지 않습니다.
Git에서는 이 상황을 detached HEAD 라고 표현합니다.
이 사항을 서술하는 이유는, /pixel checkout
을 통해 시점으로 이동하고, 바로 변경사항을 만든 뒤 /pixel commit
을 수행했을 경우 발생하는 오류에 대해 설명하기 위해서입니다.
/pixel checkout
을 통해 시점으로 이동했을 경우 어느 평행세계에 속해있는지 모릅니다.
그 상황에서 /pixel commit
을 통해 시점을 기록하려고 하면, 시점은 항상 평행세계에 포함되어있어야 하지만 어느 평행세계에 포함시켜야할지는 모릅니다.
그렇게 될 경우 Git은 !라는 이름을 가진 특수한 평행세계를 또 만들도록 되어있습니다.
다만, 이 평행세계에서는 많은 행동이 제약되기에, pixel 플러그인 측에서 해당 동작을 수행하려할 경우 오류를 출력하도록 막아두었습니다.
만약 오류 메시지에 'detached HEAD'가 포함되어있다면 이 오류이며, 해당 시점에서 /pixel branch
를 통해 브랜치를 만들어주면 해결됩니다.