콘텐츠로 건너뛰기
GitTree

레슨 28 · 회복

공유 기록의 변경사항 되돌리기

기록을 삭제하는 대신 취소하는 새 커밋을 추가하여 다른 사람이 이미 수행한 잘못된 변경 사항을 실행 취소하고 일반 푸시로 수정 사항을 게시하세요.

이 브라우저에 진행 상황이 저장되었습니다.

재생하면 YouTube에서 동영상이 로드됩니다(개인정보 보호 강화 모드).

영어 내레이션 · English and Arabic 캡션

비디오 페이지 열기YouTube에서 시청하기

무엇을 배울 것인가

  • 역커밋으로 되돌리기를 설명하고, 이것이 다른 사람들의 기록에 적합한 이유를 설명하세요.
  • 새 커밋의 상위 커밋과 커밋이 남기는 파일을 예측합니다.
  • 충돌하는 되돌리기를 처리하고 병합 되돌리기에서 상위 항목을 요구하는 이유를 알아보세요.
  • 강제로 수정 사항을 게시합니다.

시작하기 전에

귀하는 18과의 결과 M의 분기인 shared/dark-regression에 있습니다. 마지막 커밋인 "스타일: 리허설 대비 회귀 도입"은 styles.css, body { color: #f7f8fa; }에 규칙 하나를 추가하여 페이지 텍스트를 배경과 동일한 연한 색상으로 바꿉니다. 해당 커밋은 이 강의를 위해 설정한 로컬 서버에 이미 있으므로 팀원이 이를 가질 수도 있습니다. 다른 사람이 이미 가지고 있는 내용을 다시 쓰지 않고도 텍스트를 다시 읽을 수 있기를 원합니다.

모든 것이 로컬이며 무료 요금제(GitTree에서 로그인을 요청함)입니다. 호스팅 계정도 없고, 공급자도 없고, 인터넷도 없습니다. 서버는 GitHub이 아닌 로컬 베어 저장소입니다. 모든 신원은 허구입니다(example.com). 실제 프로젝트에서는 이 강의를 실행하지 마세요.

동일한 사본에서 둘 다 수행하지 말고 GitTree 또는 기본 Git 명령을 사용하여 변경하십시오. 결과를 읽는 것은 항상 안전합니다. 메뉴 라벨은 GitTree 2.0의 자체 문자열에서 왔으며 기본 명령은 일회용 복사본에서 Git 2.43을 사용하여 실행되었습니다. GitTree 단계가 macOS, Windows 또는 Linux에서 실행되지 않았습니다.

개념 및 상태 효과

되돌리기는 하나의 커밋이 변경된 내용을 살펴보고 반대 변경 사항을 적용하는 new commit를 추가합니다. 잘못된 커밋은 기록에 남고, 그 일이 일어났다는 증거도 남습니다. 재설정은 그 반대입니다. 브랜치를 뒤로 이동하고 커밋을 그대로 둡니다. 이는 자신이 가지고 있는 작업에만 적합하지만 이미 커밋이 있는 모든 사람이 복사본을 복구하도록 강제합니다.

여기서 새 커밋의 부모는 잘못된 커밋이고 파일은 이전과 똑같이 종료됩니다. 브랜치는 하나의 커밋만큼 앞으로 이동하고 서버는 거기에 있는 것에만 추가하기 때문에 일반적인 푸시로 이를 수락합니다.

역 변화는 주변에 무엇이 있는지에 따라 달라집니다. 누군가가 잘못된 커밋 후에 동일한 줄을 변경한 경우 충돌로 인해 되돌리기가 중지되고 다른 것과 같이 해결하거나(23장) 중단합니다. merge 커밋을 되돌리면 변경 사항을 측정할 상위 항목을 선택하라는 메시지가 표시됩니다. 일반적으로 첫 번째, 병합된 분기입니다. 병합을 되돌리면 Git에 변경 사항이 처리되었음을 알리므로 나중에 동일한 브랜치를 병합하면 병합에 아무 것도 보고되지 않을 수 있습니다. 이 과정에서는 일반 커밋을 되돌리고 해당 대화 상자만 표시합니다.

현재 브랜치만 커밋을 받습니다. 당신이 밀기 전까지는 아무것도 움직이지 않습니다.

정확한 프로젝트 상태 준비

18과 결과 M의 별도 일반 복사본에서 시작하고 원본을 그대로 둡니다. 브랜치를 생성하고, styles.css에 DOC_DARK_BAD를 저장하고 커밋하고, 복사본 옆에 새로운 빈 베어 저장소를 생성하고, rehearsal라는 원격 저장소로 추가하고 업스트림으로 브랜치를 푸시합니다. CSS_RESTORED는 되돌리기 후 파일의 모습입니다.

완전한 파일 입력

아래에 명명된 단계에서만 저장하십시오. 이는 최종 개행 문자가 포함된 완전한 UTF-8/LF 본문입니다. 마크다운 펜스를 붙여넣지 마세요. 변경되지 않은 실행 가능 파일은 명명된 입력을 상속합니다. 별도의 변형 버전이 원본을 덮어쓰면 안 됩니다.

styles.css — DOC_DARK_BAD

파일 발췌 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --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;
}

body { color: #f7f8fa; }

styles.css — CSS_RESTORED

파일 발췌 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --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;
}

GitTree에서

Command+Shift+P(Ubuntu에서는 Ctrl+Shift+P)를 사용하여 팔레트를 엽니다. 커밋에 대한 작업은 커밋의 오른쪽 클릭 메뉴를 사용합니다.

  1. 다음 섹션에 표시된 대로 브랜치, 커밋 및 로컬 서버를 빌드합니다. shared/dark-regression을(를) 체크아웃하고 작업 트리를 깨끗하게 유지하세요.
  2. 그래프에서 잘못된 커밋을 선택하고 해당 세부정보(변경된 경로 하나, styles.css 및 추가된 줄 하나)를 읽어보세요.
  3. 마우스 오른쪽 버튼을 클릭하고 Revert Commit을 선택하세요. 현재 있는 지점에 즉시 적용됩니다. 메시지 편집기가 없습니다. 알림에는 '복원됨'이라고 표시되어 있습니다. 대신 중지되면 "공유/다크 회귀에서 ... 되돌리기" 배너는 Resolve, Continue 및 Abort…을 제공합니다.
  4. 새 커밋을 선택합니다. 제목은 Revert "style: introduce the rehearsal contrast regression"이고 상위는 잘못된 커밋입니다. 잘못된 커밋이 여전히 그래프에 있습니다.
  5. styles.css 열기: 추가된 규칙 없이 CSS_RESTORED입니다.
  6. 툴바 Push를 클릭하세요. 이는 분기를 업스트림으로 푸시하는 일반적인 작업입니다. 강제 푸시(임대 포함)를 선택하지 마십시오… 알림에는 "공유/다크 회귀를 리허설/공유/다크 회귀로 푸시했습니다."라고 나와 있습니다.
  7. 결과를 확인하십시오. 작업 트리가 깨끗하고 두 커밋이 모두 그래프에 있으며 서버 분기가 새 커밋에 있습니다.

병합 커밋을 마우스 오른쪽 버튼으로 클릭하면 Revert Commit는 First parent (the branch merged into) 및 Second parent (the branch merged in)와 함께 "병합 되돌리기..."를 엽니다. 여기서는 실행하지 마세요.

과정의 모든 일반적인 커밋에 대해: Summary는 명시된 주제이고, Description는 비어 있으며, 옵션 Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit 및 Allow Empty Commit는 꺼져 있습니다.

터미널에서

18과 결과의 별도 사본에서:

Command · bash
git switch --create shared/dark-regression

DOC_DARK_BAD를 styles.css로 저장한 후:

Command · bash
git add -- styles.css
git commit --quiet -m "style: introduce the rehearsal contrast regression"
BAD_SHA="$(git rev-parse HEAD)"
git init --quiet --bare --initial-branch=main ../gittree-revert-origin.git
git remote add rehearsal ../gittree-revert-origin.git
git push --quiet --set-upstream rehearsal shared/dark-regression

이제 결과를 되돌리고 게시하고 읽습니다.

Command · bash
git revert --no-edit "$BAD_SHA"
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?
git log -1 --format=%s
git push --quiet rehearsal shared/dark-regression
git status --short
git ls-remote --heads rehearsal refs/heads/shared/dark-regression
git rev-parse HEAD
출력
0
Revert "style: introduce the rehearsal contrast regression"

상위 검사는 0을 인쇄합니다. 잘못된 커밋이 여전히 HEAD 뒤에 있습니다. styles.css은(는) CSS_RESTORED이고 상태는 비어 있으며 ls-remote 및 rev-parse의 두 ID가 동일합니다. 강제 옵션은 포함되지 않았습니다. 이후 커밋이 동일한 줄을 편집하는 별도의 복사본에서 git revert는 "CONFLICT(content)"와 힌트 git revert --continue 및 git revert --abort로 중지됩니다. 그리고 병합 커밋에 대한 git revert는 "병합이지만 -m 옵션이 제공되지 않았습니다."로 거부합니다. -m 1는 첫 번째 부모를 선택합니다.

결과

Where you end: shared/dark-regression에는 잘못된 커밋을 취소하는 새로운 커밋이 하나 있습니다. 페이지는 CSS_RESTORED를 사용하고 잘못된 커밋은 여전히 ​​기록에 남아 있으며 서버 분기는 새 커밋에 있고 작업 트리는 깨끗하며 강제된 것은 없습니다.

일반적인 실수

  • 재설정 및 강제 푸시를 사용하여 다른 사람이 이미 가지고 있는 커밋을 "제거"합니다.
  • 잘못된 커밋이 로그에서 사라질 것으로 예상합니다.
  • 의도적으로 부모를 선택하지 않고 병합을 되돌립니다.
  • 파일을 보기 전에 푸시하면 되돌리기가 남았습니다.

뭔가 잘못되면

충돌로 인해 되돌리기가 중지되면 배너를 읽어보세요. Resolve 및 Continue는 23과에서와 같이 완료합니다. Abort…는 분기를 원래 위치로 반환합니다. 되돌리기가 완료된 후 실수였다면 되돌리기를 되돌리세요. 이는 또 다른 커밋일 뿐입니다.

이해도를 확인해보세요

각 질문에 답한 후 그 이유를 읽어보세요. '필수'라고 표시된 질문은 수업 완료에 반영됩니다.

  1. 질문 1/6

    되돌리기는 잘못된 커밋에 어떤 영향을 미치나요?

    답을 하나 선택하세요.

  2. 질문 2/6

    되돌린 후 다음 중 사실은 무엇인가요?

    해당하는 답을 모두 선택하세요.

  3. 질문 3/6
    필수

    잘못된 커밋을 되돌리고 정상적으로 푸시합니다. 이후 서버 지점은 어디인가요?

    답을 하나 선택하세요.

  4. 질문 4/6

    입력 변경: 이후 커밋은 잘못된 커밋이 추가된 동일한 줄을 편집한 다음 잘못된 커밋을 되돌립니다. 무슨 일이 일어나나요?

    답을 하나 선택하세요.

  5. 질문 5/6
    필수

    병합 커밋을 되돌리려고 하는데 Git이 "병합이지만 -m 옵션이 제공되지 않았습니다"라고 말합니다. 무슨 일이 일어나고 있으며, 무엇을 하고 있나요?

    답을 하나 선택하세요.

  6. 질문 6/6
    필수

    되돌리기 및 푸시 후에 어떤 판독 결과가 수업에서 말하는 대로 수행되었는지 보여주나요?

    해당하는 답을 모두 선택하세요.

6개 중 0개 정답

수업을 완료하려면 필수 질문에 올바르게 답하세요.

이 브라우저에서 확인했습니다.

연습

되돌리기의 제목, 상위, 잘못된 커밋이 여전히 상위인지 여부, 서버 분기가 HEAD과 같은지 여부를 보고합니다. 그런 다음 되돌리기 전에 나중에 커밋에서 같은 줄이 변경된 경우 어떤 일이 발생할지 예측하세요.

귀하의 확인: 사이트에서 귀하의 컴퓨터를 볼 수 없습니다.

수업을 완료하려면 필수 질문에 올바르게 답하고 실제 연습을 확인하세요.

요약

  • 되돌리기는 다른 커밋을 취소하는 커밋을 추가합니다.
  • 역사는 그대로 유지됩니다. 파일이 돌아갑니다.
  • 일반적인 푸시로 충분합니다.

용어집 소개

되돌리기 — عكس; 역변화 - تجيير معاكس; 주요 부모 — الاب الرئيسي.

비디오 대본

영상의 나레이션, 큐별로.

성적표 표시
  1. 다른 사람이 이미 변경한 내용을 취소합니다. 있다.
  2. 재설정은 분기를 뒤로 이동합니다. 되돌리기는 대신 새로운 커밋을 하세요.
  3. 다른 사람들은 이미 이전 커밋을 가지고 있습니다. 되돌리기 사본을 유효하게 둡니다.
  4. 잘못된 커밋으로 공유 브랜치를 빌드합니다. 그리고 그것을 가지고 있는 로컬 서버.
  5. 그래프에는 M이 표시되고 잘못된 커밋이 표시됩니다. 상단.
  6. 잘못된 커밋은 한 줄을 추가하고 텍스트 창백해진다.
  7. 해당 ID를 적어주세요.
  8. 마우스 오른쪽 버튼을 클릭하고 커밋 되돌리기를 선택합니다.
  9. 한번에 적용됩니다. 메시지가 없습니다 편집자.
  10. 공지에는 되돌려졌다고 적혀 있습니다.
  11. 새 커밋의 이름은 이전 커밋의 이름을 따서 지정됩니다.
  12. 해당 부모는 잘못된 커밋입니다. 아무것도 없었어 제거되었습니다.
  13. 파일이 원래대로 돌아왔습니다. 창백한 법칙 사라졌습니다.
  14. 그래프에는 두 커밋이 모두 표시됩니다. 는 역사는 성장할 뿐이었다.
  15. 이 지점만 이동했습니다. 아무것도 아니다 아직 출판되지 않았습니다.
  16. 브랜치는 커밋보다 하나 앞서 있습니다. 서버.
  17. 푸시를 클릭합니다. 이것은 정상적인 푸시입니다.
  18. 통지서에는 지점과 지점의 이름이 명시되어 있습니다. 서버.
  19. 힘은 필요하지 않았습니다. 푸시는 단지 커밋하다.
  20. 터미널에서 편집 없이 git revert 같은 일을합니다.
  21. 잘못된 커밋은 여전히 상위 항목입니다. 는 대답은 0입니다.
  22. 그리고 주제는 되돌리기로 시작됩니다.
  23. 푸시한 후 서버의 ID를 다음과 비교하세요. 머리. 그들은 동등합니다.
  24. 입력 변경: 누군가가 동일한 내용을 편집했습니다. 나중에 줄.
  25. 충돌로 인해 되돌리기가 중지됩니다. 해결 계속하거나 중단합니다.
  26. 병합을 되돌리려면 상위 항목을 요청합니다. 일반적으로 첫 번째입니다.
  27. 병합을 되돌린 후 병합 다시 분기하면 아무 작업도 수행할 수 없습니다.
  28. 연습: 주제, 부모, 조상 확인 및 서버 ID.
  29. 다음으로, reflog를 사용하여 손실된 커밋을 찾으세요.