레슨 22 · 역사와 통합
로컬 커밋 재정렬, 스쿼시, 단어 변경 및 삭제
5개의 대략적인 개인 커밋을 2개의 깔끔한 커밋으로 전환합니다. 즉, 종속 수정 사항 이동, 메시지 수정, 단계 접기 및 스쿼시, 노이즈만 삭제하고 결과에 정확히 의도한 파일이 있는지 확인합니다.
- 레벨: 고급
- 10분 읽음
- 7분 동영상
- 업데이트됨
- 이 수업 전에: 게시되지 않은 작업을 새 기반으로 리베이스
이 브라우저에 진행 상황이 저장되었습니다.
재생하면 YouTube에서 동영상이 로드됩니다(개인정보 보호 강화 모드).
무엇을 배울 것인가
- 재생 계획 읽기: 가장 오래된 단계부터, 위에서 아래로 적용됩니다.
- 단어 변경, 스쿼시, 수정, 삭제 등 올바른 작업을 선택하세요.
- 종속된 단계를 중단하지 않고 단계를 이동합니다.
- 나중에 새 커밋, 파일 및 복구 분기를 확인하십시오.
시작하기 전에
귀하의 브랜치 private/signup-polish에는 커밋 M 외에 귀하의 컴퓨터에만 존재하는 5개의 커밋이 있습니다. 작업 트리는 깨끗하며 rescue/before-polish은(는) 다섯 번째 커밋을 가리킵니다. 순서대로 오래된 것부터:
| 단계 | 커밋 | 기능 |
|---|---|---|
| C1 | 특기: 가입 초안 추가 | 가입 양식을 추가합니다 |
| C2 | 문서: 가입 검토 설명 | docs/replay-a.md을(를) 추가합니다 |
| C3 | 문서: 유효성 검사 설명 | docs/replay-b.md을(를) 추가합니다 |
| C4 | 수정! 특기: 가입 초안 추가 | 양식의 레이블을 수정합니다. |
| C5 | 집안일: 임시 메모 | docs/temporary-review.md을(를) 추가합니다 |
모든 것이 로컬이며 무료 요금제(GitTree에서 로그인을 요청함)입니다. 호스팅 계정도 없고, 공급자도 없고, 인터넷도 없습니다. 모든 신원은 허구입니다(example.com). 실제 프로젝트에서 이 강의를 실행하지 말고, 다른 사람이 이미 가지고 있는 커밋을 다시 작성하지 마세요.
동일한 사본에서 둘 다 수행하지 말고 GitTree 또는 기본 Git 명령을 사용하여 변경하십시오. 결과를 읽는 것은 항상 안전합니다. 메뉴 라벨은 GitTree 2.0의 자체 문자열에서 왔으며 기본 명령은 일회용 복사본에서 Git 2.43을 사용하여 실행되었습니다. GitTree 단계가 macOS, Windows 또는 Linux에서 실행되지 않았습니다.
개념 및 상태 효과
대화형 리베이스는 정렬 게임이 아닌 계획입니다. Git은 나열된 커밋을 베이스에서 목록의 위에서부터 아래로 하나씩 재생하므로 가장 오래된 단계가 먼저 옵니다. 각 작업은 Git에게 한 단계로 수행할 작업을 알려줍니다.
- Pick는 커밋을 그대로 유지합니다.
- Reword은(는) 콘텐츠를 유지하고 새 메시지를 작성할 수 있도록 해줍니다.
- Squash는 커밋을 그 위에 보관된 커밋으로 접어 하나의 결합된 메시지를 작성할 수 있게 해줍니다.
- Fixup도 그것을 접지만 자체 메시지를 버립니다.
- Drop는 커밋의 변경 사항을 완전히 삭제합니다.
주문이 중요합니다. 다른 단계에 의존하는 단계(여기서 레이블 수정에는 C1의 양식이 필요함)는 그 아래에 있어야 합니다. 편집기를 사용하면 위로 이동할 수 있으며 충돌로 인해 재생이 중지됩니다. GitTree은 또한 Git이 실행할 수 없는 계획, 즉 모든 커밋을 삭제하는 계획, 접을 수 있는 항목이 없는 스쿼시, 빈 메시지를 거부합니다.
재생된 모든 커밋은 상위 항목이 변경되므로 새 ID를 얻습니다. 이 분기만 다시 작성됩니다. 구조 부서는 오래된 5개를 보관합니다. 이미 원격에 있는 커밋은 "원격에서"로 표시되며 다시 작성하려면 명시적인 확인이 필요합니다. 이번 강의에서는 결코 그것을 확인하지 않습니다.
여러분이 구축할 계획은 5개의 커밋을 2개의 커밋으로 바꿉니다.
| 단계 | 커밋 | 액션 | 결과 |
|---|---|---|---|
| 1 | C1 | 다시 말하다 | 특기: 지역 가입 양식 작성 |
| 2 | C4 | 수정 | 1단계로 접어서 |
| 3 | C3 | 선택 | 보관; 스쿼시 타겟 |
| 4 | C2 | 스쿼시 | 문서: 가입 검토 및 검증 설명 |
| 5 | C5 | 드롭 | 사라졌다 |
정확한 프로젝트 상태 준비
18과에서 남긴 프로젝트의 별도의 일반 복사본에서 시작하세요. 원본 gittree-features을(를) 그대로 둡니다. 새 브랜치에서 한 번에 한 파일씩 아래 5개의 커밋을 빌드하고 이름이 지정된 단계에서만 각 전체 본문을 저장합니다.
완전한 파일 입력
아래에 명명된 단계에서만 저장하십시오. 이는 최종 개행 문자가 포함된 완전한 UTF-8/LF 본문입니다. 마크다운 펜스를 붙여넣지 마세요. 변경되지 않은 실행 가능 파일은 명명된 입력을 상속합니다. 별도의 변형 버전이 원본을 덮어쓰면 안 됩니다.
index.html — 가입
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
<section aria-labelledby="signup-title">
<h2 id="signup-title">Try the demo form</h2>
<form id="signup-form" novalidate>
<label for="demo-email">Demo email</label>
<input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
<p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
<button type="submit">Check the address locally</button>
<p id="signup-result" role="status"></p>
</form>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>docs/replay-a.md — DOC_A
# Local signup review
Review the label and hint together.docs/replay-b.md — DOC_B
# Local validation review
No address leaves this demonstration.index.html — SIGNUP_LABEL
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
<section aria-labelledby="signup-title">
<h2 id="signup-title">Try the demo form</h2>
<form id="signup-form" novalidate>
<label for="demo-email">Fictional email address</label>
<input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
<p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
<button type="submit">Check the address locally</button>
<p id="signup-result" role="status"></p>
</form>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>docs/temporary-review.md — DOC_NOISE
Temporary rehearsal note, deliberately dropped.GitTree에서
Command+Shift+P(Ubuntu에서는 Ctrl+Shift+P)를 사용하여 팔레트를 엽니다. 커밋에 대한 작업은 커밋의 오른쪽 클릭 메뉴를 사용합니다.
- 다음 섹션에 표시된 것처럼 5개의 커밋과 복구 브랜치를 빌드하고
private/signup-polish을 체크아웃하고 정리합니다. M과 5개의 과목을 참고하세요. - 5개 바로 아래에 있는 커밋인 M을 마우스 오른쪽 버튼으로 클릭하고 Edit History → Interactive Rebase of the Commits Above…를 선택합니다. 편집기는 5개의 비공개 단계(오래된 단계부터)로 열립니다.
- Options for this rebase 아래에서 Arrange fixup!, squash! and amend! commits을(를) 포함한 세 가지 옵션을 모두 꺼두세요. 수정 사항을 직접 이동합니다.
- C4 행에 초점을 맞추고 Alt+↑를 두 번 누른 다음 C3에 초점을 맞추고 Alt+↑를 한 번 누릅니다. 이제 순서는 C1, C4, C3, C2, C5입니다. 초점이 맞춰진 행에서 p, r, e, s, f 또는 d를 누르면 Pick, Reword, Edit, Squash, Fixup 또는 Drop이 설정됩니다.
- C1을 Reword로 설정하고 메시지 필드에
feat: complete the local signup form를 입력합니다. C4를 Fixup로 설정합니다. - C3을 Pick로 유지하고 C2를 Squash로 설정합니다. Squashed commits 아래에 "2개의 문서 커밋: 유효성 검사 설명" 그룹에 결합된 메시지가 표시됩니다.
docs: explain signup review and validation로 바꾸세요. - C5를 Drop로 설정합니다. 모든 행과 결합된 메시지를 다시 한 번 읽어보세요. "원격에서"라고 표시된 항목이 없으므로 확인이 필요하지 않습니다.
- Start Rebase을 한 번 선택하고 기다리세요. 중지되면 배너를 사용하여 계속하세요. 전체 계획을 다시 시작하지 마십시오.
- 두 개의 새로운 커밋, 페이지의 레이블 수정, 두 문서 모두 확인하고 임시 메모는 없습니다.
rescue/before-polish을(를) 유지하고 작업 트리를 깨끗하게 유지합니다.
과정의 모든 일반적인 커밋에 대해: Summary는 명시된 주제이고, Description는 비어 있으며, 옵션 Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit 및 Allow Empty Commit는 꺼져 있습니다.
터미널에서
새 브랜치에 5개의 커밋을 빌드하고 해당 단계에서 각 전체 본문을 저장합니다.
git switch --create private/signup-polishSIGNUP을 index.html로 저장한 후:
git add -- index.html
git commit --quiet -m "feat: add signup draft"DOC_A를 docs/replay-a.md로 저장한 후:
git add -- docs/replay-a.md
git commit --quiet -m "docs: explain signup review"DOC_B를 docs/replay-b.md로 저장한 후:
git add -- docs/replay-b.md
git commit --quiet -m "docs: explain validation"SIGNUP_LABEL을 index.html로 저장한 후:
git add -- index.html
git commit --quiet -m "fixup! feat: add signup draft"DOC_NOISE를 docs/temporary-review.md로 저장한 후:
git add -- docs/temporary-review.md
git commit --quiet -m "chore: temporary note"이전 팁을 보호하고 범위를 가장 오래된 것부터 나열합니다.
git branch rescue/before-polish
BASE_SHA="$(git rev-parse HEAD~5)"
git log --reverse --format=%s "$BASE_SHA"..HEAD이제 대화형 리베이스를 시작합니다(-i는 --interactive의 약식입니다). Git은 할 일 목록이 포함된 편집기를 엽니다(ID는 다를 수 있음).
git rebase --interactive --no-autosquash --no-update-refs --no-autostash "$BASE_SHA"pick 1a2b3c4 feat: add signup draft
pick 2b3c4d5 docs: explain signup review
pick 3c4d5e6 docs: explain validation
pick 4d5e6f7 fixup! feat: add signup draft
pick 5e6f708 chore: temporary note각 줄의 고유 ID를 유지하면서 다섯 줄을 계획에 다시 작성하고 다음을 저장합니다.
reword 1a2b3c4 feat: add signup draft
fixup 4d5e6f7 fixup! feat: add signup draft
pick 3c4d5e6 docs: explain validation
squash 2b3c4d5 docs: explain signup review
drop 5e6f708 chore: temporary noteGit은 편집기를 두 번 더 엽니다. 다시 말하려면 메시지를 feat: complete the local signup form으로 바꾸세요. 스쿼시의 경우 두 메시지가 모두 표시됩니다. docs: explain signup review and validation 한 줄로 바꾸세요. 결과를 확인하세요:
git rev-list --count "$BASE_SHA"..HEAD
git log --reverse --format=%s "$BASE_SHA"..HEAD
git status --short2
feat: complete the local signup form
docs: explain signup review and validation상태가 비어 있습니다. index.html은(는) SIGNUP_LABEL입니다. 두 문서는 모두 존재하지만 docs/temporary-review.md은(는) 존재하지 않습니다.
첫 번째 줄에 스쿼시를 넣으면 Git은 error: cannot 'squash' without a previous commit와 함께 즉시 중지됩니다. git rebase --edit-todo 및 git rebase --continue를 사용하여 목록을 수정하거나 git rebase --abort을 사용하여 그대로 둡니다. --autosquash를 사용하면 Git이 fixup!에 대한 이동 및 작업을 커밋합니다. 이번 강의에서는 계획을 보여주기 위해 이 기능을 끕니다.
결과
Where you end: M 위에 두 개의 재작성된 커밋, "feat: 로컬 가입 양식 완성" 및 "docs: 가입 검토 및 유효성 검사 설명". 페이지에 레이블 수정 사항이 있고 두 문서가 모두 있지만 임시 메모는 없습니다. 이전 5개 커밋은 구조 브랜치에 의해 보관되며 작업 트리는 깨끗합니다.
일반적인 실수
- Drop을 사용하여 필요할 수 있는 커밋을 숨깁니다. 변화는 새로운 역사에 전혀 없습니다.
- 수정 사항이 수정된 커밋 위로 수정 사항을 이동합니다.
- 접을 부분이 없는 첫 번째 단계를 스쿼시합니다.
- 결과를 먼저 확인하지 않고 계획이 끝난 후 다시 시작합니다.
뭔가 잘못되면
시작하기 전에 Cancel는 분기를 그대로 둡니다. GitTree에 편집기가 열린 이후 분기가 변경되었다고 표시되면 편집기를 닫았다가 다시 엽니다. 리베이스가 중지되면 충돌이나 메시지를 수정하고 배너에서 계속하거나 의도적으로 중단하세요. 완료된 후 복원을 시도하기 전에 rescue/before-polish과(를) 비교하세요.
이해도를 확인해보세요
각 질문에 답한 후 그 이유를 읽어보세요. '필수'라고 표시된 질문은 수업 완료에 반영됩니다.
6개 중 0개 정답
수업을 완료하려면 필수 질문에 올바르게 답하세요.
이 브라우저에서 확인했습니다.
연습
계획 C1, C4, C3, C2, C5와 살아남은 두 메시지를 설명하세요. 이전 범위 5, 새 범위 2, 예상 파일을 확인하고 메모는 없습니다. 그런 다음 실행하지 않고 C4를 C1 위로 이동하거나 1단계를 스쿼시하는 것이 작동하지 않는 이유를 예측하세요.
귀하의 확인: 사이트에서 귀하의 컴퓨터를 볼 수 없습니다.
수업을 완료하려면 필수 질문에 올바르게 답하고 실제 연습을 확인하세요.
요약
- 재생 계획에는 순서와 종속성이 있습니다.
- Squash는 결합할 수 있도록 두 메시지를 모두 보관합니다. fixup은 자체 수정을 삭제합니다.
- Drop은 변경 사항 자체를 제거하므로 실제 노이즈만 삭제합니다.
관련된
용어집 소개
Reword - إعادة صيات; 스쿼시 - دمّ; 수정 — دمّ مع تجاهل الرسالة; 드롭 - إسقات; 재생 계획 - اتاتادة تصبيق.
비디오 대본
영상의 나레이션, 큐별로.
성적표 표시
- 5개의 대략적인 커밋은 2개의 깨끗한 커밋이 됩니다. 안전하게.
- 대화형 리베이스는 계획입니다. 단계부터 오래된 것부터.
- Git은 목록을 위에서 아래로 재생합니다. 기지.
- 각 단계에는 선택, 다시 말하기, 스쿼시, 수정 또는 드롭.
- 먼저 5개의 비공개 커밋을 빌드하고 구조 지점.
- 세 가지는 실제 작업입니다. 하나는 수정이고 하나는 일시적인 소음입니다.
- 그 아래에 있는 커밋을 마우스 오른쪽 버튼으로 클릭하고 편집 기록을 엽니다.
- 커밋의 대화형 리베이스 선택 위.
- 편집기에는 가장 오래된 다섯 단계가 나열됩니다. 먼저.
- 세 가지 옵션을 모두 해제해 두세요. 우리는 움직일 것이다 우리 스스로 고쳐요.
- 수정 사항은 커밋 직후에 속합니다. 그것은 고쳐진다. 두 번 위로 이동합니다.
- 이제 유효성 검사 메모를 리뷰노트.
- 이제 순서는 하나, 넷, 셋, 둘, 다섯.
- 첫 번째 단계를 Reword로 설정하고 작성합니다. 새 메시지.
- 수정 단계를 수정으로 설정합니다. 그 메시지 버려집니다.
- 확인 메모를 보관하고 메모를 검토하세요.
- Squash는 두 메시지를 모두 표시합니다. 하나 쓰세요 쌍을 위한 메시지입니다.
- 임시 메모를 삭제하세요. 그 변화는 살아남지 못함.
- 모든 행을 다시 한 번 읽어보세요. 아무것도 없습니다 원격.
- Start Rebase을 한 번 선택하고 기다리세요. 마무리하기 위해.
- 이제 그래프 위에 두 개의 커밋이 있습니다. 베이스.
- 둘 다 새로운 ID를 가지고 있습니다. 오래된 5개는 위에 있어요 구조 지점.
- 페이지를 엽니다. 라벨 수정 사항이 있습니다. 는 소음이 없어졌습니다.
- 이제 터미널에서도 동일한 계획이 적용됩니다. git rebase -i.
- Git이 할 일 목록을 엽니다. 오래된 것부터 모두 선택하도록 설정합니다.
- 우리 계획에 다음 줄을 다시 작성하세요. 수정, 선택, 스쿼시, 드롭.
- Git은 두 개의 메시지를 요청합니다. 하나 쓰세요 각각 줄.
- 기본 이상의 커밋 수를 셉니다. 2개.
- 주제를 나열하십시오. 우리는 이 둘이에요 썼다.
- 상태가 비어 있고 임시 메모는 다음과 같습니다. 사라졌다.
- 입력 변경: 스쿼시를 첫 번째 단계.
- 그 위에는 접을 수 있는 것이 없으므로 Git은 거절합니다.
- 또는 수정 사항을 커밋 위로 이동합니다. 충돌로 인해 재생이 중지됩니다.
- 중지되면 수정하고 계속하세요. 아니면 중단하면 아무것도 바뀌지 않습니다.
- 구조대는 여전히 당신을 붙잡고 있습니다. 원래 5개 커밋.
- 다른 사람이 커밋한 내용을 다시 작성하지 마세요. 이미 있습니다.
- 연습: 계획을 설명하고 단계를 밟는 이유를 설명하세요. 스쿼시가 될 수는 없습니다.
- 다음으로, 병합 또는 리베이스가 중지됩니다.