레슨 32 · 회복
푸시 후 실수 복구
다른 사람들이 이미 겪었을 수 있는 실수를 수정하세요. 새로운 커밋을 선호하고, 소유한 브랜치를 다시 작성해야 할 경우 검토한 정확한 원격 팁에 고정된 임대를 적용하세요.
- 레벨: 고급
- 6분 읽음
- 4분 동영상
- 업데이트됨
- 이 수업 전에: 커밋 푸시 및 브랜치 게시, 공유 기록의 변경사항 되돌리기, reflog로 손실된 커밋 찾기
이 브라우저에 진행 상황이 저장되었습니다.
재생하면 YouTube에서 동영상이 로드됩니다(개인정보 보호 강화 모드).
무엇을 배울 것인가
- 추가 수정과 푸시된 실수에 대한 재작성 중에서 선택하세요.
- 임대가 확인하는 내용과 예상되는 커밋이 중요한 이유를 설명하세요.
- 오래된 임대 거부를 예측하고 팀원의 작업을 유지하세요.
- 강제로 푸시하기 전에 GitTree가 무엇을 유지하는지 알아보세요.
시작하기 전에
로컬 리허설 서버의 두 가지 상황. shared에 잘못된 커밋이 이미 푸시되었으며 다른 커밋이 푸시되었을 수 있습니다. lease에 초안을 푸시한 다음 로컬에서 다시 작성했지만 Leo는 그 동안 동일한 브랜치에 새로운 커밋을 푸시했습니다.
모든 것이 로컬이며 무료 요금제(GitTree에서 로그인을 요청함)입니다. 호스팅 계정도 없고, 공급자도 없고, 인터넷도 없습니다. 모든 신원은 허구입니다(example.com). 실제 프로젝트에서는 이 강의를 실행하지 마세요.
동일한 사본에서 둘 다 수행하지 말고 GitTree 또는 기본 Git 명령을 사용하여 변경하십시오. 결과를 읽는 것은 항상 안전합니다. 메뉴 라벨은 GitTree 2.0의 자체 문자열에서 왔으며 기본 명령은 일회용 복사본에서 Git 2.43을 사용하여 실행되었습니다. GitTree 단계가 macOS, Windows 또는 Linux에서 실행되지 않았습니다.
개념 및 상태 효과
팀원이 잘못된 커밋을 가지고 있을 수 있는 경우 새 커밋(되돌리기, 28과)으로 수정하고 정상적으로 푸시하세요. 기록에 실수가 유지되고 어느 누구도 복제한 것이 무효화되지 않습니다. 게시된 브랜치를 소유한 경우에만 다시 작성하세요.
lease는 강제 푸시를 조건부로 만듭니다. Git은 예상한 위치를 여전히 가리키는 경우에만 원격 분기를 대체합니다. --force-with-lease=<ref>:<commit>는 예상되는 커밋의 이름을 지정합니다. 베어 --force-with-lease는 원격 추적 참조를 사용하고 git fetch는 해당 참조를 이동하므로 가져온 다음 푸시하면 방금 다운로드한 것을 덮어쓸 수 있습니다. GitTree는 마지막으로 가져온 커밋을 고정하고 대화 상자에 표시하며 교체된 팁을 refs/ogt/trash 아래에 유지합니다.
임대는 팀원의 작업을 덮어쓸 수 있는지 여부를 결정하지 않습니다. 본 적이 없는 내용을 덮어쓰지 않도록 보호할 뿐입니다.
정확한 프로젝트 상태 준비
새로운 로컬 베어 저장소를 유일한 원격 저장소로 사용하여 18과 결과의 별도의 일반 복사본에서 시작합니다. RECOVERY_BAD는 잘못된 스타일시트입니다. LEASE_A, LEASE_B 및 LEASE_REWRITE는 메모의 세 가지 버전입니다.
완전한 파일 입력
아래의 각 파일을 표시된 대로 정확히 저장합니다. UTF-8, LF 줄 끝 및 Markdown 울타리 줄 없이 마지막 줄 바꿈 하나. 나열되지 않은 파일은 해당 내용을 M.
styles.css — RECOVERY_BAD
:root {
color-scheme: light;
--page: #f7f8fa;
--surface: #ffffff;
--text: #f7f8fa;
--link: #154ab5;
--line: #bac4d0;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--page);
color: var(--text);
font: 1rem/1.6 system-ui, sans-serif;
}
a {
color: var(--link);
}
.site-header,
main,
footer {
width: min(68rem, 100% - 2rem);
margin-inline: auto;
}
.site-header {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 1rem;
padding-block: 1rem;
}
.hero {
max-width: 48rem;
padding-block: 3rem;
}
h1 {
font-size: clamp(2rem, 5vw, 3.5rem);
line-height: 1.2;
}
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
gap: 1rem;
}
.feature-card {
padding: 1rem;
border: 1px solid var(--line);
border-radius: 0.75rem;
background: var(--surface);
}
section {
margin-block-end: 2rem;
}
button,
input {
font: inherit;
}
button,
input {
padding: 0.5rem 0.75rem;
}
:focus-visible {
outline: 3px solid var(--link);
outline-offset: 3px;
}
form {
display: grid;
max-width: 28rem;
gap: 0.5rem;
}docs/lease-note.md — LEASE_A
# Private release rehearsal
The reviewed draft is still private.docs/lease-note.md — LEASE_B
# Private release rehearsal
Leo added a review that must not be overwritten.docs/lease-note.md — LEASE_REWRITE
# Private release rehearsal
This alternative draft has not seen Leo's review.GitTree에서
Command+Shift+P(Ubuntu에서는 Ctrl+Shift+P)를 사용하여 팔레트를 엽니다.
- 다음 섹션에 표시된 대로 리허설을 빌드합니다. 잘못된 커밋을
shared에 푸시하고 Leo의 최신 커밋이 서버에 있는lease브랜치를 만듭니다. - Additive repair.
shared에서 잘못된 커밋을 마우스 오른쪽 버튼으로 클릭하고 Revert Commit를 선택한 다음 Push을 클릭합니다. 이는 정상적인 푸시입니다. 강제 푸시(임대 포함)를 선택하지 마십시오… - Stale lease.
private/lease에서 브랜치에 더 이상 푸시된 커밋이 포함되지 않도록 초안을 로컬에서 다시 작성하고 도구 모음 Push을 사용하여 푸시를 시도합니다. GitTree는 먼저 푸시할 위치를 묻습니다.private/lease가 다른 이름으로origin/lease를 추적하기 때문입니다. Push to origin/lease을 선택하세요. "리모컨이 비공개/대여를 거부했습니다"라는 제목의 대화 상자에 Fetch Only, Rebase and Push, Merge and Push 및 Force Push…가 제공됩니다. - 먼저 Fetch Only을 선택하고 그래프를 읽으십시오. 이제 원격 브랜치에는 재작성에는 포함되지 않은 Leo의 커밋이 있습니다. 그건 팀원의 일이다.
- Force Push…을(를) 엽니다. "개인/임대를 원본/임대에 강제로 푸시하시겠습니까?" 대화 상자 브랜치에 부족한 커밋은 원격에서 제거되고 원격이 표시된 커밋에 있는 동안에만 푸시가 진행되며 교체된 팁은
refs/ogt/trash아래에 유지된다는 커밋이 있습니다. 취소; 레오의 일은 당신이 대신할 수 있는 것이 아닙니다. - 대신 화해하세요: Rebase and Push이(가) Leo의 초안 위에 귀하의 초안을 올려 놓거나 Leo에게 먼저 물어보세요. 실제 강제 푸시가 실행된 경우 "강제 푸시. 교체된 원격 팁이 ...에 유지됩니다."라는 알림이 표시되고 Undo은 강제 푸시를 다시 변경하기 위해 다시 밀어야 하는 리모콘에 대한 변경으로 처리합니다.
터미널에서
되돌린 후 shared:
git revert --no-edit "$BAD_SHA"
git push origin HEAD:shared
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?대답은 0입니다. 실수는 기록에 남아 있으며 누구도 복제본을 복구하도록 강요받지 않았습니다.
private/lease에서 Leo의 커밋이 이미 서버에 있는 상태에서 검토한 커밋으로 고정된 임대를 테스트합니다.
git push --force-with-lease=refs/heads/lease:"$EXPECTED_SHA" origin HEAD:lease; echo $?
git ls-remote origin refs/heads/lease
git status --short ! [rejected] HEAD -> lease (stale info)
error: failed to push some refs to '../origin.git'
1Git이 거부하면("stale info") 서버는 여전히 Leo의 커밋 이름을 지정하고 상태는 비어 있습니다. 원격 추적 참조가 오래되면 기본 git push --force-with-lease origin HEAD:lease도 거부되지만 git fetch origin lease 이후에는 가져오기가 비교 대상 참조를 이동했기 때문에 동일한 명령이 Leo의 커밋을 대체합니다. 검토한 커밋의 이름을 지정하거나 리베이스로 조정하세요.
결과
Where you end: 잘못된 커밋이 여전히 shared의 기록에 남아 있으며 그에 대한 되돌리기가 정상적으로 푸시되었습니다. lease에 고정된 푸시가 거부되었으며 서버는 여전히 Leo의 커밋을 보유하고 있으며 로컬 재작성은 그대로 유지됩니다. 강제 푸시가 이루어지지 않았습니다.
일반적인 실수
- 되돌리기를 수행할 때 다른 사람들이 이미 가져온 분기를 다시 작성합니다.
- 방금 다운로드한 내용을 신뢰하는 기본 임대를 사용하여 가져온 다음 강제로 푸시합니다.
- 임대를 팀원의 커밋을 대체할 수 있는 권한으로 취급합니다.
- 실행 취소가 서버에 대한 강제 푸시를 되돌릴 수 있다고 가정합니다.
뭔가 잘못되면
강제 푸시가 잘못된 팁을 대체한 경우 대체된 커밋은 refs/ogt/trash 아래에 유지됩니다(기본 푸시의 경우 사용자의 참조 로그 및 팀원의 클론에 있음). 팀원에게 알리고 팁을 브랜치로 복원한 후 동의하여 다시 푸시하세요. 거부된 푸시는 아무것도 바꾸지 않았습니다.
이해도를 확인해보세요
각 질문에 답한 후 그 이유를 읽어보세요. '필수'라고 표시된 질문은 수업 완료에 반영됩니다.
6개 중 0개 정답
수업을 완료하려면 필수 질문에 올바르게 답하세요.
이 브라우저에서 확인했습니다.
연습
shared에 대한 상위 확인, 고정된 푸시의 종료 코드 및 메시지, lease에 대해 표시되는 커밋 ls-remote, 가져오기 전후에 기본 임대가 거부되었는지 여부를 보고합니다.
귀하의 확인: 사이트에서 귀하의 컴퓨터를 볼 수 없습니다.
수업을 완료하려면 필수 질문에 올바르게 답하고 실제 연습을 확인하세요.
요약
- 다른 사람이 갖고 있는 것에 대해서는 새로운 커밋을 선호합니다.
- 검토한 커밋에 임대를 고정합니다.
- 임대는 팀원의 의도가 아니라 당신을 보호합니다.
관련된
용어집 소개
임대 — قت; 오래된 정보 - معلومات قديمة; 팁 교체 — الراس المستبدَل.
비디오 대본
영상의 나레이션, 큐별로.
성적표 표시
- 실수를 하셨습니다. 지금은 무엇입니까?
- 다른 사람이 커밋을 가지고 있다면 복구하세요. 커밋을 추가하여.
- 임대 계약에 따르면 다음과 같은 경우에만 리모컨을 교체하십시오. 아직도 내가 기대하는 곳이다.
- 하지만 가져오기는 임대를 옮기는 것뿐이죠 기대합니다.
- 로컬 서버의 두 가지 분기: 공유, 그리고 임대.
- 공유 시 잘못된 커밋을 되돌립니다.
- 정상적으로 밀어주세요. 힘이 없습니다.
- 실수는 역사에 남고 누구도 클론을 복구해야 합니다.
- 임대 시 재작성된 분기는 거부됩니다.
- 가져오기만 하고 살펴보세요. 레오의 약속은 거기.
- 리모컨이 켜져 있는 동안에만 진행됩니다. 이 커밋을 수행하고 이전 팁을 유지합니다.
- 레오의 일은 당신이 대신할 수 있는 것이 아닙니다. 리베이스 그것에 대해 물어보거나 그에게 물어보세요.
- 터미널에서 조상 확인 공유는 0입니다.
- 검토한 커밋의 이름을 지정하세요. 힘내 말한다 오래된 정보.
- 서버는 여전히 Leo의 커밋 이름을 지정합니다.
- 가져오기 후의 임대는 다음과 같습니다. 그것을 교체했습니다.
- 실행 취소는 강제 푸시를 되돌리지 않습니다. 서버.
- 연습: 종료 코드, 서버 보고 커밋 및 상태.
- 다음으로, 한 번에 두 개의 브랜치에서 작업합니다. 작업 트리.