Git(깃)이 2.54 및 2.55 버전 업데이트를 통해 실험적인 'git history' 명령을 도입하며 개발자들의 복잡한 이력 편집 작업을 한층 간편하게 만들었습니다. 이 새로운 명령은 과거 커밋(commit) 수정, 커밋 메시지 변경, 커밋 분할 등 기존에 여러 단계를 거쳐야 했던 작업을 자동화하고, 해당 커밋에서 파생된 모든 로컬 브랜치(branch)까지 자동으로 재구성해주는 것이 특징입니다.
'git history'는 크게 세 가지 하위 명령으로 구성됩니다. 첫째, 'fixup'은 스테이징(staging)된 변경 내용을 과거 커밋에 합치고, 그 커밋에서 파생된 모든 로컬 브랜치를 새로운 커밋 해시(hash)에 맞춰 자동 리베이스(rebase)합니다. 이는 'git commit --fixup'과 'autosquash rebase'를 합친 것과 유사하지만, 대상 커밋을 포함하는 다른 브랜치까지 갱신한다는 점에서 차이가 있습니다. 둘째, 'reword'는 작업 트리(working tree)를 건드리지 않고 과거 커밋 메시지를 변경하며, 후속 커밋 스택과 브랜치를 재구축합니다. 마지막으로 'split'은 하나의 커밋 변경 내역을 헝크(hunk) 단위로 선택하여 두 개의 커밋으로 분리한 뒤, 후속 커밋과 브랜치를 재구성하는 기능을 제공합니다. 이 모든 하위 명령은 원자적으로 처리되어 작업 트리가 중간에 깨지는 상황을 방지합니다.
이 명령의 도입은 기존 Git의 이력 편집이 불편하다는 개발자들의 오랜 불만을 해소하려는 시도로 볼 수 있습니다. 여러 변경 사항을 병렬로 다룰 때 브랜치와 커밋을 계속 오가야 하거나, 'rebase -i' 도중 작업 트리가 불완전한 상태에 빠지는 문제 등이 대표적입니다. 'git history'는 이러한 문제에 대한 대안으로 거론되던 'jj'와 같은 도구의 일부 장점을 Git 코어 배포판에 직접 통합하여, 별도 설치 없이도 유사한 이력 편집 기능을 사용할 수 있게 합니다. 비록 'jj'가 제공하는 1급 충돌 처리나 작업 로그 기반 실행 취소 같은 고급 기능까지는 아니지만, 기존 Git 사용자들에게는 상당한 편의성을 제공할 것으로 예상됩니다. 다만, 병합 커밋이 있는 이력에서는 동작하지 않는다는 제한 사항이 있어 모든 Git 사용 방식에 적용하기는 어려울 수 있습니다.