GitButler CLI: 스콧 샤콘, GitButler

GGitButler
컴퓨터/소프트웨어창업/스타트업AI/미래기술

Transcript

00:00:00반갑습니다. Git Butler를 모르시는 분들을 위해 간단한 데모를 준비했습니다. Git Butler는 새로운 버전 관리 도구입니다.
00:00:07우리는 몇 년 동안 이 프로젝트를 진행해 왔고, Jujutsu(JJ)에서 많은 영감을... 아니, 많은 걸 훔쳐왔죠.
00:00:10그러니 여러분 중에 Jujutsu를 사용하시는 분이 있다면, 저희가 여러분의 아이디어를 아주 많이 가져다 썼다고 보시면 됩니다.
00:00:16어쨌든 Git Butler를 처음 보시는 분들을 위해 설명하자면, 이건 버전 관리 도구입니다.
00:00:19보통은 GUI 형태로 사용하지만,
00:00:21현재 CLI 버전을 개발 중이라 그 결과물을 좀 보여드리고 싶었습니다. 여러분 모두 Git을 사용하시고,
00:00:26Git의 CLI가 꽤 흥미로운 구조를 가지고 있으니까요.
00:00:29저희는 Jujutsu에서 가져온 몇 가지 개념들을 적용했습니다.
00:00:33하지만 꽤 멋지다고 생각되는 새로운 기능들도 포함되어 있죠.
00:00:36그래서 여러분께 보여드리고 피드백을 받아 더 멋진 툴을 만들 아이디어를 얻고 싶습니다.
00:00:40자, 그럼 하나씩 살펴보겠습니다.
00:00:43먼저,
00:00:46이 명령줄 도구의 이름은 'but'입니다.
00:00:49제가 평소에 '아재 개그(Dad jokes)'를 즐겨 하다 보니 이 이름이 꽤 적절하다고 느껴지네요.
00:00:52'but status'를 실행하면, 일종의 요약 로그(short log)가 나옵니다.
00:00:57Sapling이나 Jujutsu를 사용하면서 로그를 확인해 보셨다면 익숙하실 텐데요,
00:01:00디스크에서 수정된 파일들을 보여줍니다.
00:01:05현재 작업 디렉토리와 타겟 브랜치의 차이점을 보여주는 방식이죠.
00:01:08동시에 현재 가지고 있는 커밋들도 함께 보여줍니다.
00:01:11'but status -f'를 실행하면 각 커밋에서 어떤 파일들이 수정되었는지도 확인할 수 있습니다.
00:01:18Git Butler GUI를 사용하고 계신다면 레인(Lane) 같은 요소들을 보실 수 있겠지만,
00:01:23CLI에서도 Git이 하지 못하는 멋진 기능들이 많습니다. 예를 들어 이런 깔끔한 요약 로그 기능이나,
00:01:29기타 여러 가지가 있죠.
00:01:30그리고...
00:01:32일반적인 로그를 통해 이 커밋들이 로컬인지 등을 확인할 수 있는데, 이건 다른 툴의 요약 로그와
00:01:39비슷한 방식입니다.
00:01:40새로운 브랜치를 생성할 수도 있습니다.
00:01:44다시 'status'를 보면, 여기서는 트위터 클론 프로젝트를 예시로 쓰고 있는데요.
00:01:50브랜치 몇 개가 서로 쌓여(stacked) 있는 것을 볼 수 있습니다.
00:01:52이건 Git에서도 'update-ref' 설정을 사용하면 가능한 기능이죠.
00:01:56리베이스 등을 할 때 참조(refs)를 다시 작성해 주는 기능 말입니다.
00:02:00하지만 저희는 이걸 훨씬 더 자연스럽게 처리합니다.
00:02:03참조를 자동으로 업데이트하고, 리베이스 과정에서 변경 사항을 자동으로 추적하죠.
00:02:09거기에 더해 저희는
00:02:11'병렬 브랜치' 기능을 지원합니다. 동시에 하나 이상의 브랜치를 적용할 수 있다는 뜻이죠. 여기서 한번
00:02:23새 브랜치를 생성해 보겠습니다.
00:02:26다시 실행해 보면, 작업 중인 다른 브랜치들과 병렬로 존재하는 새 브랜치가 보이죠?
00:02:33이제 해당 브랜치로 들어가서 파일을 할당하고 커밋하는 작업을 시작할 수 있습니다.
00:02:39그 과정을 이어서 보여드리죠.
00:02:41또 다른 멋진 기능은 여러 개의 스테이징 영역(staging areas)을 가질 수 있다는 점입니다.
00:02:45각 스택마다 별도의 스테이징 영역이 있어서, 예를 들어
00:02:51'rub' 명령어를 사용할 수 있습니다. 'rub KU'로 이 파일을 선택하고 'ZA'에 넣으라고 지정하면,
00:02:58해당 스테이징 영역으로 파일이 할당됩니다. 특정 위치에 파일을 할당하고 싶다면
00:03:04이런 짧은 코드들을 활용하면 됩니다. 자,
00:03:12이 파일은 여기에 할당하고, 저 파일은 저기에 할당했습니다.
00:03:15이 상태에서 커밋하면 각각의 브랜치에 동시에 커밋을 넣을 수 있습니다.
00:03:21결과를 보시죠. 파일이 여기에 할당된 것을 볼 수 있습니다. 이제 이렇게 입력하면,
00:03:27'but commit -o'
00:03:30여기에 바로 커밋됩니다.
00:03:40이제 이 파일은 해당 커밋에 포함되었습니다. 좋은 점은 이 모든 게 Git 기반이라는 겁니다. 그래서
00:03:48이렇게 하면,
00:03:50실제로 Git 커밋이 생성되고, 브랜치를 푸시하는 등의 작업이 모두 가능합니다.
00:03:57하지만...
00:03:59두 브랜치에 할당할 수도 있고, 그냥 'but commit'을 실행해 타겟 브랜치에 할당되지 않은 모든 변경 사항을
00:04:07커밋할 수도 있습니다. 어떤 브랜치에 새로운 작업을 커밋할지 선택할 수 있는 거죠.
00:04:11그래서 저희는 이걸 '러빙(rubbing)'이라고 부르기로 했습니다.
00:04:14밤새 술을 마시고 아직 안 나타난 케일럽에게도 이 용어를 말해줬는데요.
00:04:18만약 그가 들어오면 다 같이 일어나서 박수라도 쳐줍시다.
00:04:21어쨌든 그가 제안한 '러빙'이라는 용어는 본질적으로 두 요소를 비벼서 하나로 합치는 과정을 의미합니다.
00:04:28마인크래프트의 제작대(crafting table) 개념을 생각하시면
00:04:32이해하기 쉬울 겁니다.
00:04:34이것과 저것을 합쳐서 새롭고 더 흥미로운 것을 만들어내는 방식이죠.
00:04:38'but rub' 명령어를 통해 'but' CLI에서 할 수 있는 일은 정말 많습니다.
00:04:45몇 가지 보여드리죠. 방금 보여드린 것처럼 파일을 할당할 수도 있고,
00:04:52수정된 파일을 브랜치에 넣거나 반대로 할당을 해제할 수도 있습니다. 여기 '00'이라는 특수한 모드가 있는데,
00:05:01여기서 'but rub'을 사용해서
00:05:05예를 들어 이 커밋 전체를
00:05:07'00'으로 보내버리면
00:05:11커밋이 취소됩니다. 기본적으로 해당 커밋에 대해 'reset --soft'를 실행하는 것과 같죠.
00:05:17커밋 수정(amend)도 가능합니다. 'rub le r'...
00:05:24y...
00:05:27RV... 아, 이제 돋보기가 필요할 정도로 나이를 먹었나 보네요.
00:05:32SW... 아, 죄송합니다. 실제로는
00:05:351 1 W로 해보죠.
00:05:38IW인가요? 감사합니다.
00:05:41이런, 실수했네요.
00:05:44이게 I인가요?
00:05:48죄송합니다.
00:06:02그리고
00:06:04그대로 커밋에 반영됩니다. 이렇게
00:06:10Rub I...
00:06:14커밋을 취소할 수도 있고,
00:06:16커밋을 합칠(squash) 수도 있습니다. 이 커밋과 저 커밋을 합치고 싶다면 'but rub J e GE'를 하면 됩니다.
00:06:22J e GE
00:06:25그러면 두 커밋이 하나로 합쳐집니다. 커밋을 취소하거나 순서를 바꾸는 등
00:06:32두 요소를 결합했을 때 기대할 수 있는 모든 동작을 수행합니다.
00:06:37할당되지 않은 변경 사항과 결합하면 사실상 작업이 취소되는 식이죠.
00:06:42이 기능이 지금 제대로 작동하는지 가물가물한데...
00:06:48파일을 다른 곳으로 옮길 수도 있습니다.
00:06:53J 8 2
00:07:02그러면
00:07:03해당 커밋에서 파일을 가져와서
00:07:07그 커밋에서는 빼고, 바로 아래에 있는 커밋으로 옮겨줍니다.
00:07:11이게 흥미로운 점은 Git에서 불가능한 일이라서가 아니라, Git으로는 하기가 꽤 까다롭기 때문입니다.
00:07:19특정 커밋만 취소하거나, 커밋 간에 파일을 이동하거나, 세 단계 아래에 있는 커밋에 파일을 끼워 넣는 일 말이죠.
00:07:27Git에서도 할 수는 있습니다. 임시로
00:07:31fixup 커밋을 만들고 auto-squash를 하는 식의 방법이 있죠.
00:07:34하지만 이렇게 '비비는(rubbing)' 방식으로 원하는 위치에 콘텐츠를 툭툭 옮기고,
00:07:40동시에 여러 브랜치를 유지하는 편이 훨씬 쾌적합니다.
00:07:43커밋 분할도 아주 쉽습니다. 'but new'라는 명령어가 있는데요.
00:07:51이렇게 입력하면,
00:07:54'but new'
00:07:56H e... 그러면
00:07:59내용이 비어있는 새로운 빈 커밋이 생성됩니다.
00:08:03이건 Jujutsu 스타일이죠. 아무것도 들어있지 않은 빈 커밋을 먼저 만들고
00:08:08나중에 파일을 그 안으로 'rub'해서 넣을 수 있습니다. 예를 들어
00:08:12이 파일을 선택해서
00:08:150
00:08:23가져오면
00:08:29파일이 새 커밋으로 이동합니다. 그다음 'describe'로 설명을 추가할 수 있죠.
00:08:32뭐였더라... X y c
00:08:45어떻게 하더라...
00:08:56Status -f를 보면 각 커밋에 포함된 파일들을 보여줍니다. 그냥 'but st'나
00:09:02'but status'는 커밋 목록만 보여주지만,
00:09:04'but status -f'는 그 안의 파일까지 보여주므로 러빙 기능을 통해 자유롭게 옮길 수 있습니다.
00:09:11'new'와 'describe'가 있고, 마지막으로 'marking'이 있습니다. 이것도 아주 Jujutsu스러운 기능이죠.
00:09:16Jujutsu를 써보신 분은 알겠지만, 특정 커밋을 타겟으로 '마크(mark)'할 수 있습니다.
00:09:21그러면 이후 발생하는 모든 변경 사항이 해당 커밋으로 들어갑니다. 정말 흥미로운 기능이죠.
00:09:25자, 해보겠습니다.
00:09:29'but new -m'을 하거나 'but mark'를 써서
00:09:33ZA를 선택하면
00:09:35여기에 마크가 생깁니다. 보시다시피 할당되지 않았던 변경 사항이 자동으로 그 레인(Lane)으로
00:09:42들어갔습니다.
00:09:44이제 커밋을 하거나, 혹은 특정 커밋을
00:09:47직접 마크할 수도 있습니다.
00:09:56아, 이건 브랜치였네요. 죄송합니다.
00:09:58특정 커밋을 마크한 상태에서 새로운 내용을 'echo' 등으로 추가하면
00:10:07그 즉시 해당 커밋에 자동으로 반영됩니다.
00:10:15여러 커밋이 쌓인 스택 브랜치에서 작업 중일 때 특히 유용한데, 현재 하는 모든 작업이
00:10:21세 단계 아래에 있는 커밋에 자동으로 수정(amend)되어 들어가는 식입니다.
00:10:26Jujutsu에서 'jj new'를 실행하고 작업을 시작하는 방식과 비슷합니다.
00:10:31마지막 커밋을 자동으로 계속 수정해 나가는 거죠.
00:10:33차이점은 어떤 커밋이든 자유롭게 마크해서
00:10:36작업을 이어갈 수 있고, 원할 때 언제든 마크를 해제할 수 있다는 점입니다.
00:10:41그렇죠.
00:10:44어쨌든, 이것들이 저희가 작업 중인 재미있는 기능들 중 일부입니다.
00:10:48이런 방식으로 작업하는 게 정말 편하더라고요.
00:10:52또 하나 Jujutsu에서 가져온 건 작업 로그(oplog)입니다.
00:10:56이건 저희가 꽤 오래전부터 구현해 온 기능인데요.
00:10:59Git Butler 앱을 보시면 모든 작업 내역을 보여주는 탭이 있습니다.
00:11:03명령어를 실행할 때마다 작업 기록이 생성되는데,
00:11:06Git Butler가 수행한 모든 이력을 확인하고 어느 시점으로든 복구할 수 있습니다. 예를 들어
00:11:12이렇게
00:11:13'undo'
00:11:14철자만 제대로 쓰면, 'undo' 명령으로 방금 한 작업을 취소하고 작업 디렉토리와 상태를
00:11:20이전 상태로 되돌릴 수 있습니다. 아니면
00:11:22'restore'
00:11:24특정 해시값(SHA)을 지정해서 복구할 수도 있죠.
00:11:26이런...
00:11:29그리고
00:11:33작업 디렉토리와 브랜치 등 모든 것을 이전 상태로 리셋합니다.
00:11:38이 기능 덕분에 데모를 하기가 참 편합니다. 확실히 작동하는 시나리오를
00:11:44하나 만들어두고, 거기로 복구해서 시나리오를 처음부터 다시 시작할 수 있으니까요.
00:11:50물론 실제 작업 중에도 '아, 이건 좀 아닌데' 싶을 때나
00:11:54충돌이 복잡해졌을 때 그냥 취소하고 다시 작업을 이어갈 수 있어 매우 유용합니다.
00:11:58네, 여기까지입니다. 아, 한 가지 더! 모든 명령어는 JSON 출력을 지원합니다. '-j'
00:12:06혹은 '--json' 옵션을 붙여서 실행하면 동일한 데이터를 JSON 형식으로 받을 수 있습니다.
00:12:11스크립트를 짤 때 Git의 porcelain 출력보다 훨씬 깔끔하고 편리하죠.
00:12:15결과값을 그대로 가져오거나 jq를 써서 특정 항목을 찾는 등
00:12:21CLI를 활용한 스크립트 작업이 훨씬 수월해질 겁니다.
00:12:24준비한 내용은 여기까지입니다. 감사합니다!

Key Takeaway

GitButler CLI는 Jujutsu의 혁신적인 개념을 Git 생태계에 접목하여, 병렬 브랜치 작업과 유연한 커밋 조작을 통해 개발자의 버전 관리 경험을 극적으로 단순화하고 효율화합니다.

Highlights

GitButler의 새로운 CLI 도구인 'but' 공개 및 Jujutsu(JJ) 프로젝트의 영감 언급

상태 요약(Short log) 기능을 통해 작업 디렉토리와 타겟 브랜치 간의 차이점을 직관적으로 확인

여러 브랜치를 동시에 작업할 수 있는 '병렬 브랜치(Parallel Branches)' 및 스택형 브랜치 관리 기능

스테이징 영역 간에 파일을 자유롭게 이동시키고 결합하는 '러빙(Rubbing)' 개념 도입

특정 커밋을 타겟으로 지정하여 변경 사항을 실시간 자동 반영하는 '마킹(Marking)' 기능

작업 이력을 기록하고 언제든 이전 상태로 되돌릴 수 있는 강력한 '실행 취소(Undo/Restore)' 및 작업 로그(Oplog) 지원

모든 명령어의 JSON 출력을 지원하여 스크립트 작성 및 데이터 가공의 편의성 극대화

Timeline

GitButler CLI 소개 및 배경

발표자 스콧 샤콘은 새로운 버전 관리 도구인 GitButler를 소개하며 세션을 시작합니다. 그는 이 프로젝트가 수년간 진행되었으며, 특히 Jujutsu(JJ) 프로젝트에서 많은 영감과 아이디어를 얻었음을 솔직하게 밝힙니다. 기존에는 주로 GUI 형태로 제공되었으나, 이번 데모에서는 개발 중인 CLI 버전을 최초로 공개하여 개발자들의 피드백을 구하고자 합니다. Git의 구조적 장점을 유지하면서도 Jujutsu의 현대적인 개념들을 어떻게 이식했는지 설명하는 것이 이 섹션의 핵심입니다. 사용자들에게 익숙한 Git 환경에서 더 진보된 도구를 제공하려는 의지를 엿볼 수 있습니다.

'but' CLI의 기본 명령과 상태 확인

GitButler CLI의 실행 명령어인 'but'의 명칭 유래와 기본 사용법을 다룹니다. 'but status' 명령어를 실행하면 Sapling이나 Jujutsu와 유사한 요약 로그 형식으로 현재 작업 디렉토리의 수정 사항을 보여줍니다. 이는 단순히 변경된 파일 목록을 보여주는 것을 넘어, 타겟 브랜치와의 차이점과 현재 보유한 커밋들을 시각적으로 명확하게 구분하여 제시합니다. 특히 '-f' 옵션을 사용하면 각 커밋 내부의 구체적인 파일 수정 내역까지 한눈에 파악할 수 있는 강력한 가독성을 제공합니다. GitButler GUI의 '레인(Lane)' 개념이 CLI 환경에서도 어떻게 깔끔하게 구현되었는지 강조합니다.

병렬 브랜치와 자동 참조 관리

GitButler의 가장 독보적인 기능 중 하나인 병렬 브랜치(Parallel Branches) 시스템을 상세히 설명합니다. 사용자는 하나 이상의 브랜치를 동시에 작업 영역에 올리고 작업할 수 있으며, 이는 기존 Git의 'update-ref' 설정보다 훨씬 자연스럽고 자동화된 방식으로 처리됩니다. 참조(refs) 업데이트와 리베이스 과정에서의 변경 사항 추적이 백그라운드에서 자동으로 이루어져 개발자의 인지 부하를 줄여줍니다. 데모를 통해 새 브랜치를 생성하고 기존 브랜치들과 나란히 존재하는 모습을 보여주며 스택형 구조의 편리함을 입증합니다. 이러한 구조는 복잡한 기능 개발 시 여러 문맥을 동시에 유지해야 하는 상황에서 매우 유용합니다.

멀티 스테이징과 '러빙(Rubbing)' 메커니즘

각 브랜치 스택마다 별도의 스테이징 영역을 가질 수 있는 기능을 소개하며, 이를 조작하는 '러빙(Rubbing)'이라는 독특한 용어를 설명합니다. 'but rub' 명령어를 사용하면 특정 파일을 원하는 스테이징 영역이나 브랜치로 즉시 할당하거나 이동시킬 수 있습니다. 마인크래프트의 제작대(Crafting Table) 개념에 비유하여, 서로 다른 요소들을 비벼서 새로운 커밋이나 상태를 만들어내는 직관적인 작업 방식을 제안합니다. 'but commit -o' 명령을 통해 특정 브랜치에만 선택적으로 커밋을 생성하는 과정을 시연하며 유연성을 강조합니다. 이 방식은 Git의 전통적인 add와 commit 절차를 획기적으로 단축하고 병렬화합니다.

커밋 수정, 합치기 및 파일 이동 기술

커밋을 취소하거나 수정하고, 여러 커밋을 하나로 합치는(Squash) 등의 고급 조작 기능을 시연합니다. 특수한 '00' 모드를 사용하여 커밋을 소프트 리셋 상태로 되돌리거나, 'but rub'으로 두 커밋을 결합하는 과정을 실제 터미널 화면으로 보여줍니다. 특히 특정 커밋에서 파일을 추출하여 다른 커밋으로 옮기는 작업이 Git보다 훨씬 간단하게 수행됨을 강조합니다. Git에서도 fixup이나 auto-squash로 가능은 하지만, GitButler는 이를 '비비는' 직관적인 행위 하나로 통합하여 복잡한 리베이스 과정을 단순화합니다. 사용자가 나이가 들어 글자가 잘 안 보인다는 농담을 섞어가며 라이브 데모의 생동감을 더합니다.

빈 커밋 생성과 마킹(Marking) 기능

Jujutsu 스타일의 작업 방식인 빈 커밋 생성('but new')과 마킹(Marking) 기능을 상세히 다룹니다. 먼저 빈 커밋을 만들고 나중에 콘텐츠를 그 안으로 옮겨 넣는 방식은 작업의 논리적 구조를 먼저 잡는 데 유리합니다. 'but mark' 명령으로 특정 커밋을 타겟으로 지정하면, 이후 발생하는 모든 파일 수정 사항이 해당 커밋에 실시간으로 자동 반영(Auto-amend)됩니다. 이는 스택 브랜치의 깊은 곳에 있는 커밋을 수정하기 위해 일일이 리베이스할 필요가 없음을 의미합니다. 마크를 자유롭게 설정하고 해제하며 작업의 흐름을 제어하는 방식은 현대적인 버전 관리의 새로운 패러다임을 제시합니다.

작업 로그(Oplog)와 실행 취소 및 JSON 출력

마지막으로 시스템의 안정성을 책임지는 작업 로그(Oplog)와 데이터 활용성을 높여주는 JSON 출력 기능을 소개합니다. 'undo'와 'restore' 명령어를 통해 과거의 어떤 시점으로든 작업 디렉토리 상태를 완벽하게 복구할 수 있어, 복잡한 충돌이나 실수로부터 자유로워집니다. 이는 데모 시나리오를 반복하거나 실제 개발 중 막다른 길에 다다랐을 때 탈출구 역할을 하는 강력한 안전장치입니다. 또한 모든 명령어에 '-j' 옵션을 지원하여 jq와 같은 도구로 데이터를 처리하거나 커스텀 스크립트를 짜는 개발자들에게 최적의 환경을 제공합니다. 발표자는 Git의 porcelain 출력보다 훨씬 사용하기 편리하다는 점을 강조하며 세션을 마무리합니다.

Community Posts

View all posts