[Git] 기본명령어 및 활용

4 minute read

Git 명령어

오늘은 Git 명령어에 대하여 알아보겠습니다.

기본적인 명령어와 시나리오를 통해 충동상황을 인위적으로 만들어보고 해결해보는 방법으로 알아보겠습니다.

git branch 확인

$ git branch

* master

git branch 생성

$ git branch hellobranch
$ git branch
 hellobranch
\* master

git 특정 branch 로 이동

$ git checkout hellobranch
'hellobranch' 브랜치로 전환합니다

git branch에서 commit

$ git touch hellobranch.md
$ git add .
$ git commit -m 'hellobranch'
[hellobranch 38888aa] hellobranch
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 hellobranch.md

git master 에서 확인

$ git checkout master
'master' 브랜치로 전환합니다

폴더를 확인하면 branch 에서 생성한 hellobranch.md 파일을 확인할 수 없습니다.

git merge

Branch 에서 작업한 내용을 master에 적용하고 병합하기 위하여

$ git merge hellobranch 

git branch 삭제

$ git branch -d {브랜치 이름}
$ git branch -d hellobranch
hellobranch 브랜치 삭제 (과거 38888aa).
$  git branch
* master

git branch 생성 및 이동

$ git checkout -b {브랜치 이름}
$ touch blog.html
$ git add .
$ git commit -m 'Complete blog app'
$ git log --oneline
$ git log --oneline --graph

기타 명령어

restore

작업공간(working directory)의 변경 사항을 버린다.

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  # 힌트!
  (use "git restore <file>..." to discard changes in working directory)
        modified:   CLI.txt

no changes added to commit (use "git add" and/or "git commit")
$ git restore CLI.txt
  • --staged 옵션을 활용하면, staging area를 취소(add 명령어의 반대)

    $ git status
    On branch master
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   CLI.txt
    
    $ git restore --staged CLI.txt
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git restore <file>..." to discard changes in working directory)
            modified:   CLI.txt
      
    no changes added to commit (use "git add" and/or "git commit -a")
    

커밋 메시지 변경

$ git commit --amend
  • vim 편집기가 실행된다.

  • i : 편집 모드로 변경되어서 메시지 변경 가능

  • esc + :wq : 저장하고 종료

  • 주의!! 공개된 커밋은 절대 변경 금지.

    $ git log --oneline
    00a6259 (HEAD -> master) TEest
    f7dc503 First commit
      
    $ git commit --amend
    [master 4d42f0f] Test
     Date: Fri Aug 21 16:17:42 2020 +0900
     1 file changed, 1 insertion(+)
      
    $ git log --oneline
    4d42f0f (HEAD -> master) Test
    f7dc503 First commit
    
    • 커밋시 특정 파일을 빠트린 경우 아래와 같이 활용할 수 있다.

      $ git add omit.html
      $ git commit --amend
      

reset vs revert

  1. revert : 되돌렸다는 커밋이 발생된다.

    $ git revert 특정시점
    $ git log --oneline
    520c668 (HEAD -> master) Revert "Add 3 files"
    8a97ad4 Add 3 files
    4d42f0f Test
    f7dc503 First commit
    
  2. reset : 커밋 자체를 지운다. (원격저장소에 공개된 이력의 경우 주의!)

    $ git reset 특정시점
    $ git log --oneline
    4d42f0f (HEAD -> master) Test
    f7dc503 First commit
    
    • --mixed
      

      : 기본 설정

      • 해당 커밋 이후 변경사항을 staging area 내용 보관
    • --hard
      
      • 해당 커밋 이후 변경사항을 모두 삭제
    • --soft
      
      • 해당 커밋 이후 변경사항 및 working directory 내용 보관

Git 시나리오

상황 1. fast-foward

fast-foward는 feature 브랜치 생성된 이후 master 브랜치에 변경 사항이 없는 상황

  1. feature/test branch 생성 및 이동

    $ git checkout -b  feature/test
    
  2. 작업 완료 후 commit

    $ touch test.html
    
  3. master 이동

    $ git checkout master
    
  4. master에 병합

    $ git merge feature/test
    
  5. 결과 -> fast-foward (단순히 HEAD를 이동)

  6. branch 삭제

    $ git branch -d feature/test
    

상황 2. merge commit

서로 다른 이력(commit)을 병합(merge)하는 과정에서 다른 파일이 수정되어 있는 상황

git이 auto merging을 진행하고, commit이 발생된다.

  1. feature/poll branch 생성 및 이동

    git checkout -b feature/poll
    
  2. 작업 완료 후 commit

    $ touch poll.html
    $ git add .
    $ git commit -m 'complete blog app'
    
  3. master 이동

    $ git checkout master
    
  4. master에 추가 commit 이 발생시키기!!

    • 다른 파일을 수정 혹은 생성하세요!
    $ touch poll.css
    $ git add .
    $ git commit -m 'update poll.css'
    
  5. master에 병합

    (master) $git merge feature/poll
    
  6. 결과 -> 자동으로 merge commit 발생

    • vim 편집기 화면이 나타납니다.

    • 자동으로 작성된 커밋 메시지를 확인하고, esc를 누른 후 :wq를 입력하여 저장 및 종료를 합니다.

      • w : write
      • q : quit
    • 커밋이 확인 해봅시다.

  7. 그래프 확인하기

    $git log --oneline --graph
    \*  43a7747 (**HEAD ->** **master**) Merge branch 'feature/poll'
    |\  
    | * b2dcf72 (**feature/poll**) complete blog app
    \* | bacdf1a update poll.css
    |/  
    \* d9ccd8f Complete blog app
    \* 38888aa hellobranch
    \* 5e8b5fb init
    
  8. branch 삭제

  $ git branch -d feature/poll

상황 3. merge commit 충돌

서로 다른 이력(commit)을 병합(merge)하는 과정에서 동일 파일이 수정되어 있는 상황

git이 auto merging을 하지 못하고, 해당 파일의 위치에 라벨링을 해준다.

원하는 형태의 코드로 직접 수정을 하고 merge commit을 발생 시켜야 한다.

  1. feature/board branch 생성 및 이동

    $ git checkout -b feature/board
    
  2. 작업 완료 후 commit

    • Readme 파일 수정 후 아래 명령어

      $ touch board
      $ git add .
      $ git commit -m 'edit readme and board'
      
  3. master 이동

    $ git checkout master
    
  4. master에 추가 commit 이 발생시키기!!

    • 동일 파일을 수정 혹은 생성하세요!

    • readme .md 수정!

      $ git add .
      $ git commit -m 'edit readme and board'
      
  5. master에 병합

    $ git merge feature/board
    자동 병합: readme.md
       
    충돌 (내용): readme.md에 병합 충돌
       
    자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.
    
  6. 결과 -> merge conflict발생

    admin@adminui-MacBookPro Django % git status
    현재 브랜치 master
    병합하지 않은 경로가 있습니다.
      (충돌을 바로잡고 "git commit"을 실행하십시오)
      (병합을 중단하려면 "git merge --abort"를 사용하십시오)
       
    커밋할 변경 사항:
    	새 파일:       board.html
       
    병합하지 않은 경로:
      (해결했다고 표시하려면 "git add <파일>..."을 사용하십시오)
    	양쪽에서 수정:  readme.md
    
  7. 충돌 확인 및 해결

    중복되었을때 둘다 표시도 가능하고 하나만 선택하는 것이 가능 (vs, pycharm에서 선택가능)

  8. merge commit 진행

    $ git commit
    
    • vim 편집기 화면이 나타납니다.

    • 자동으로 작성된 커밋 메시지를 확인하고, esc를 누른 후 :wq를 입력하여 저장 및 종료를 합니다.

      • w : write
      • q : quit
    • 커밋이 확인 해봅시다.

  9. 그래프 확인하기

    $ git add .
    $ git commit -m 'resolveconflict'
    [master 4a75bda] resolveconflict
       
    $ git log --oneline --graph       
       
    *   4a75bda (HEAD -> master) resolveconflict
    |\  
    | * d7040c2 (feature/board) edit readme and board
    * | eb7b350 edit_readme_master
    |/  
    *   43a7747 Merge branch 'feature/poll'
    |\  
    | * b2dcf72 complete blog app
    * | bacdf1a update poll.css
    |/  
    * d9ccd8f Complete blog app
    * 38888aa hellobranch
    * 5e8b5fb init
    
  10. branch 삭제

    $ git branch -d feature/board
    

Tags: ,

Categories:

Updated:

Leave a comment