ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Git - Local 기초
    Git 2020. 5. 11. 19:46

    Ubuntu(16.04 - Docker)에서 git 사용

    Docker volume 설정

    # docker volume 생성
    $ docker volume create --name dock_volume
    
    # docker volume 확인
    $ docker volume ls
    DRIVER              VOLUME NAME
    local               dock_volume
    
    # docker container 생성
    $ docker run -it --name ubuntu_test -v dock_volume:/root/ ubuntu:16.04
    $ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    32e7f7f30073        ubuntu:16.04        "/bin/bash"         About an hour ago   Up 57 minutes                           ubuntu_test
    
    • 데이터를 저장할 docker volume(dock_volume)을 생성하고 이를 docker의 컨테이너(ubuntu_test)에 연결
    • 컨테이너에서 저장한 데이터는 volume에 저장된다.

    Docker 실행(사용할 컨테이너 이름은 ubuntu_test)

    # container 확인
    $ docker ps -a
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
    10d7402a8968        ubuntu              "/bin/bash"         About an hour ago   Exited (0) About an hour ago                       cool_blackburn
    32e7f7f30073        ubuntu:16.04        "/bin/bash"         About an hour ago   Exited (0) 5 minutes ago                           ubuntu_test
    
    # container 종료
    $ docker stop <container names 또는 conatiner ID>
    # container 실행
    $ docker start <container names 또는 conatiner ID>
    # container 재실행
    $ docker restart <container names 또는 conatiner ID>
    # docker container에 접속
    $ docker attach ubuntu_test
    root@32e7f7f30073:/#
    
    # ubuntu 설정
    root@32e7f7f30073:/# apt-get update
    root@32e7f7f30073:/# apt-get -y install vim && git-all

     

    아래의 내용은 'Pro-Git'을 정리하였습니다.

    Git 셋팅

    # 사용자 설정
    $ git config --global user.name "jihoon"  # 이름 등록
    $ git config --global user.email "jihoon1493@gmail.com"  # 메일 등록
    $ git config --list  # 설정 리스트 확인
    user.name=jihoon
    user.email=jihoon1493@gmail.com
    core.repositoryformatversion=0
    core.filemode=true
    core.bare=false
    core.logallrefupdates=true
    ...
     
    
    
    # home/user/my_repo
    $ git init
    $ ls -al
    drwxr-xr-x 3 root root 4096 May  8 12:44 .
    drwxr-xr-x 3 root root 4096 May  8 12:36 ..
    drwxr-xr-x 8 root root 4096 May  8 12:44 .git
    
    

     

    Git 개념

    • 세 가지 상태
      1. Committed: 데이터가 로컬 데이터베이스에 저장된 상태
      2. Staged: 수정된 파일을 곧 커밋할 것이라고 표시한 상태(add)
      3. Modified: 수정된 파일을 아직 커밋하지 않은 상태(not add)

    • 세 가지 단계
      1. Working tree: 특정 버전에 checkout된 상태(진행 작업이 해당 스냅샷에 위치 - .git에 있는 압축된 데이터베이스를 이용해 작업 트리를 생성)
      2. Staging area(.git): 커밋할 정보를 갖고 있는 파일
      3. Git directory: 프로젝트의 메타데이터 및 데이터베이스를 저장하는 곳(init으로 생성된 .git)
      • 작업 트리에서 파일 수정 → staging area에 커밋할 스냅샷 생성(git add) → .git에 영구적인 스냅샷 저장(git commit) → 수정된 파일은 committed 상태

    • working tree는 Tracked(Unmodified, Modified, Staged)와 Untracked로 나뉨
      • Tracked는 스냅샷에 올라와있는 상태를 의미(git clone 시 가져온 모든 데이터는 Tracked 상태)
        • Unmodified: 스냅샷에 올라와있는 최신 상태
        • Modified: 파일을 수정한 상태
        • Staged: git add 상태 → commit 시 다시 Unmodified 상태
      • Untracked는 스냅샷에 올라와있지 않은 상태를 의미(파일은 생성되었지만 git add 되지 않음)

    • Changes to be committed: Commit이 준비된 상태(Staged)
      • modified: test.txt : test.txt는 수정이 일어났으며 이후 commit이 이뤄진 상태
      • new file: test2.txt: test2.txt는 새로 생성된 후 stage(git add까지 실행된 상태)에 올라온 상태
    • Changes not staged for commit: Tracked 상태지만 stage에 올라와있지 않은 상태
      • modified: test2.txt: test2.txt를 수정한 상태이며 수정된 파일이 stage에 올라가지 않은 상태
    • Untracked files
      • README: 파일이 생성된 이후 한 번도 Stage에 올라오지 않은 상태
    • git commit -a: Tracked 상태의 모든 파일을 한 번에 commit 단, Untracked 파일(README)는 commit되지 않는다.

    git 사용하기 - Local

    간단하게 git 상태 확인: git status -s

    A: 새로 생성된 파일이 staged된 상태(새 파일을 git add)

    M: Tracked 상태의 파일이 수정되었을 때(수정된 파일 git add)

    ??: Untracked

    AM: 왼쪽은 staging area의 상태, 오른쪽은 working tree에서의 상태를 의미

    변경 내용 확인

    • git diff: 수정은 했지만 아직 staged되지 않은 파일을 비교한다. staging area: staged file(add된 test2.txt) vs working tree: modified file(수정은 되었지만 아직 add되지 않은 test2.txt))

    • git diff --staged(또는 --cached): staging area(add 된 파일) vs repository(committed 파일) 변경 부분 확인한다.

    파일 삭제

    • git rm: Tracked 상태(Staging Area)의 파일을 삭제(working tree의 파일(실제 파일)도 삭제됨) → commit → repo에 반영됨

    • git rm --cached <file name>: Staging area에 올라간 파일을 unstage 상태로 만들기 위해 사용

    • README를 생성 → Untracked files
    • git add README → changes to be committed(staged)
    • git rm --cached README → Untracked files

     

    파일이름 변경

    # 파일은 반드시 staged 상태여야한다.
    $ git mv file_from file_to
    # 아래와 동일(git mv는 아래의 단축 명령)
    $ mv file_from file_to
    $ git rm file_from
    $ git add file_to

     

    커밋 히스토리

    # 가장 최근 커밋이 제일 위에 출력된다.
    $ git log

    git log 옵션

    • -p: 각 커밋의 diff 출력
    • -2: 최근 두 개의 결과 출력

    • --stat: 각 커밋의 통계 정보 조회
    • --pretty=[option]
      • online: 각 커밋을 한 라인으로 출력

      • short, full, fuller: 정보의 양을 가감하여 출력

      • format: 커스텀 포맷으로 출력

        • 저자: 파일을 처음 stage에 올린 사람
        • 커미터: 마지막으로 파일을 수정하고 stage에 올린 사람

    # 예시
    $ git log --pretty=format:"%h - %an, %ar : %s"
    ca82a6d - Scott Chacon, 6 years ago : changed the version number 
    085bb3b - Scott Chacon, 6 years ago : removed unnecessary test 
    a11bef0 - Scott Chacon, 6 years ago : first commit

     

    # --graph: 커밋 결과를 그래프로 출력
    git log --pretty=format:"%h %s" --graph
    * 2d3acf9 ignore errors from SIGCHLD on trap
    * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit |\
    | * 420eac9 Added a method for getting the current branch.
    * | 30e367c timeout code and tests
    * | 5a09431 add timeout protection to grit
    * | e1193f8 support for heads with slashes in them
    |/
    * d6016bc require time for xmlschema
    * 11d191e Merge branch 'defunkt' into local

     

    git log - 조회 제한 조건

    • --since, --until: 지난 또는 이후 커밋을 조회

    • --s: 코드에서 추가되거나 제거된 내용 중 특정 텍스트가 포함되어있는지 검색

    # 커밋 내용 중 function_name이 포함된 커밋이 있는지 확인
    $ git log --Sfunction_name

     

    되돌리기(Undo)

    • 완료한 커밋을 수정해야할 때 사용

      • 너무 일찍 커밋했거나 어떤 파일을 빼먹었을 때, 또는 커밋 메시지를 잘못 적었을 때

       

    # 커밋하자마자 이 명령어를 사용할 경우 내용은 변경된 것이 없으며 
    # 커밋 메시지만 변경할 수 있다.
    $ git commit --amend
    
    # 커밋을 완료했는데 파일 하나를 빠트린 경우
    $ git commit -m 'initial commit'
    $ git add forgotten_file
    $ git commit --amend

    commit 메시지는 유지되며(변경 가능) 빠트린 파일 하나가 추가된다.

     

    파일 상태를 unstage로 변경

    • 실수로 git add . 를 사용 → staged 된 파일을 다시 unstage상태로 만들고 싶다(add 취소)

    • 단순 git reset 워킹 디렉토리(트리)의 파일은 건드리지 않는다.

      (단, --hard 옵션을 사용할 경우 위험할 수 있다)

    git reset HEAD -- unstage_file

     

    Modified 파일 되돌리기 - 수정한 내용이 정말 잘못되었을 때 사용

    • 파일을 마지막 커밋한 내용으로 되돌리고 싶을 때

    • 파일을 처음 clone 햇을 때 처럼 워킹 디렉토리에 처음 checkout 한 내용으로 되돌리고 싶을 때

      • 커밋하지 않고 잃어버린것은 되돌릴 수 없음
    # 초기 상태
    $ git status
      On branch master
      Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)
    	renamed: README.md -> README 
    	modified: CONTRIBUTING.md
    
    # modified 해제 - CONTRIBUTING.md를 unmodified 상태로
    $ git checkout -- CONTRIBUTING.md $ git status
    On branch master
    Changes to be committed:
    	(use "git reset HEAD <file>..." to unstage) 
    		renamed: README.md -> README

     

     

    참고: https://git-scm.com/book/ko/v2

    'Git' 카테고리의 다른 글

    Git - Branch  (0) 2020.05.11
    Git - Remote  (0) 2020.05.11

    댓글

Designed by Tistory.