-
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 개념
- 세 가지 상태
- Committed: 데이터가 로컬 데이터베이스에 저장된 상태
- Staged: 수정된 파일을 곧 커밋할 것이라고 표시한 상태(add)
- Modified: 수정된 파일을 아직 커밋하지 않은 상태(not add)
- 세 가지 단계
- Working tree: 특정 버전에 checkout된 상태(진행 작업이 해당 스냅샷에 위치 - .git에 있는 압축된 데이터베이스를 이용해 작업 트리를 생성)
- Staging area(.git): 커밋할 정보를 갖고 있는 파일
- 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 되지 않음)
- Tracked는 스냅샷에 올라와있는 상태를 의미(git clone 시 가져온 모든 데이터는 Tracked 상태)
- 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
파일 상태를 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
'Git' 카테고리의 다른 글
Git - Branch (0) 2020.05.11 Git - Remote (0) 2020.05.11