레슨 25 · 역사와 통합
Cherry-Pick을 사용하여 선택한 커밋 적용
전체 브랜치를 병합하지 않고 팀원의 수정 사항을 릴리스 브랜치에 복사한 다음 새 커밋, 작성자, 파일 및 남아 있는 내용을 확인하세요.
- 레벨: 중급
- 8분 읽음
- 5분 동영상
- 업데이트됨
- 이 수업 전에: HEAD를 이동하지 않고 기록 읽기, 병합 및 리베이스 충돌 해결
이 브라우저에 진행 상황이 저장되었습니다.
재생하면 YouTube에서 동영상이 로드됩니다(개인정보 보호 강화 모드).
무엇을 배울 것인가
- 복사할 커밋 하나를 선택하고 그 상위 커밋이 왜 나타나지 않는지 확인하세요.
- 새 커밋의 ID, 작성자 및 커미터를 예측합니다.
- 강제로 실행하기 전에 누락된 종속성이나 이미 적용된 변경 사항을 인식하세요.
- 소스 브랜치에 대해 결과를 확인하세요.
시작하기 전에
Priya의 브랜치 priya/label는 공유 기준 B(가입 페이지)보다 높은 두 개의 커밋을 보유합니다. 첫 번째는 docs/temporary-review.md을 추가하는 관련 없는 메모인 "docs: un관련 소스 노트"입니다. 두 번째는 index.html의 라벨을 변경하는 수정 사항인 "수정: 가상 이메일 라벨 명확화"입니다. 귀하의 브랜치 release/label는 동일한 기준 B에서 시작하고 docs/integration-note.md를 추가하는 "docs: Record target review"라는 자체 커밋이 하나 있습니다. release/label이(가) 체크아웃되었고 작업 트리가 깨끗해졌습니다. 당신은 그녀가 당신의 지점에서 문제를 해결하길 원하지만 그녀의 메모는 원하지 않습니다.
모든 것이 로컬이며 무료 요금제(GitTree에서 로그인을 요청함)입니다. 호스팅 계정도 없고, 공급자도 없고, 인터넷도 없습니다. 모든 신원은 허구입니다(example.com). 실제 프로젝트에서는 이 강의를 실행하지 마세요.
동일한 사본에서 둘 다 수행하지 말고 GitTree 또는 기본 Git 명령을 사용하여 변경하십시오. 결과를 읽는 것은 항상 안전합니다. 메뉴 라벨은 GitTree 2.0의 자체 문자열에서 왔으며 기본 명령은 일회용 복사본에서 Git 2.43을 사용하여 실행되었습니다. GitTree 단계가 macOS, Windows 또는 Linux에서 실행되지 않았습니다.
개념 및 상태 효과
Cherry-Pick은 자신의 상위 커밋에 대해 측정된 한 커밋의 변경 사항을 가져와 현재 있는 브랜치에 new 커밋으로 적용합니다. 상위 항목을 가져오지 않으며 그 전에 커밋을 가져오지도 않습니다. 이것이 바로 Priya의 수정 사항을 받아 메모를 남겨둘 수 있는 이유입니다.
소스 커밋은 건드리지 않습니다. 새 커밋에는 새 상위가 있기 때문에 새 ID가 있지만 원래 작성자와 메시지는 유지됩니다. 이 커밋을 수행한 사람은 바로 당신입니다. 동일한 메시지를 사용한 동일한 변경은 여전히 다른 커밋입니다.
의존성은 여전히 중요합니다. 수정 사항은 가입 양식의 한 줄을 편집하므로 대상 분기에 해당 양식이 이미 있어야 합니다. 그렇지 않은 경우 Git은 충돌로 인해 중지됩니다. 대상에 이미 동일한 변경 사항이 포함되어 있으면 선택이 비어 있고 Git이 다시 중지됩니다. 두 경우 모두 작업 내용을 살펴보세요. 그냥 지나치기 위해 빈 커밋을 강요하지 마세요.
대상 분기만 이동합니다. priya/label 및 서버의 모든 내용은 그대로 유지됩니다. 새 커밋은 라벨 변경 사항을 release/label에 추가하고 그 외에는 아무것도 추가하지 않습니다.
정확한 프로젝트 상태 준비
18과에서 남겨둔 프로젝트의 별도의 일반 복사본에서 시작하고 원본 gittree-features은 그대로 둡니다. SIGNUP을 기준으로 저장한 다음 두 개의 분기를 빌드합니다. 아래 본문은 기준 페이지(SIGNUP), 관련 없는 노트(DOC_NOISE), 고정 페이지(SIGNUP_LABEL) 및 자신의 노트(DOC_MERGE)입니다.
완전한 파일 입력
아래에 명명된 단계에서만 저장하십시오. 이는 최종 개행 문자가 포함된 완전한 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/temporary-review.md — DOC_NOISE
Temporary rehearsal note, deliberately dropped.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/integration-note.md — DOC_MERGE
# Integration review
This note was written on main while signup work was private.GitTree에서
Command+Shift+P(Ubuntu에서는 Ctrl+Shift+P)를 사용하여 팔레트를 엽니다. 커밋에 대한 작업은 커밋의 오른쪽 클릭 메뉴를 사용합니다.
- 다음 섹션에 표시된 대로 기준선과 두 개의 분기를 구축합니다.
release/label을(를) 확인하고 작업 트리가 깨끗한지 확인하세요. - 그래프에서 아래 메모가 아닌 Priya의 커밋 "수정: 가상 이메일 레이블 명확화"를 찾으세요. 이를 선택하고 세부정보를 읽어보세요. 하나의 변경된 경로,
index.html및 해당 상위 항목은 관련 없는 메모입니다. - 해당 커밋을 마우스 오른쪽 버튼으로 클릭하고 Cherry-Pick Commit을 선택합니다. 이는 현재 있는 지점에 즉시 적용됩니다. 지점 선택 도구가 없습니다. 이미 현재 커밋인 커밋에서는 명령이 비활성화됩니다.
- 실제 결과를 기다리십시오. 작업이 중지되면 다시 선택하는 대신 배너에서 Resolve, Continue 또는 Abort…를 사용하세요.
release/label에서 새 커밋을 선택합니다. ID는 Priya의 ID와 다르며 작성자는 Priya Nair이고 커미터는 GitTree Demo입니다.index.html을(를) 엽니다: SIGNUP_LABEL입니다.docs/temporary-review.md은(는) 없고 귀하의docs/integration-note.md은(는) 있습니다.priya/label은(는) 여전히 이전 팁의 이름을 지정합니다.release/label을(를) 깨끗하게 남겨두세요.priya/label을(를) 푸시하거나 병합하지 마세요.
그래프에서 커밋을 2개 이상 선택하면 메뉴에 Cherry-Pick Commits이 제공되고 순서대로 복사됩니다. 이 강의에서는 하나를 복사합니다.
과정의 모든 일반적인 커밋에 대해: Summary는 명시된 주제이고, Description는 비어 있으며, 옵션 Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit 및 Allow Empty Commit는 꺼져 있습니다.
터미널에서
18과 결과의 별도 복사본에서 SIGNUP을 저장하기 전에 기준 분기를 만듭니다.
git switch --create label-baseSIGNUP을 index.html로 저장한 후:
git add -- index.html
git commit --quiet -m "feat: prepare the shared signup baseline"
BASE_SHA="$(git rev-parse HEAD)"
git switch --create priya/labelDOC_NOISE를 docs/temporary-review.md로 저장한 후:
git add -- docs/temporary-review.md
git commit --quiet -m "docs: unrelated source note"SIGNUP_LABEL을 index.html로 저장한 후:
git add -- index.html
git -c user.name="Priya Nair" -c user.email=priya@example.com commit --quiet -m "fix: clarify the fictional email label"
PICK_SHA="$(git rev-parse HEAD)"
git switch --create release/label "$BASE_SHA"DOC_MERGE를 docs/integration-note.md로 저장한 후:
git add -- docs/integration-note.md
git commit --quiet -m "docs: record target review"이제 수정 사항을 선택하고 결과를 읽어보세요.
git cherry-pick "$PICK_SHA"
git log -1 --format='%s%n%an <%ae>%n%cn <%ce>'
git diff-tree --no-commit-id --name-only -r HEAD
git status --shortfix: clarify the fictional email label
Priya Nair <priya@example.com>
GitTree Demo <demo@example.com>
index.html새 커밋의 ID가 PICK_SHA과 다르고, index.html이(가) SIGNUP_LABEL이고, docs/temporary-review.md이(가) 없고 상태가 비어 있습니다. 알아야 할 두 가지 변형은 별도의 복사본으로 실행되며 표준 복사본에서는 실행되지 않습니다. git cherry-pick -x "$PICK_SHA"는 "(커밋에서 선택된 체리...)" 줄을 새 메시지에 추가합니다. 이는 공유 브랜치를 선택할 때 도움이 됩니다. 가입 양식이 없는 대상에서는 동일한 명령이 index.html에서 충돌로 인해 중지됩니다. 이를 해결하거나(23강) git cherry-pick --abort로 종료합니다. 대상에 이미 변경 사항이 있으면 Git은 빈 선택으로 다시 중지하고 git cherry-pick --skip 또는 --abort가 탈출구입니다.
결과
Where you end: release/label에는 Priya Nair가 작성하고 GitTree Demo가 커밋한 Priya의 수정 사항이 포함된 새 커밋이 새 ID로 하나 있습니다. 페이지에 명확한 레이블이 있고 관련 없는 메모가 나타나지 않았으며 priya/label 서버는 변경되지 않았으며 작업 트리는 깨끗합니다.
일반적인 실수
- 체리픽을 생각하면 커밋이 이동합니다. 변경 사항을 복사합니다. 원본은 원래 있던 곳에 남아 있습니다.
- 잘못된 커밋을 선택하면 수정 사항 대신 관련 없는 메모가 표시됩니다.
- 변경 사항이 이미 브랜치에 있을 때 빈 커밋을 강제합니다.
- 전체 기능을 병합하는 대신 한 번에 하나씩 커밋씩 복사하려면 체리픽을 사용하세요.
뭔가 잘못되면
픽이 멈추면 배너를 읽어보세요. Resolve와 Continue는 23과에서와 같이 끝냅니다. Abort…는 분기를 원래 위치로 반환합니다. 선택이 완료된 후 실수였다면 새 커밋은 release/label에만 있습니다. 거기서 실행 취소하고 소스 브랜치는 건드리지 않았습니다.
이해도를 확인해보세요
각 질문에 답한 후 그 이유를 읽어보세요. '필수'라고 표시된 질문은 수업 완료에 반영됩니다.
6개 중 0개 정답
수업을 완료하려면 필수 질문에 올바르게 답하세요.
이 브라우저에서 확인했습니다.
연습
새 커밋의 ID, 작성자 및 커미터, 변경된 경로 및 docs/temporary-review.md 존재 여부를 보고합니다. 그런 다음 release/label에 동일한 커밋을 다시 선택하면 어떤 일이 발생할지 예측하세요.
귀하의 확인: 사이트에서 귀하의 컴퓨터를 볼 수 없습니다.
수업을 완료하려면 필수 질문에 올바르게 답하고 실제 연습을 확인하세요.
요약
- Cherry-Pick은 하나의 커밋의 변경 사항을 새 커밋으로 복사합니다.
- 부모와 커밋은 뒤에 남아 있습니다.
- 강제로 실행하기 전에 종속성과 빈 선택을 확인하세요.
관련된
용어집 소개
체리픽(Cherry-pick) — انتقاى; 소스 커밋 — إيداع المصدر; 목표 — الهدب; 의존성 — اعتماد.
비디오 대본
영상의 나레이션, 큐별로.
성적표 표시
- 다른 지점에서 하나의 수정 사항을 가져오고 나머지는 남겨두세요.
- Cherry-Pick은 변경 사항을 하나의 커밋으로 복사합니다. 여기에서 새로운 커밋으로 만들어졌습니다.
- 복사본에 새 ID가 있지만 작가와 메시지.
- 기준선을 구축하고 Priya의 지점을 메모와 수정 사항, 그리고 릴리스 브랜치입니다.
- 폴더를 엽니다. 그래프는 두 가지를 모두 보여줍니다. 동일한 기준선에서 분기합니다.
- Priya의 수정 사항은 관련 없는 문제 위에 놓여 있습니다. 참고. 우리는 수정만을 원합니다.
- 수정 사항을 선택합니다. 변경된 경로 중 하나: index.html.
- 릴리스 라벨이 최신인지 확인하고 작업 트리가 깨끗합니다.
- 수정 사항을 마우스 오른쪽 버튼으로 클릭하고 체리픽 커밋.
- 지점 선택 도구가 없습니다. 다음에 적용됩니다. 당신이 있는 지점.
- 현재 커밋 자체에서 다음 명령은 비활성화되었습니다.
- 실행하고 실제 결과를 기다립니다.
- 새로운 커밋은 릴리스 레이블에 있습니다.
- 프리야의 ID와 ID가 다릅니다. 부모는 다릅니다.
- 저자는 여전히 프리야입니다. 커미터 당신입니까?
- 페이지에 명확한 라벨이 있습니다.
- 관련없는 메모가 오지 않았습니다. 당신의 메모가 아직 여기에 있습니다.
- Priya의 지점은 그대로입니다.
- 터미널에서 다음 형식으로 git log를 실행합니다. 주제, 작성자 및 커미터를 표시합니다.
- git diff-tree는 이 경로를 나열합니다. 커밋이 변경되었습니다.
- 상태가 비어 있습니다. 아무것도 남지 않았어 뒤에.
- x 옵션을 사용하면 메시지가 기록됩니다. 그 선택이 어디서 왔는지.
- 동일한 커밋을 다시 선택하면 Git이 중지됩니다. 선택은 비어 있습니다.
- 입력 변경: 대상에 가입이 없습니다. 형태.
- 선택은 충돌로 인해 중지됩니다. 해결 계속하거나 중단합니다.
- 변경 사항은 수행하지 않은 커밋에 따라 달라질 수 있습니다. 가져 가라. 대상을 테스트합니다.
- Abort는 브랜치를 다시 되돌립니다. 출처는 결코 수정되지 않았습니다.
- 연습: 새 ID, 작성자, 커미터와 파일.
- 다음으로, 끝나지 않은 작업을 안전하게 따로 보관해 두세요. 은닉물로.