포스트

Git 명령어

Git 명령어

목차

prolog.

add, push, pull, merge는 설명 생략

About MR

  • About MR

    MR한 거 되돌릴 때는 revert 버튼이 있다. 그것만 누르면 끝

    /assets/img/git/GIT_CMD_1

HEAD와 Branch의 관계

  • HEAD와 Branch의 관계

    Head는 기본적으로 브랜치(ex. master)를 통해서 커밋을 가리킨다.

    기본적인 HEAD와 브랜치의 관계

    기본적인 HEAD와 브랜치의 관계

Checkout(심화)

  • Checkout(심화)

    일반적으로 아는 checkout의 기능은 아마 브랜치를 옮기는 것이다.

    → HEAD가 다른 브랜치를 가리키도록 하는 것

    하지만, HEAD가 직접 커밋을 가리키도록 할 수도 있다.

    1
    2
    
      git checkout 9033
       실행하면 아래 그림처럼 바뀐다.
    

    이런 상태가 바로 Detached HEAD이다. 이렇게 HEAD가 특정 커밋을 직접 가리키게 하는 이유는 여러가지가 있을 수 있지만 그 중에서 주된 이유 한 가지는 바로 과거의 특정 커밋에서 새로운 브랜치를 만들고 싶을 때 사용한다.

    HEAD가 9033 커밋을 가리키고 있다.(Detached HEAD 상태)

    HEAD가 9033 커밋을 가리키고 있다.(Detached HEAD 상태)

    이 상태(Detached HEAD)에서

    1
    2
    
      git branch premium
      으로 premium 브랜치를 새로 만들면 아래 그림과 같은 결과가 된다.
    

    /assets/img/git/GIT_CMD_1

    1. 지금 premium이라는 브랜치가 새로 생성되었고
    2. premium 브랜치는 HEAD가 가리키던 커밋을 똑같이 가리키게 된다.

    이렇게 쓰면

    1
    
      git checkout premium
    

    HEAD가 premium 브랜치를 가리키게 됩니다.

    Detached HEAD 상태에서 벗어나 HEAD가 브랜치를 가리키는 정상적인 상태로 돌아오는 거죠.

    /assets/img/git/GIT_CMD_1

    그리고 이렇게 HEAD가 premium 브랜치를 가리키는 상태일 때 새 커밋을 하면

    /assets/img/git/GIT_CMD_1

    이제 premium 브랜치로 master 브랜치와 다른 새로운 코드 관리 흐름을 가져갈 수 있게 되는 겁니다.

Commit

  • Commit

    그냥 커밋말고 —amend 옵션을 알아보겠다.

    amend는 가장 최신 커밋을 수정하고 싶을 때 쓰는 옵션이다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      (선택사항) 파일을 추가하고 싶은 경우
      git add [파일명]
      git commit --amend
        
      그러면 아래 그림과 같이 커밋 메세지를 수정하는 창이 뜬다. 수정하고 싶으면 a 하고 수정  :wq
        
      아니면 그냥 :q 내용 저장 안하고 끄고 싶으면 :q! 
        
      git push -f
    

    /assets/img/git/GIT_CMD_1

Reset

  • Reset

    사용 예:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      **상황1**
      원격 저장소에 올라간 커밋을 되돌려야 하는 상황
        
      **대처법**
      working directory와 staging area를 보존한 상태에서 그냥 커밋만 되돌리고 싶은 경우
      `git reset --soft HEAD~x`  로컬 커밋을 되돌리고
      마지막으로, `git push -f origin [원격 브랜치]` 하면 상태 복구
        
      * -f나 -force 옵션 없이 그냥 `git push origin [원격 브랜치]` 경우,
      	로컬 저장소의 커밋 히스토리가 원격 저장소의 커밋 히스토리보다 뒤쳐져 있는데
      	푸시를 하였으므로 이를 이상하게 여기고 에러가 발생한다.
    
    1
    2
    3
    4
    5
    6
    7
    
      **상황2**
      로컬 세팅이 있는 상태에서 작업을 하다가 푸시한 커밋을 되돌려야 하는 상황
        
      **대처법**
      로컬 세팅과 작업을 하던 중이므로, 일단 `git stash` 한다. (working directory 내용 저장)
       , `git reset --hard HEAD~x` 한다.
      마지막으로, `git stash pop` 하면 상태 복구
    

    git reset을 할 때는 보통 아래와 같은 형식으로 쓰는데요.

    1
    
      git reset [옵션] [커밋 아이디]
    

    그런데 이렇게 커밋 아이디를 쓰려면 매번 커밋 아이디를 찾아야한다는 불편함이 조금 있습니다.

    사실 [커밋 아이디] 자리에 다른 걸 써줘도 되는데요.

    1
    2
    
      git reset --hard HEAD^  [HEAD 이전 커밋]
      git reset --hard HEAD~x [HEAD x단계  커밋]
    

    HEAD^는 현재 HEAD가 가리키고 있는 커밋의 바로 이전 커밋을 나타냅니다.

    만약 ‘바로 이전’보다 좀더 이전에 있는 커밋을 나타내고 싶다면 아래와 같이 쓰면 됩니다.

    ex. git reset –hard HEAD~2

    여기서 HEAD~2는 현재 HEAD가 가리키는 커밋보다 2단계 전에 있는 커밋을 나타냅니다.

    /assets/img/git/GIT_CMD_1

    ### git reset을 하고 나서 되돌아오려면?

    /assets/img/git/GIT_CMD_1

    /assets/img/git/GIT_CMD_1

    ### git reset vs git checkout

    마지막으로 git reset과 git checkout의 차이점을 짚고 넘어갈게요.

    둘의 차이점은 아래 표와 같습니다.

    git resetgit checkout
    HEAD가 가리키던 브랜치가 다른 커밋을 가리키도록 한다HEAD 자체가 다른 커밋이나 브랜치를 가리키도록 한다
    HEAD도 결국 간접적으로 다른 커밋을 가리키게되는 효과가 생긴다브랜치를 통하지 않고, 커밋을 직접적으로 가리키는 HEAD를 Detached HEAD라고 한다

Revert

  • Revert

    git revert : 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성

    1
    2
    
      git revert [커밋 아이디] - 커밋 하나를 되돌릴 
      git revert [커밋해쉬1]..[커밋해쉬3] - 커밋 여러 개를 되돌릴 ,여기서는 커밋해쉬2,3 revert
    

    git reset을 사용해서 되돌릴 경우, 원격 저장소의 히스토리보다 뒤쳐져있기 때문에 -f 옵션 없이는 git push 할 수 없다. 그에 반해, git revert는 현재 커밋에서 revert 커밋을 새로 생성하므로 그냥 push 할 수 있다.

    /assets/img/git/GIT_CMD_1

Cherry-pick

  • Cherry-pick

    다른 브랜치의 커밋 중 원하는 내용만 가져오고 싶은 경우 git cherry-pick 커밋 을 사용한다.

    /assets/img/git/GIT_CMD_1

Rebase

  • Rebase

    주로 특정 커밋 이후 커밋 중 수정하고 싶은 것이 있을 때 사용한다.

    *rebase를 하면 커밋ID가 새로 생성되기 때문에 변경내역에 잡힌다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
      git rebase -i HEAD~<number_of_commits>
    
      pick 1234567 Commit message 1
      edit 89abcde Commit message 2 (수정하고 싶은 커밋)
      pick fedcba9 Commit message 3
    
      git add <modified_files>
      git commit --amend
      git rebase --continue
      git push --force
    

Stash

  • Stash

    /assets/img/git/GIT_CMD_1

    stash 한 내용을 다시 가져오고 싶을 땐

    1
    2
    3
    
      git stash list (stash 리스트)
      git stash apply (stash 적용)
      git stash pop (stash 적용  내용 삭제)
    

Alias

  • Alias

    Git에는 길이가 긴 경우의 커맨드 전체에 별명을 붙여서 그 별명을 사용할 수 있도록 해주는 기능이 있습니다.

    이 때 붙이는 별명을 alias라고 하고, 별명을 붙이는 행위를 aliasing이라고 합니다.

    1
    2
    3
    4
    5
    
      방법 1 - 커멘드라인 직접입력
      git config alias.history 'log --pretty=oneline'
        
      방법 2 - .gitconfig 파일 수정하기
      vim ~/.gitconfig
    

    /assets/img/git/GIT_CMD_1

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.