간단한 실수 수정

완료됨

때로는 무엇인가 잘못됩니다. 잊어버리고 새 파일을 추가하지 않았거나 실수로 파일을 추가할 수 있습니다. 최신 커밋에 맞춤법 오류가 있었거나 의도하지 않은 항목을 커밋했을 수도 있습니다. 실수로 파일을 삭제했을 수 있습니다.

Git을 사용하면 걱정 없이 변경할 수 있습니다. Git은 ‘항상’ 이전 위치로 돌아가는 방법을 제공하기 때문입니다. 공유되지 않은 커밋만 변경하는 경우에도 Git의 커밋 기록을 변경할 수 있습니다.

커밋 수정: --amend 플래그

이전 연습에서는 스타일시트의 경로를 수정하기 위해 index.html 파일을 업데이트했습니다. 다음 문을 추가해야 했습니다.

<link rel="stylesheet" href="CSS/site.css">

문을 잘못 입력한 것을 발견했다고 가정합니다. 폴더 경로를 CSS로 지정하지 않고 CS를 입력했습니다.

<link rel="stylesheet" href="CS/site.css">

브라우저에서 페이지를 새로 고치면 CSS 스타일시트가 적용되지 않습니다. 조사 후에 경로 값을 잘못 입력한 것을 알게 됩니다.

그래서 올바른 스타일시트 경로를 사용하여 index.html을 업데이트합니다. 이때 수정된 버전의 index.html을 그대로 커밋할 수도 있지만 원본과 동일한 커밋에 파일을 넣고 싶습니다. git commit--amend 옵션을 사용하면 기록(및 기록을 변경할 수 있는 빈도)을 변경할 수 있습니다.

git commit --amend --no-edit

--no-edit 옵션은 커밋 메시지를 변경하지 않고 변경하도록 Git에 알립니다. --amend를 사용하여 커밋 메시지를 편집하거나, 실수로 커밋에서 누락된 파일을 추가하거나, 실수로 추가된 파일을 제거할 수도 있습니다.

참고

기록을 변경하는 기능은 Git의 가장 강력한 기능 중 하나입니다. 대부분의 강력한 도구와 마찬가지로 신중하게 사용해야 합니다. 특히 다른 개발자와 공유되었거나 GitHub와 같은 공유 리포지토리에 게시된 커밋은 변경하지 않는 것이 좋습니다.

삭제된 파일 복구: git checkout

소스 코드 파일을 변경했는데 전체 프로젝트가 중단되어 파일의 이전 버전으로 되돌리려 한다고 가정합니다. 또는 실수로 파일을 완전히 삭제했을 수도 있습니다. 현재 버전이 더 이상 존재하지 않는 경우에도 Git을 사용하면 이전 버전을 쉽게 검색할 수 있습니다. 이 경우 git checkout 명령을 사용하는 것이 좋습니다.

git checkout의 용도는 다양하지만 다음 연습에서는 삭제된 파일을 복구하는 데 사용합니다. git checkout은 인덱스 또는 지정된 트리의 버전과 일치하도록 작업 트리의 파일을 업데이트합니다.

파일을 실수로 삭제한 경우 다음 명령을 사용하여 인덱스의 버전을 다시 작업 트리로 가져와 복구할 수 있습니다.

git checkout -- <file_name>

이전 커밋(일반적으로 다른 분기의 헤드)에서 파일을 체크 아웃할 수도 있지만 기본값은 인덱스에서 파일을 가져오는 것입니다. 인수 목록의 --는 파일 경로 목록과 커밋을 구분하는 데 사용됩니다. 이 경우에 반드시 필요한 것은 아니지만, <file_name>(해당 분기에서 작업하는 파일의 이름이기 때문일 수 있음)이라는 분기가 있는 경우 --를 사용하면 Git이 혼동하지 않습니다.

나중에 분기를 전환하는 데에도 checkout을 사용한다는 것을 확인할 수 있습니다.

파일 복구: git reset

git rm을 사용하여 파일을 삭제할 수도 있습니다. 이 명령은 디스크에 있는 파일을 삭제할 뿐 아니라 파일 삭제를 인덱스에 기록하도록 Git에 알립니다.

따라서 다음 명령을 실행한다고 가정합니다.

git rm index.html
git checkout -- index.html

Git은 index.html을 복원하지 못합니다. 대신, 다음 예제와 같은 오류가 표시됩니다.

error: pathspec 'index.html' did not match any file(s) known to git.

index.html을 복구하려면 다른 방법인 git reset을 사용해야 합니다. git reset을 사용하여 변경 내용을 스테이징 취소할 수 있습니다.

다음 두 명령을 사용하여 index.html을 복구할 수 있습니다.

git reset HEAD index.html
git checkout -- index.html

여기서 git reset은 Git에서 파일 삭제를 스테이징 취소하지 않습니다. 이 명령은 파일을 인덱스로 되돌리지만 디스크에서는 여전히 삭제된 상태입니다. git checkout을 사용하여 인덱스에서 디스크로 파일을 복원할 수 있습니다.

다음은 신규 Git 사용자를 위한 또 다른 유용한 정보입니다. 대부분의 VCS는 파일을 읽기 전용으로 설정하여 한 번에 한 명의 사용자만 변경할 수 있도록 합니다. 사용자는 관련 없는 checkout 명령을 사용하여 파일의 쓰기 가능한 버전을 가져옵니다. 또한 Git이 add, commitpush를 조합하여 수행하는 작업과 유사한 작업에 checkin을 사용합니다. 이 팩트로 인해 사용자가 Git을 사용하기 시작할 때는 혼동을 일으키는 경우도 있습니다.

커밋 되돌리기: git revert

Git을 사용하여 실수를 수정하기 위해 알아야 하는 마지막 중요 명령은 git revert입니다. git checkout은 실행 취소할 변경 내용이 인덱스에 있는 경우에만 작동합니다. 변경 내용을 커밋한 후에는 다른 전략을 사용하여 실행 취소해야 합니다. 예제에서는 git revert를 사용하여 이전 커밋을 되돌릴 수 있습니다. 이 명령은 첫 번째 커밋을 취소하는 ‘다른’ 커밋을 수행하는 방식으로 작동합니다.

git revert HEAD를 사용하면 모든 기록은 그대로 유지하면서 마지막 커밋과 정확히 ‘반대’인 커밋을 수행하여 이전 커밋을 실행 취소할 수 있습니다. 명령의 HEAD 부분은 마지막 커밋만 “실행 취소”하도록 Git에 알립니다.

한편, git reset 명령을 사용하여 가장 최근 커밋을 제거할 수도 있습니다.

git reset --hard HEAD^

Git은 몇 가지 유형의 재설정을 제공합니다. 기본값은 --mixed로, 인덱스를 다시 설정하지만 작업 트리는 다시 설정하지 않습니다. 다른 커밋을 지정하면 HEAD도 이동합니다. --soft 옵션은 HEAD만 이동하고 인덱스와 작업 트리는 모두 변경하지 않고 유지합니다. 이 옵션은 git status를 통해 표시된 대로 모든 변경 내용을 “커밋될 변경 내용”으로 유지합니다. --hard 재설정은 지정된 커밋과 일치하도록 인덱스와 작업 트리를 모두 변경합니다. 추적된 파일에서 변경한 내용이 모두 삭제됩니다.