0. Introduction

  • 해당 내용은 제대로 파는 Git & GitHub - by 얄코 을 통해서 공부한 내용입니다.

  • 이번 단원에서는 git stash, git commit --amend 그리고, git rebase -i 명령어를 학습해본다.

  • 마지막으로 과거의 커밋을 수정, 삭제, 병합, 분할해보는 명령어를 학습해본다.


7-3. git stash

커밋하기 애매한 변화를 치워두는 명령어

  • Stash 사용법 정리
명령어설명비고
git stash현 작업들 치워두기끝에 save 생략
git stash apply치워둔 마지막 항목(번호 없을 시) 적용끝에 번호로 항목 지정 가능
git stash drop치워둔 마지막 항목(번호 없을 시) 삭제끝에 번호로 항목 지정 가능
git stash pop치워둔 마지막 항목(번호 없을 시) 적용 및 삭제apply + drop
git stash branch(브랜치명)새 branch를 생성하여 pop충돌사항이 있는 상황 등에 유용
git stash clear치워둔 모든 항목들 비우기
  • 변경사항을 먼저 만들어보자.

    • Tigers의 members에 Stash를 추가한다.
    • tomcats.yaml을 추가한 후, git add를 실행
    • 여기서 git add를 한 이유는 git stash라는 명령어를 실습하기 위해서는 먼저 tracked 상태여야 한다.
  • git stash 실행: git add 했던 변화들이 사라진다.

    • 사라진 변화들은 sourcetree에서 스태시 란에서 확인할 수 있다.
  • git stash pop 을 입력하여 원하는 시점, 브랜치에 다시 적용한다.

    • 다른 branch를 만들고 전환 후, 이 명령어로 적용해보자.
  • git add -p처럼 원하는 것만 stash 할 수 있다.

    • Leopards의 members에 Stash2를 추가한다.
    • Jaguars의 members에 Stash3를 추가한다.
    • git stash -pStash2만 선택하여 스태시한다.
  • 메시지와 함께 스태시를 할 수도 있다.

    • git stash -m 'Add Stash3'

      1
      2
      
      $ git stash -m 'Add Stash3'
      Saved working directory and index state On remote-branch: Add Stash3
      
  • 스태시 목록 보기
    -git stash list

    1
    2
    3
    
    $ git stash list
     stash@{0}: On remote-branch: Add Stash3
     stash@{1}: WIP on remote-branch: 1b2bbcb Edit Leopards and Tigers
    
  • 스태시된 항목 삭제: git stash drop

    1
    2
    3
    4
    5
    
    $ git stash drop stash@{0}
    Dropped stash@{0}
    
    $ git stash list
    stash@{0}: WIP on remote-branch: 1b2bbcb Edit Leopards and Tigers
    

7-4. git commit –amend

Commit message 변경하기

  • 커밋 메시지를 변경하거나, 커밋에 변화를 추가 또는 커밋 메시지를 한 줄로 변경할 수도 있다.

  • 커밋 메시지 변경

    • 파일에 변화를 준 후, 커밋 메세지를 와웅 으로 입력해보자.
    • git commit --amend 를 입력하여 편집창을 띄운다.
    • Commit message: Add a member to Panthers 를 입력 후, :wq를 입력하여 저장 종료한다.
    • git log로 확인해보자.
  • 커밋에 변화 추가: 지난 커밋에 줘야할 변화를 깜빡했을 경우

    • 파일들에 변화를 준 후, staging area에 올린다.
    • git commit --amend로 마지막 커밋에 포함시킨다.
  • 위에 처럼 git commit --amend를 실행한 후, 편집기가 뜨면 그 때 메세지를 수정하는 것 외에도 단 한 줄로도 수정할 수 있다.

    • git commit --amend -m '(커밋 메세지)'
  • 또한 바로 staging area에 올리면서 한 번에 커밋메세지를 수정하는 방법도 있다.

    • git commit -a --amend -m '(커밋 메세지)'

7-5. git rebase -i

i란 interactive를 의미하며, 과거의 커밋 내역들을 다양한 방법으로 수정 가능하다.

  • git rebase -i를 입력했을 때, 사용되는 명령어들
명령어설명
p, pick커밋 그대로 두기
r, reword커밋 메세지 수정
e, edit수정을 위해 정지
d, drop커밋 삭제
s, squash이전 커밋에 합치기
  • git log로 커밋 내역들을 확인한다.
  • git rebase -i <commit 해시 번호>를 입력하며 다음과 같이 뜬다.
1
2
3
4
5
6
7
8
$ git rebase -i

pick 1c799ad
pick ff00ad8
pick f35344a
pick b9d4eb7
pick 8605c74
pick 59b42f3

git rebase -i를 입력했지만, Vim 화면은 뜨지 않고, ‘There is no tracking information for the current branch..‘가 뜰 때는 최신 커밋을 입력한 것이다. 해당 명령어는 입력한 커밋 해쉬 번호 이후부터를 보여주기 때문에, 최신 커밋을 보여줬으므로 당연히 아무것도 뜨지 않는다.

Vim에서 수정해보기

  • 다음 수정사항들을 진행해보자.

    • hash number가 1c799ad인 커밋 메세지를 버그 수정으로 변경한다.

      • r 명령어를 사용한다.
    • hash number가 ff00ad8인 커밋은 삭제

      • d 명령어 사용
    • hash number가 b9d4eb7f35344a에 합치기

      • 첫 항목 뒤로 s명령어 사용하기
      • 메시지 수정 후 저장
        • 커밋 메세지는 하나만 있으면 되므로, 두 개중 하나의 커밋 메세지를 삭제한다.
    • 위 명령어들을 입력하면 다음과 같다.

      1
      2
      3
      4
      5
      6
      7
      8
      
      $ git rebase -i
      
      r 1c799ad
      d ff00ad8
      pick f35344a
      s b9d4eb7
      pick 8605c74
      pick 59b42f3
      

하나의 커밋을 두 커밋으로 나누기

  • 한 커밋 안에 두 작업이 있으므로, 2개의 커밋으로 나누는 작업을 진행해보자.
    • git rebase -i <나눌려고 하는 commit의 이전 commit 해시 번호> 입력
      • pick에서 e 로 수정하고 :wq
    • git reset HEAD~
    • 변화들을 따로 스테이지 및 커밋
    • git rebase --continue

Reference