ENAN

Developer, Artist, Traveler

공부/DevOps, 개발 전반

git 정리 + 커밋 푸시 어떻게 취소해요?

ENAN 2021. 2. 28. 14:42

매일 사용하면서도 정확하게 안다는 느낌이 없었는데, 마침 스터디 같이 하는 친구가 깃 명령어가 꼬이는 바람에 고생하고 있어서 한번 싹 정리했다. 용어 설명은 간략하게 하고, git 명령어 취소를 중점적으로 정리했다.

Git

깃(Git)은 프로그램 등의 소스 코드 관리를 위한 분산 버전 관리 시스템이다. (- 위키백과 -)

어렵게 느껴질 수 있지만 대강의 뜻은 이렇다.

  • 분산 : 여러 개발 환경(즉 여러 명의 개발자)에서 한 프로젝트를 협업하며 개발할 수 있음
  • 버전 : 개발 단계에 따라 한 프로젝트의 여러 버전을 나누고 관리할 수 있음

아무튼 다시 정리하면, 여러 명의 개발자가 버전 관리를 하며 쉽게 협업할 수 있는 툴!

용어

  • Repository: 코드나 문서를 비롯한 리소스를 저장하는 곳을 말하며, 프로젝트 단위로 만든다. 그냥 리포(repo)라고 줄여쓰기도 한다.
    • 원격 저장소(Remote repository) : 깃허브같은 호스팅 서비스 서버에 올라가 있는 저장소
    • 로컬 저장소(Local repository) : 개인 컴퓨터에 있는 저장소
  • Fork: 다른 사람의 원격 저장소를 그대로 복사해 내 계정의 원격 저장소로 만드는 것
  • Pull Request: 내 저장소의 변경 내용을 다른 사람의 저장소에 반영하도록 요청하는 것. 풀 리퀘스트를 보내면 해당 저장소의 메인테이너(프로젝트를 관리하는 사람)이 내 작업을 반영할지 말지 결정한다. 풀 리퀘, PR이라고 줄여 말한다.
  • Issue: 프로젝트의 버그 리포트, 기능 제안, 질문 등을 말하며, 깃허브 저장소에서 Issues 탭에 들어가면 다양한 토론을 볼 수 있다.

  • git에서 관리하는 파일들의 상태
  • HEAD : 현재 작업중인 브랜치의 작업중인 커밋을 가리키는 포인터
    • 특정 커밋을 가리키게 할 수 있음
  • Tag : commit에 이름을 지정해주는 역할
    • 주로 v1.0.0 과 같이 버전 정보를 나타낼 때 사용

  • .gitkeep : git에 빈 폴더만 추가할 수 없기 때문에 폴더 구조를 추가하기 위해 만드는 내용 없는 파일

명령어

  • 초기 세팅
    • git을 처음 설치했다면
      • git config -- global user.name user_name : git 계정 Name 변경하기
      • git config -- global user.email user_email : git 계정 Mail 변경하기
    • init : 현재 폴더를 git 폴더로 초기화
    • clone github repo 주소 : github repository를 로컬에 다운받고 연결
    • remote
      • git remote -v : 현재 연결된 깃헙 레포지토리를 확인
      • remote add 원격 저장소 이름 github repo 주소 : 현재 폴더와 github repo를 연결
        • ex) git remote add origin http://somerepo.git
      • remote remove 원격 저장소 이름 : 원격 저장소 연결 해제

  • 코드 올리는 과정
    • add file 이름 : 다음 커밋에 이 파일을 추가한다
    • commit -m commit 메세지 : 작업 내역을 저장한다
    • push
    • pull-request
  • 코드 받아오는 과정
    • fetch : 가져오기
    • merge : 합치기
    • pull : fetch + merge

  • 브랜치 다루기
    • checkout
      • git checkout branch명 : 특정 브랜치로 이동
      • git checkout -b branch명 : 브랜치를 새로 만들고 그 브랜치로 이동
      • git checkout -t 원격 저장소 이름/branch명 : 로컬에는 없지만 원격 저장소에는 있는 브랜치로 이동

  • rm file 이름 : 원격 저장소와 로컬 저장소에 있는 파일을 삭제
    • rm --cached file 이름 : 원격 저장소에 있는 파일만 삭제
  • stash
    • 아직 마무리하지 않은 작업을 잠시 저장하고, 마지막 커밋으로 되돌아감
    💡
    어떤 작업을 하던 중에 잠시 브랜치를 변경해야 할 때, 아직 완료하지 않은 일을 commit하는 것은 껄끄러우니 stash 해놓고 다른 브랜치 확인 후 돌아와서 stash를 다시 가져와 사용
    • git stash : stash를 저장
    • git stash list : stash list 확인
    • git stash apply : stash 가져오기
    • git stash drop : stash 삭제
  • cherry-pick
    • 특정 커밋만 가져오는 것

취소

  • add
    • git reset HEAD file 이름 : 특정 파일을 unstaged 상태로 변경 (안적으면 add된 파일 모두)
      • default로 --mixed 옵션으로 실행됨

  • commit
    💡
    가급적 Push 전에만 아래의 명령어를 사용하는 것을 권장! 이미 push한 커밋에 대해 이 작업을 수행하면 다른 사람들도 영항을 받음
    • git commit --amend -m 수정된 commit 메세지 : 마지막 커밋 메세지 수정
    • git reset --soft 특정 commit
      • -soft 옵션은 작업 디렉토리와 인덱스를 보존하고 헤드만 변경한다 즉, 커밋한 파일들이 add된 상태(staged)로 유지됨
    • git reset --mixed 특정 commit
      • reset의 기본 옵션으로, 작업 디렉토리는 그대로 유지한 채 헤드와 인덱스를 변경한다 커밋한 파일들이 unstaged 상태로 변경됨
    • git reset --hard 특정 commit
      • --hard 옵션의 경우 작업 디렉토리와 헤드, 인덱스를 모두 변경한다.

        → 변경 사항을 다 지워버린다는 말!

        • reset --hard 로 지워진 커밋을 다시 복구하려면 (commit 취소를 취소)
          • git reflog에서 복구하고 싶은 커밋 해시값을 찾음
          • git reset --hard 복구하고 싶은 commit


  • push
    • history가 남는 방법
      ⚠️
      history가 남는다는 말은, 커밋을 되돌려서 사라진 내용을 되살릴 수도 있다는 것! 보안상 공개되면 안되는 파일이 업로드된 경우 이 방법으로 지우면 안된다!
      • push한 commit 삭제
        • git revert 특정 commit
        • git revert HEAD..HEAD~4
      • 원격 저장소의 파일 삭제
        • git rm --cached file 이름 : 원격 저장소에서 파일 삭제
        • 원격 저장소에 반영시키기 (commit → push)
    • history가 남지 않는 방법
      ⚠️
      이 방법으로 지우면 원격 저장소에 흔적도 없이 commit을 삭제할 수 있다. 하지만 내 commit을 pull 한 팀원이 있다면, 다음에 그 팀원이 push할 때 내가 지운 commit이 다시 추가될 수 있다! 즉, 1. 나 혼자만 사용하는 브랜치에 커밋을 push하였고, 이를 되돌리고 싶은 경우 2. 팀원들과 직접 커뮤니케이션해서 내가 되돌릴 커밋을 pull한 팀원이 없다고 확인된 경우 사용하자!
      • push한 commit 삭제
        • git reset 을 사용해 원하는 대로 commit을 삭제
        • git push -f 원격 저장소 이름 branch명
      • push한 파일 삭제
        • 위와 같은 방법으로 commit을 삭제

특정 commit 선택

  • HEAD : 현재 브랜치의 가장 마지막 커밋을 가리키는 포인터
  • HEAD^ : 가장 최근 커밋
  • HEAD~4 : 최근부터 4개

참고

🏕️ 오픈소스 입문을 위한 아주 구체적인 가이드
Table of Contents 작년 겨울부터 오픈소스에 관심이 생겨 이곳저곳에 이슈도 올리고 풀 리퀘스트도 보내고 있다. 오픈소스 기여의 가장 큰 장점은 남의 코드를 많이 읽을 수 있다는 점과 기술 트렌드를 계속 확인할 수 있다는 점이다. 그리고 영작 실력도 미세하게 (...) 향상된 것 같다. 처음 오픈소스 활동을 시작할 때 네이버 오픈소스 가이드 가 큰 도움이 됐다.

'공부 > DevOps, 개발 전반' 카테고리의 다른 글

Throttle vs Debounce  (0) 2021.05.28
[Clean Code] 2. 의미 있는 이름  (0) 2021.05.03
[Clean Code] 1. 깨끗한 코드  (0) 2021.05.03
[Clean Code] 0. 들어가면서  (0) 2021.05.03