커리큘럼
아카데미모듈 6 · 노트 너머의 표면
버전 관리: 내장 Git 패널
이 레슨에서 배우는 것
- "소스 제어" 패널을 열고, 어떤 워크스페이스든 Git 저장소로 만들거나 한 번의 흐름으로 GitHub에 게시할 수 있습니다.
- 파일을 스테이징하고, AI가 써 주는 메시지로 커밋하고, 푸시할 수 있습니다. 커밋 버튼이 이따금 꺼져 있는 이유도 설명할 수 있습니다.
- 좌우 비교 디프를 읽고, 블록(헝크)을 하나씩 스테이지하고 취소하고 되돌릴 수 있습니다.
- 브랜치를 전환하고, 만들고, 지우고, 색 레인으로 그려진 커밋 그래프를 읽을 수 있습니다.
- 마크다운만 버전 관리해도 충분한 이유, 곧 지식그래프는 언제든 다시 만들 수 있다는 점을 설명할 수 있습니다.
금요일입니다. 월요일의 나는 프로젝트 계획 노트를 갈아엎으면서 두 섹션을 통째로 지웠습니다. 오늘 그중 한 문단이 다시 필요해졌는데, 실행 취소는 나흘 전에 이미 물 건너갔습니다. 워크스페이스가 Git 저장소였다면 30초짜리 심부름입니다. 히스토리를 열고, 월요일 커밋을 찾고, 디프에서 옛 문장을 읽으면 그만이죠.
Consilience에는 VS Code의 Git 화면을 그대로 본뜬 소스 제어 패널이 통째로 들어 있습니다. 앱을 떠나지 않고도 무엇이 바뀌었는지 확인하고, 스테이징해서 커밋하고, 푸시와 풀까지 합니다. 원하면 AI가 커밋 메시지를 써 주고, 브랜치와 스태시, 색 레인 커밋 그래프도 모두 같은 패널에 있습니다.
패널 찾기, 저장소 만들기
패널로 들어가는 길은 세 가지입니다.
- 타이틀바: 왼쪽 위 세그먼트 컨트롤에 브랜치 아이콘 세그먼트가 있습니다(툴팁 "소스 제어"). 채팅, 파일 트리 세그먼트 바로 옆입니다.
- 메뉴 막대: Go → Source Control. 패널을 여는 기본 키보드 단축키는 따로 없습니다.
- 명령 팔레트: "Show source control"(소스 제어 표시) 명령을 실행합니다.
패널은 열려 있는 워크스페이스 폴더 또는 그 위쪽 폴더에서 저장소를 찾습니다. 워크스페이스가 더 큰 저장소 안에 있어도 잘 동작합니다. 저장소가 아예 없으면 "이 폴더는 git 저장소가 아닙니다."라는 빈 화면과 버튼 두 개가 보입니다. "저장소 초기화"(git init 실행)와 "GitHub에 게시"(아래에서 다루는, 한 번에 끝나는 흐름)입니다. Git이 아직 설치되지 않았다면 앱이 이를 알아채고, "Git 받기" 버튼을 누르면 다운로드 페이지가 바로 열립니다.
스테이징, 커밋, 푸시
변경 목록은 VS Code와 똑같이 그룹으로 나뉩니다. 비어 있지 않은 그룹만 개수 배지와 함께 나타나고, 마우스를 올리면 동작 버튼이 드러납니다. 각 행에는 파일명, 폴더(흐리게), +N/−N 줄 수, 그리고 색 있는 상태 문자가 붙습니다. M 수정, A 추가, D 삭제, R/C 이름 변경이나 복사, T 타입 변경, U 추적되지 않음(초록)을 뜻하고, 충돌 파일은 주황색입니다.
| 그룹 | 여기 들어오는 것 |
|---|---|
| "병합 변경 사항" | 병합 중 충돌한 파일. 충돌 마커는 일반 에디터에서 고친 뒤 스테이징합니다. |
| "스테이징된 변경 사항" | 인덱스에 올라간 파일, 곧 다음 커밋에 담길 내용 그대로입니다. 헤더에 마우스를 올리면 "모두 스테이징 취소"가 나옵니다. |
| "변경 사항" | 작업 트리에서 수정된 추적 파일. 헤더에 마우스를 올리면 "모든 변경 사항 스테이징"과 "추적 중인 모든 변경 사항 버리기"가 나옵니다. |
| "추적되지 않음" | Git이 아직 모르는 새 파일. 커밋에 담으려면 스테이징합니다. |
커밋은 Git의 2단계 동작입니다. 행에 마우스를 올려 +로 스테이징하고, 메시지를 쓴 뒤 "커밋"을 누릅니다. 두 조건이 다 갖춰질 때까지 버튼은 꺼진 채로 남고, 툴팁이 "커밋하기 전에 변경 사항을 스테이징하세요." 또는 "먼저 커밋 메시지를 작성하세요."라고 빠진 쪽을 짚어 줍니다.
메시지 쓰기가 귀찮다면 입력창의 반짝이 아이콘 "커밋 메시지 생성"을 누릅니다. 스테이징된 디프를 AI가 읽고 Conventional Commits 형식의 메시지를 채워 줍니다. 커밋 버튼 옆 화살표 메뉴에는 "커밋 후 푸시"와 "커밋 수정 (Amend)"이 있고, 푸터의 "변경 사항 동기화" 버튼은 pull과 push를 한 번에 실행합니다.
docs(plans): fold Q3 scope cuts into the decision log- 스테이징(Staging)
- Git의 2단계 커밋. 먼저 변경을 인덱스에 골라 담고(+ 버튼), 담긴 것만 커밋합니다. Consilience는 스테이징 없이 커밋하지 않습니다.
- 헝크(블록)
- 디프 안에서 연속으로 바뀐 줄 묶음 하나. 디프 탭은 블록마다 스테이지, 취소, 되돌리기 버튼을 따로 달아 줍니다.
- 스태시(Stash)
- 커밋하지 않은 작업을 얹어 두는 Git의 선반. 스태시 명령과 이 앱의 '취소'가 모두 여기로 보내며, "적용 후 삭제"로 되찾습니다.
- 업스트림(Upstream)
- 로컬 브랜치가 동기화하는 원격 브랜치. 업스트림이 생기기 전에는 "변경 사항 동기화" 대신 게시 버튼이 보이고, 첫 푸시가 이걸 자동으로 설정합니다.
- 커밋 그래프
- 패널의 "그래프" 섹션. 브랜치·태그 같은 참조(ref) 전체에 걸친 최근 커밋을 색 브랜치 레인과 ref 알약으로 그립니다.
디프 탭: 블록 하나씩 다루기
변경된 행을 한 번 클릭하면 읽기 전용 디프가 일반 탭으로 열립니다. 작업 트리 변경은 파일명 (변경 사항), 인덱스 쪽은 파일명 (스테이지됨)으로 열리고, 같은 파일의 두 탭을 동시에 띄울 수도 있습니다. (더블클릭은 파일 자체를 엽니다.)
기본은 좌우 비교이고, 바뀌지 않은 구간은 접혀 있다가 구분선을 눌러 펼칩니다. 떠 있는 툴바로 변경 사이를 건너뛰고(F8 / Shift+F8) 좌우/인라인 보기를 전환합니다. 오른쪽 가장자리의 오버뷰 눈금은 변경 위치마다 클릭 가능한 색 마커를 찍습니다.
- 작업 트리 디프에서는 변경 블록마다 거터 버튼이 붙습니다. + "이 블록 스테이지", ⟲ "이 블록 되돌리기"(확인창: "이 블록을 되돌릴까요? 변경 내용이 사라집니다.").
- 스테이지됨 디프에서는 대신 −(이 블록 스테이징 취소)가 붙습니다.
- 지저분한 파일 하나를 깔끔한 커밋 두 개로 쪼개는 방법이 바로 이것입니다. 같이 갈 블록만 스테이징해 커밋하고, 나머지를 다시 스테이징합니다.
- 덤: 모든 마크다운, 코드 에디터에는 Git HEAD와 다른 줄을 표시하는 거터 막대(추가는 초록, 삭제는 빨강)가 있고, 타이핑할 때마다 다시 계산됩니다.
이해도 체크
수정한 노트에 "변경 사항 취소"를 눌렀는데, 곧바로 후회했습니다. 어떻게 되돌립니까?
브랜치와 히스토리
푸터의 브랜치 버튼은 현재 브랜치 이름(브랜치가 아니라 특정 커밋을 체크아웃했다면 "(브랜치 없음)")과 ↓N ↑N 뒤짐/앞섬 개수를 보여줍니다. 이 버튼을 누르거나 … → 브랜치 → "브랜치 전환…"을 고르면, 검색과 생성이 한 입력창에 담긴 브랜치 선택기가 열립니다("브랜치 검색 또는 생성…"). 없는 이름을 입력하고 Enter를 치면 "'{이름}' 브랜치 생성"이 실행됩니다. 로컬 브랜치를 클릭하면 체크아웃되고, 원격 섹션의 브랜치를 고르면 로컬 추적 브랜치가 만들어집니다.
브랜치에 마우스를 올리면 삭제 버튼이 나옵니다. 병합되지 않은 브랜치라면 Git이 거부하고, 대화상자가 아직 병합되지 않았다고 알려 줍니다. 빨간 "강제 삭제" 버튼은 그 작업이 영영 사라진다고 못 박습니다.
맨 아래 "그래프" 섹션은 모든 ref에 걸친 최근 히스토리를 색 브랜치 레인으로 그립니다. ref 알약의 색이 곧 범례입니다. 체크아웃된 브랜치(HEAD)는 파랑, 원격 브랜치는 보라, 태그는 호박색, 나머지 로컬 브랜치는 회색입니다. 헤더 아이콘으로 "현재 커밋으로 이동", "모든 원격에서 가져오기", "가져오기 (Pull)", "푸시", "새로 고침"을 실행합니다. 그래프는 읽기 전용이라, 커밋에 할 수 있는 조작은 우클릭 → "커밋 해시 복사" 하나뿐입니다.
이해도 체크
커밋 메시지를 다 썼는데 "커밋" 버튼이 여전히 꺼져 있습니다. 가장 그럴듯한 이유는?
GitHub: 게시, 로그인, PR
GitHub 기능은 게시, 클론, 로그인, Pull Request까지 전부 공식 GitHub CLI(gh)를 거칩니다. gh가 없으면 "GitHub CLI가 필요합니다" 대화상자와 "GitHub CLI 받기" 버튼이 나옵니다. Homebrew로 설치한 gh도 Dock에서 실행한 앱이 잘 찾습니다.
로그인은 GitHub 기기 코드(Device Flow) 방식입니다. "GitHub 로그인" 모달이 짧은 코드를 보여주고("코드 복사" 버튼도 있습니다) 브라우저를 연 뒤 승인을 기다립니다. 터미널에서 gh auth login을 실행하는 대체 경로도 있습니다. 액세스 토큰은 gh에 바로 저장되고 화면에는 나타나지 않습니다.
워크스페이스를 한 흐름으로 GitHub에 올리기
빈 상태에서 시작
아직 저장소가 아닌 워크스페이스에서 소스 제어를 열고 "GitHub에 게시"를 누릅니다. 버튼 아래 힌트가 그대로 설명합니다. "게시하면 저장소를 초기화한 뒤 로그인하여 새 GitHub 저장소로 푸시할 수 있습니다."
git init은 앱이 대신 실행합니다.기기 코드로 로그인
gh가 로그인 전이면 "GitHub 로그인" 모달이 짧은 코드를 띄우고 브라우저를 엽니다. 브라우저에 코드를 입력하고 "승인 대기 중…"이 끝나기를 기다립니다.이름 짓고, 비공개 유지
"GitHub에 게시" 대화상자의 "저장소 이름"에는 폴더 이름이 미리 채워져 있습니다. "비공개 저장소" 토글은 기본으로 켜져 있습니다. 공개로 바꾸기 전까지는 나만 볼 수 있습니다.
게시
"GitHub에 게시"를 누릅니다. 커밋이 하나도 없으면 초기 커밋을 만들고, GitHub 저장소를 생성하고, 푸시한 뒤 성공 토스트를 띄웁니다.
저장소가 GitHub에 올라가면 그래프 위에 "Pull Request" 영역이 고정됩니다. 열린 PR이 #번호와 함께 나열되고(열림은 초록, 초안은 회색 아이콘), 영역 푸터에는 로그인된 @아이디가 보입니다. + 버튼으로 연 생성 대화상자에서 "제목"과 "설명"을 채우고 "생성"을 누르면, 현재 브랜치에서 기본 브랜치로 PR이 열립니다.
PR에 마우스를 올리면 "PR 체크아웃"(로컬 gh pr checkout)과 "브라우저에서 열기"가 나옵니다. 클론도 같은 패널에 있습니다. … → "저장소 클론…"에 owner/name이나 URL을 넣으면 그대로 받아옵니다.
떠나기 전에 한 가지 더. 채팅 컴포저의 @ 메뉴에는 "Main과 비교"(Diff with Main) 항목이 있어서, main 기준 작업 트리 디프를 메시지에 첨부할 수 있습니다. 커밋하기 전에 에이전트에게 리뷰를 맡기기 좋습니다. 다음 강의에서는 에이전트와 함께 쓰는 터미널 독, 그리고 코드가 지식그래프의 일부가 되는 과정을 봅니다.