실수를 되돌리기 위한 Git 기술

3867 단어 githubvcsbashgit
이런! 방금 비밀 API 키를 커밋했습니다! 또는 이전 커밋의 변경 사항을 되돌리고 싶을 수도 있습니다. 그것이 무엇이든, 이 블로그는 몇 가지 일반적인 VCS 실수와 Git 수정 방법을 강조합니다.

참고: 이러한 팁의 대부분은 변경 사항을 원격 저장소로 푸시하기 전에만 적용됩니다. 원격 리포지토리의 기록을 다시 작성하는 것은 무섭고 수행 중인 작업을 알지 못하는 한 피해야 합니다! 원격을 로컬 상태로 정말로 바꾸려면 --force 플래그로 푸시하십시오.

1. 언스테이지



파일 자체를 수정하지 않고 스테이징 영역에서 무언가를 제거하고 싶다고 가정해 보십시오.
  • 현재 준비 영역에 있는 파일을 확인하십시오. git diff --name-only --cached
  • 특정 파일을 언스테이징: git reset HEAD <file>
  • 또는 모든 것을 언스테이징: git reset HEAD

  • 2. 커밋 해제


  • 작업 트리(파일)를 변경하지 않고 기록에서 마지막 커밋을 제거합니다. git reset HEAD^
  • 동일하게 수행하되 준비 영역에 파일을 유지합니다. git reset --soft HEAD^
  • 커밋을 제거하고 이전 커밋 이후의 모든 변경 사항을 버립니다(이 경우 주의): git reset --hard HEAD^

  • 3. 커밋 되돌리기



    기록의 일부 커밋이 문제가 되었기 때문에 변경 사항을 취소하려면 새로운 "커밋 되돌리기"를 생성하십시오.
  • 되돌리려는 커밋의 ref 찾기: git log
  • 새 되돌리기 커밋 만들기: git revert <ref>

  • 원래 커밋을 그대로 유지하고 원격 저장소로 푸시된 커밋에 안전하게 사용할 수 있습니다.

    4. 커밋 수정


  • 커밋 메시지에 오타가 있었습니다. 파일을 변경하지 않고 수정하십시오. git commit --amend -m "New message"
  • 메시지를 변경하지 않고 커밋 파일을 변경합니다. git commit --amend --no-edit

  • 5. 버리기



    파일을 수정했고 모든 것을 버리고 이전 커밋으로 돌아가고 싶습니다.

    옵션 A - 변경 사항 숨기기(권장)


  • 현재 변경 사항을 모두 숨김(특정 파일에 사용할 수도 있음): git stash push
  • 깨끗한 저장소를 위해 추적되지 않은 파일도 숨김: git stash --all
  • 원할 때마다 저장된 변경 사항을 복원할 수 있습니다. git stash pop

  • 옵션 B - 하드 리셋(권장하지 않음)


  • 작업 트리를 커밋 상태로 재설정(변경 사항이 손실됨): git reset --hard <commit>
  • 깨끗한 저장소를 위해 추적되지 않은 파일을 제거합니다(무시된 파일의 경우에도 -x): git clean -fd
  • 변경 사항을 복구해야 하는 경우 git reflog show HEAD를 사용하고 ref로 다시 재설정하십시오. 하지만 stash 작업이 더 쉽습니다.

  • 6. 리베이스



    git의 스위스 아미 나이프. 기본적으로 2-4단계를 모두 한 번에 수행할 수 있습니다. 커밋을 편집, 이동 및 병합하여 기록을 다시 작성합니다. 다시 말하지만 아직 원격 저장소로 푸시되지 않은 커밋에만 사용하세요. 그렇지 않으면 화난 동료가 생길 수 있습니다.
  • 원격으로 푸시되지 않은 모든 것을 대화식으로 리베이스: git rebase -i
  • 또는 마지막x 커밋을 리베이스: git rebase -i HEAD~<x>

  • 대화식 리베이스 참조:

    Commands:
    p, pick = use commit
    r, reword = use commit, but edit the commit message
    e, edit = use commit, but stop for amending
    s, squash = use commit, but meld into previous commit
    f, fixup = like "squash", but discard this commit's log message
    x, exec = run command (the rest of the line) using shell
    d, drop = remove commit
    


    이것은 매우 강력한 도구입니다. 몇 가지를 권장합니다further reading.

    보너스 - .gitignore


    .gitignore를 만들어 스테이징 영역에 추가하지 않으려는 특정 파일(중요하게는 환경 변수 및 API 키)을 지정합니다. 다양한 프로젝트에 대한 템플릿 목록this을 참조하십시오.

    다음에 무엇을할지


  • 이러한 명령 중 일부를 별칭으로 설정하면 모든 것을 기억할 필요가 없습니다. 내 .gitconfig 를 참조하십시오.
  • VSCode를 사용하는 경우 일부 Git 관련 확장을 설치합니다. 예를 들어 Checkpoints을 사용하여 임시 로컬 WIP 커밋을 만들어 작업을 저장합니다. 전체 목록은 내 .
  • 일부 CLI 도구를 설치합니다. 예를 들어, 나는 diff를 보기 위해 diff-so-fancy 을 사용하는 것을 좋아합니다. 전체 목록은 내 .

  • 추가적인 팁은 댓글로 남겨주세요!

    좋은 웹페이지 즐겨찾기