Git
- 아래 내용은 생활코딩의 이고잉님의 강의를 정리 한 내용입니다.
- 자세한 내용은 https://opentutorials.org/course/2708 에서 확인 하시기 바랍니다.
Git 이란?
- 파일의 이력관리를 쉽게하여 새로운 내용을 수정 후 복원하거나 사람들과의 협업한 내용을 쉽게 관리하기 위한 형상관리 도구의 일종입니다.
- 더 자세한 사항은 위키피디아를 참고하시면 자세하게 설명되어 있습니다.
- Git WikiPedia
Git 설치
Download : Git 에서 본인의 OS에 맞는 Git을 설치 하면 됩니다.
Git 초기설정
- 현재 Git을 사용하는 사용자가 누구인지
> git config --global user.name 네임
> git config --global user.email 유저 Email
Git 초기화
버전관리를 하기 위한 폴더를 생성하거나 해당 폴더로 이동
2가지 방법
github.com 또는 Remote Repository 같은 현재 작업 Machine 이외의 위치에 저장소가 존재하는 경우
> git clone 해당 URL(URL/Repository명.git)
현재 작업 폴더를 저장소로 처음 시작하는 경우
> git init MCR007@MCR007 MINGW64 /d/gittest $ git init Initialized empty Git repository in D:/gittest/.git/
Git 시작하기
- Notepad 또는 문서 편집기 등을 이용하여 f1.txt 파일을 해당 폴더에 생성 후 내용물 작성.
- f1.txt 생성 후 아래와 같이 수행. ( 상태 확인 )
MCR007@MCR007 MINGW64 /d/gittest (master)
$ vim f1.txt
MCR007@MCR007 MINGW64 /d/gittest (master)
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
f1.txt
nothing added to commit but untracked files present (use "git add" to track)
- Untracked files라는 목록에 f1.txt가 표시됩니다. 이말은 현재 f1.txt파일은 폴더 내에는 존재하지만 형상관리 대상이 아니라는 뜻입니다.
Git 관리 대상에 포함시키기
- 포함 시키기는 명령어 : git add 해당 파일명
- git add를 수행하였다고 하더라도 해당 내용이 완전히 형상관리를 적용했다고는 할 수 없습니다. git에는 3가지 상태가 존재하는데 추후에 설명하겠습니다. (대략 임시저장 느낌이라고 생각하시면 됩니다.)
MCR007@MCR007 MINGW64 /d/gittest (master)
$ git add f1.txt
MCR007@MCR007 MINGW64 /d/gittest (master)
$ git status
On branch master
No commits yet
Changes to be committed: // commit 해야 될 대상으로 포함 되었다는 뜻.
(use "git rm --cached <file>..." to unstage)
new file: f1.txt
Git Commit
- git 내 Version을 생성하기 위해서는 Commit의 과정을 거쳐야 완성이 될 수 있습니다.
- git commit 을 수행하게 되면 add를 수행했던 내용들을 한번에 Commit을 하게 됩니다.
MCR007@MCR007 MINGW64 /d/gittest (master)
$ git commit -m "1"
[master (root-commit) 14a0861] 1
1 file changed, 1 insertion(+)
create mode 100644 f1.txt
- git commit을 수행하게 되면 Commit Description을 작성하는 Editing창이 열리게되는데 i를 통해 입력모드로 접근하여 작성하여도 되고 git commit -m "메세지"** 와 같이 작성하게 되면 쉽게 작성을 할 수 있습니다.
- git log 를 통해 버전 관리 리스트, Commit 이력을 확인 할 수 있습니다.
$ git log
commit 14a086115e15df273ba68ea2a214048bc12fdd5a (HEAD -> master)
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:44:45 2018 +0900
1
- 다시 한번 f1.txt파일 내용을 2로 수정 후 git status로 확인
$ git status
On branch master
Changes not staged for commit: // Commit 대기 파일 목록.
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: f1.txt // 파일이 수정되었다는 의미.
no changes added to commit (use "git add" and/or "git commit -a")
Git에서는 파일을 Commit을 바로 하지 않고 Add라는 과정을 거치게 되는 것일까?
해당 파일을 바로 Commit을 하지 않고 Add를 수행 후 Commit을 해야하는데 이유는 아래와 같습니다.
- 프로젝트를 하다보면 여러 소스 코드를 수정하거나 문서를 작성하더라도 여러 파일을 작성하게 됩니다. 이때 Commit하는 시기를 놓칠 수 가 있습니다.
- Commit 하나에는 하나의 작업을 담아 복구를 하거나 내용을 확인하기에 좋습니다. 여기서 Add라는 작업을 통해 원하는 파일만 Commit이 가능합니다.
- f2.txt라는 파일을 생성 후 add -> Commit을 수행
- f1.txt를 수정 후 Add, f2.txt를 수정 후 그대로 둡니다. 그 이후 git status 수행하게 되면 아래와 같이 대상파일과 아닌 파일이 구분됩니다.
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: f1.txt Untracked files: (use "git add <file>..." to include in what will be committed) f2.txt
- git commit 이후 git status를 하게 되면 f2.txt는 그대로 있지만 f1.txt는 commit이 수행되어 사라지게 됩니다.
$ git commit -m 2 [master ea60da0] 2 1 file changed, 1 insertion(+) $ git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) f2.txt nothing added to commit but untracked files present (use "git add" to track)
Git Space
git에서는 파일의 Work Flow를 3군데로 정의 할 수 있습니다.
- working directory : 아무런 수행을 하지 않은 파일 공간
- Staging Area, Index, Cache : Commit을 위한 대기공간, 즉 Add 한 파일들이 존재하는 공간 )
- Repository ( Commit된 파일들이 있는 공간 )
Commit 간의 차이점
- git log : 지금까지의 Commit 역사
- git log -p : Commit 과 Commit 사이의 소스상 차이점을 알 수 있습니다.
$ git log -p
commit ea60da0dfa373320114440fa11391e4f3baef91e (HEAD -> master)
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:47:49 2018 +0900
2
diff --git a/f1.txt b/f1.txt
index d00491f..1191247 100644
--- a/f1.txt (commit 1)
+++ b/f1.txt (commit 2)
@@ -1 +1,2 @@
1
+2 ( commit 2에서 2라는 내용이 추가 되었다라고 알 수 있습니다.)
commit 14a086115e15df273ba68ea2a214048bc12fdd5a
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:44:45 2018 +0900
1
diff --git a/f1.txt b/f1.txt
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/f1.txt // 신규로 f1.txt파일이 추가 되었음을 알 수 있습니다.
@@ -0,0 +1 @@
+1 // 내용은 1
- git diff CommitID1 CommitID2 : Commit ID1과 Commit ID2 두 커밋의 차이점을 보여준다.
Commit 을 되돌리는 방법
- 사용자가 Commit을 잘못하거나 과거로 돌아가고 싶을때(Commit을 취소), 해당 부분은 어렵고 또한 복잡하여 사용을 잘 하여야 합니다.
- 몇번의 Commit을 추가를 더하여 현재 상태를 만듬
$ git log
commit df139fa9645c6e76b67a09363ab6e680e39870d7 (HEAD -> master)
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:57:31 2018 +0900
5
commit f6484bb042201704f0c7f08cb4eb95c4234d7fbb
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:57:14 2018 +0900
4
commit b5da5754488f1348962e202ecef543cadc02a716
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:56:57 2018 +0900
3
commit ea60da0dfa373320114440fa11391e4f3baef91e
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:47:49 2018 +0900
2
commit 14a086115e15df273ba68ea2a214048bc12fdd5a
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:44:45 2018 +0900
1
현재 Commit 내용이 5인 상태인데, 이것을 Commit 내용이 3인 상태로 변경 하고자 할때
2가지 방법이 존재
- revert : 4, 5 Commit을 차례로 git revert 해야 합니다. 아래는 Commit 3을 Revert한 예
$git revert b5da5754488f1348962e202ecef543cadc02a716 // Commit 3의 Commit ID $git log -p commit e31fb4139774dfe5d5a3ec7158efec68bdbb0495 (HEAD -> master) Author: blee <blee@hist.co.kr> Date: Fri Sep 7 14:00:06 2018 +0900 Revert "3" This reverts commit b5da5754488f1348962e202ecef543cadc02a716. diff --git a/f1.txt b/f1.txt index b944734..1191247 100644 --- a/f1.txt +++ b/f1.txt @@ -1,2 +1,2 @@ -3 -4 +1 +2 commit df139fa9645c6e76b67a09363ab6e680e39870d7 Author: blee <blee@hist.co.kr> Date: Fri Sep 7 13:57:31 2018 +0900 5 diff --git a/f3.txt b/f3.txt new file mode 100644 index 0000000..55bd0ac --- /dev/null +++ b/f3.txt @@ -0,0 +1 @@ +333 commit f6484bb042201704f0c7f08cb4eb95c4234d7fbb Author: blee <blee@hist.co.kr> Date: Fri Sep 7 13:57:14 2018 +0900 4 diff --git a/f2.txt b/f2.txt new file mode 100644 index 0000000..da7f847 --- /dev/null +++ b/f2.txt @@ -0,0 +1,2 @@ +2 +4 commit b5da5754488f1348962e202ecef543cadc02a716 Author: blee <blee@hist.co.kr> Date: Fri Sep 7 13:56:57 2018 +0900 3 diff --git a/f1.txt b/f1.txt index 1191247..b944734 100644 --- a/f1.txt +++ b/f1.txt @@ -1,2 +1,2 @@ -1 -2 +3 +4 commit ea60da0dfa373320114440fa11391e4f3baef91e Author: blee <blee@hist.co.kr> Date: Fri Sep 7 13:47:49 2018 +0900 2 diff --git a/f1.txt b/f1.txt index d00491f..1191247 100644 --- a/f1.txt +++ b/f1.txt @@ -1 +1,2 @@ 1 +2 commit 14a086115e15df273ba68ea2a214048bc12fdd5a Author: blee <blee@hist.co.kr> Date: Fri Sep 7 13:44:45 2018 +0900 1 diff --git a/f1.txt b/f1.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/f1.txt @@ -0,0 +1 @@ +1 $ ls -al total 23 drwxr-xr-x 1 MCR007 197121 0 9월 7 14:00 ./ drwxr-xr-x 1 MCR007 197121 0 9월 7 13:37 ../ drwxr-xr-x 1 MCR007 197121 0 9월 7 14:03 .git/ -rw-r--r-- 1 MCR007 197121 6 9월 7 14:00 f1.txt -rw-r--r-- 1 MCR007 197121 4 9월 7 13:57 f2.txt -rw-r--r-- 1 MCR007 197121 4 9월 7 13:57 f3.txt // Commit4가 했던 내용은 그대로 존재 $ cat f1.txt // Commit 3에서 1 2 를 3,4 로 변경하였으나 해당 내용이 초기화 되었습니다. 1 2
- reset : 5와 4를 삭제하고 3으로 돌아가고싶을 때 사용. ( 최신상태로 하고 싶다.)
$ git log -p commit b5da5754488f1348962e202ecef543cadc02a716 (HEAD -> master) // Commit 3만 존재. Author: blee <blee@hist.co.kr> Date: Fri Sep 7 13:56:57 2018 +0900 3 diff --git a/f1.txt b/f1.txt index 1191247..b944734 100644 --- a/f1.txt +++ b/f1.txt @@ -1,2 +1,2 @@ -1 -2 +3 +4 commit ea60da0dfa373320114440fa11391e4f3baef91e Author: blee <blee@hist.co.kr> Date: Fri Sep 7 13:47:49 2018 +0900 2 diff --git a/f1.txt b/f1.txt index d00491f..1191247 100644 --- a/f1.txt +++ b/f1.txt @@ -1 +1,2 @@ 1 +2 commit 14a086115e15df273ba68ea2a214048bc12fdd5a Author: blee <blee@hist.co.kr> Date: Fri Sep 7 13:44:45 2018 +0900 1 diff --git a/f1.txt b/f1.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/f1.txt @@ -0,0 +1 @@ +1
$ git status On branch master 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: f1.txt Untracked files: // 기존에 적용했던 f2.txt와 f3.txt가 Untracted로 된 상태. (use "git add <file>..." to include in what will be committed) f2.txt f3.txt no changes added to commit (use "git add" and/or "git commit -a")
Git Reset의 옵션
soft, mixed, hard가 존재합니다.
기본적인 옵션은 mixed => working direct 내용은 그대로 두고 index 상태인 것까지 전체 초기화
soft : Repository에 Commit을 한 내용만 초기화, Add를 통해 index에 넣어 놓은 내용은 그대로 둔다.
Git 의 원리
분석도구 : gistory
python이 설치 되어있는 환경
- pip install gistory or sudo pip install gistory(MAC)
간단히 요약
git은 파일의 이름이 다르더라도 내용이 같다면 같은 object를 가지게 됩니다.
같은 내용을 가지고 있다면 파일이 100개라도 하나만 저장하면 되어 저장공간에 제약이 적습니다.
objects가 생성되는 파일명은 hash 알고리즘을 통해 만들어지는데 앞의 2글자가 폴더명이 되고 나머지는 object명이 된다.
Commit을 하게 되면 object 형태로 저장되며 Tree(데이터 관련 object를 타나내며, 현재 데이터) 와 Parent(현 Commit 이전의 Commit object 주소를 나타내는 부분) 을 가지게 됩니다.
status 원리
- 최신 커밋의 트리와 index 내용이 다르면 Commit 할 내용이 있다는것으로 판단.
- 내용이 달라져 수정할 내용이 있다는 것은 index값과 현재 파일의 내용 해쉬값이 다르다면 수정한 내용이 있다는 것을 할 수 있습니다.
'STUDY > Git' 카테고리의 다른 글
Git_협업 (0) | 2018.09.12 |
---|---|
Git_Remote (0) | 2018.09.11 |
Git_Stash (0) | 2018.08.23 |
Git Branch (0) | 2018.08.22 |