티스토리 뷰

728x90
반응형

 

 

2021.01.28 로컬 브랜치, 원격 브랜치 삭제 명령어 추가

 

인프런 강좌 Country님의 실무자가 알려주는 Git - 입문편 강의와 교재를 참고하여 작성한 글입니다.

 

Git Lifecyle

  • 간단히 add & commit(ci)
    • add: 이 파일을 Git이 관리하게 하겠다 (or 수정 완료했다)
    • commit: 이 파일을 Git에 저장하겠다
  • lifecyle
  • Untracked
    • Git과 아무 상관이 없는 상태
    • 따라서 Git이 대상 파일을 관리하지 못함
    • 최초 add를 해줘야 Git의 관리 대상이 됨
    • Git이 관리하는 파일을 삭제하면 Untracked가 됨
  • Unmodified
    • 코드 저장이 완료된 상태
    • Staged 상태에서 commit을 하면 Unmodified가 됨
  • Modified
    • Git으로 관리되고 있던 코드를 수정하여 변경이 일어난 상태
    • Unmofieid 상태인 파일을 수정하면 Modified가 됨
    • commit 할 수 없음. commit 하려면 Staged 상태가 되야함
  • Staged
    • 이제 코드를 저장해도 좋다는(commit이 가능한) 상태
    • Untracked/Modified 상태인 파일을 add 하면 Staged가 됨

이제 기본적인 명령어들을 설명할텐데 그전에 alias설정으로 인해 명령어들이 축약 돼 있는것을 확인해주시길 바랍니다. 즉, checkout명령은 co랑 같게 환경설정이 돼 있습니다.

alias 설정

기본적인 명령어들

status (st)

  • 현재 git 상태를 보여줌.
  • Untracked files : Untracked 상태인 파일들
    • cd ~/git-exer
      echo "status exer" >> st.md
      git st
      
      ---
      
      On branch master
      Untracked files:
      (use "git add <file>..." to include in what will be committed)
      
      st.md
      
      nothing added to commit but untracked files present (use "git add" to track)
  • Changes to be committed: Staged 상태인 파일들
    • git add st.md
      git st
      
      ---
      
      On branch master
      Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
      
      new file:   st.md
  • nothing to commit, working tree clean: Unmodified 상태인 파일들
    • git ci -m 'Make st.md'
      git st
      
      ---
      
      On branch master
      nothing to commit, working tree clean

log (lg)

  • 히스토리를 조회하는 명령어
  • 커밋 단위로 히스토리가 쌓임
  • log를 볼 줄 알아야 develop, release, hotfix 브랜치가 난무할 때 merge 방향이나 순서를 이해할 수 있음
  • 위에 있는 것이 최신, 아래 있을 수록 예전 커밋
  • git lg

  • ab118e1 - (73 minutes ago) Make st.md - Country
  • e5d33ad - (2 days ago) initial commit - Country (origin/master)

add

  • 파일을 Staged 상태로 만듦 -> 파일을 Git이 관리하는 상태로 만듦
    • Untracked / Modified 상태의 파일에 사용할 수 있음
  • 이제 commit을 하면 코드를 저장할 수 있음
  • Untracked 에서 진행
    • echo "## Git class" >> index.md
      git st
      
      ---
      
      On branch master
      Untracked files:
      (use "git add <file>..." to include in what will be committed)
      
      index.md
      
      nothing added to commit but untracked files present (use "git add" to track)
      git add index.md
      git st
      
      ---
      
      On branch master
      Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
      
      new file:   index.md
  • Modified 에서 진행
    • vi st.md
      git st
      
      ---
      
      Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
      
      modified:   st.md
      git add st.md
      git st
      
      ---
      
      On branch master
      Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
      
      new file:   index.md
      modified:   st.md

commit (ci)

  • 파일을 Unmodified 상태로 만듦 -> 한 단위의 작업이 완료
  • Git 시스템에 영구적으로 변경을 저장
  • SHA-1 알고리즘을 적용한 해시값을 키로 생성.
  • 히스토리가 하나 추가됨
  • 실무에서 한 작업 (기능, 피처) 단위로 한 커밋 권장
  • git ci -m 'Modify files'
    
    ---
    
    [master 42298d3] Modify files
    2 files changed, 2 insertions(+)
    create mode 100644 index.md
  • git st
    
    ---
    
    On branch master
    nothing to commit, working tree clean
  • git lg
    
    ---
    
    -   1e928bc - (20 seconds ago) Modify files - Country (HEAD -> master)
    
    -   51462d0 - (4 hours ago) Modify st.md - Country
    
    -   ab118e1 - (4 hours ago) Make st.md - Country
    
    -   e5d33ad - (2 days ago) initial commit - Country (origin/master)

옵션

  • -m : 메시지를 넣음
  • -a : add를 같이 함. 단순히 Modified
  • -am : -a-m을 합친 것. 제일 많이 사용
  • --amend
    • 마지막 커밋을 수정
    • Stage 상태의 파일들과 같이 커밋됨
    • 만약 Stage에 아무것도 없다면 (commit이후에 작업을 안했으면) 커밋 메시지만 수정
    • git lg
      
      ---
      
      * 1e928bc - (5 minutes ago) Modify files - Country (HEAD -> master)
      * 51462d0 - (4 hours ago) Modify st.md - Country
      * ab118e1 - (4 hours ago) Make st.md - Country
      * e5d33ad - (2 days ago) initial commit - Country (origin/master)
    • git ci --amend
      
      ---
      
      [master 69e0e26] Rewrite commit message
      Date: Mon Mar 9 23:32:31 2020 +0900
      2 files changed, 2 insertions(+)
      create mode 100644 index.md
    • git lg
      
      ---
      
      * b0c729f - (6 minutes ago) Rewrite commit message - Country (HEAD -> master)
      * 51462d0 - (4 hours ago) Modify st.md - Country
      * ab118e1 - (4 hours ago) Make st.md - Country
      * e5d33ad - (2 days ago) initial commit - Country (origin/master)

branch (br)

  • 커밋 사이를 가볍게 이동할 수 있는 어떤 포인터 같은 것 (3.1 Git 브랜치 - 브랜치란 무엇인가 )
  • 하나의 작업 공간 단위 정도로 생각
  • 브랜치 확인: git br
  • 브랜치 생성: git br test/1
  • 브랜치 삭제: git br -D test/1

branch 전략

Git branch 전략 (Git Flow)

  • GitFlow
  • master
    • git init하면 생기는 태초의 브랜치
    • 배포 가능한, 말그대로 master 브랜치
    • 보통 태그를 따서 태그로 배포함
  • develop
    • 보통 작업할 때 기준이 되는 브랜치.
    • 개발 서버에도 평소에는 develop 기준으로 배포하며 테스트 함
    • 생성 위치: master (태초)
  • hotfix
    • 서비스에 문제가 생기거나 갑자기 무언가 고쳐서 배포해야 할 때 사용
    • 생성 위치: master (그렇지 않으면 다른 작업들이 딸려 나감)
    • merge: master & develop
  • feature
    • 실제로 뭔가 기능(feature)를 만드는 브랜치
    • 생성 위치: develop
    • merge: develop (code reivew)
  • release
    • 새로운 기능들을 추가하여 배포하기 위한 브랜치
    • 생성 위치: develop
    • merge: master & develop
  • 다른 Git branch 전략들도 있음

HEAD

  • 지금 작업하는 로컬 브랜치를 가리키는 포인터 (3.1 Git 브랜치 - 브랜치란 무엇인가)
  • 현재 브랜치 마지막 커밋의 스냅샷
  • branch를 변경하면 해당 브랜치의 마지막을 가리키고 있음
  • HEAD를 움직이면서 여러 버전의 코드들을 볼 수 있음

checkout (co)

  • 다른 브랜치로 이동
  • 옵션
    • -b : 브랜치 생성하고 그 브랜치로 checkout
      • 아래 두 명령은 같음
      • git co -b develop
      • git br develop
        git co develop
  • git co master

checkout TIP

  • 커밋의 hash값을 알면 시간 여행이 가능함
  • git lg
    
    ---
    
    * b0c729f - (3 hours ago) Rewrite commit message - Country (HEAD -> master)
    * 51462d0 - (6 hours ago) Modify st.md - Country
    * ab118e1 - (7 hours ago) Make st.md - Country
    * e5d33ad - (2 days ago) initial commit - Country (origin/master)
  • git co e5d33ad
    
    ---
    
    Note: checking out 'e5d33ad'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:
    
    git checkout -b <new-branch-name>
    
    HEAD is now at e5d33ad initial commit
  • git lg
    
    ---
    
    * b0c729f - (3 hours ago) Rewrite commit message - Country (master)
    * 51462d0 - (6 hours ago) Modify st.md - Country
    * ab118e1 - (7 hours ago) Make st.md - Country
    * e5d33ad - (2 days ago) initial commit - Country (HEAD, origin/master)

push

  • 로컬 브랜치의 정보를 원격 저장소로 업로드
  • Clone 한 리모트 저장소에 쓰기 권한이 있어야 함
  • 같은 브랜치로 여러명이 받아서 누군가 push를 했다면 나는 push 안됨
  • 다른 사람이 작업한 것을 가져와서 합친 후에 (Merge or Rebase) Push 할 수 있음
  • git co master
    git push [origin] [master]
  • 옵션
    • --force (-f)
      • 내 로컬 브랜치로 원격 브랜치를 덮어 씌워버림
      • 내가 혼자 작업하던 feature 브랜치에서만 사용해야함
      • 시나리오: 누군가 악의적으로 master브랜치를 망가뜨린다면?

pull, fetch

  • Clone 한 서버에서 데이터를 가져오고, 그 데이터를 자동으로 현재 작업하는 코드와 Merge (2.5 Git의 기초 - 리모트 저장소 )
  • fetch: 서버에서 데이터만 가져오고 자동으로 코드를 합치지는 않음
  • -- 새로운 디렉토리 cd ~ mkdir git-other cd git-other git clone 'https://github.com/HwangNara/git-exer.git' cd git-class vi README.md git ci -am 'Modify README.md' git push
  • -- 원래 디렉토리
    git pull

pull & push 실습

  • 환경: master에서 딴 test 브랜치 / 2개의 터미널
  • 내용
    1. fetch vs. pull
    2. pull 충돌 실험
    3. branch 삭제

branch 삭제 명령어
Local

git br -D [브랜치 name]

remote 브랜치 삭제 명령어

git push origin --delete [브랜치 name]
  • 추가 명령어
    • 파일 변경 내용 보기: git diff
    • 리모트의 브랜치 삭제: git push origin --delete {branch명}
    • 삭제된 리모트 브랜치를 로컬에도 반영: git fetch -p

728x90
반응형
댓글