Git Version Control Command
Computer Science/OpenSource+Git

Git Version Control Command

# Git Repository 생성 & Git 초기화 명령어

#new Directory 생성
mkdir hello-git
cd hello-git
ls -al #세부정보와 hidden file 확인 가능

#새로운 git repository 생성
git init
ls -al #.git파일이 생성된 것을 확인할 수 있다.

: Git은 VCS이므로, file name을 보존하면서 변경 내용을 저장한다. 따라서 매 버전의 내용을 확인하고, 이전 버전으로 되돌리는 기능도 존재한다.

 

#Version Control - Stage & Commit

# Working Tree, Stage, Repository

- Working Tree : 실제로 파일이 저장되는 디렉토리이다. Working directory라고 함

- Stage : version화 될 파일들이 queue로 대기하는 장소이다

- Repository : Stage에서 대기하고 있는 파일들의 버전을 만들어 저장하는 장소이다.

 

#Git Version Control Process

 

1) Creating a new version of the files using commit

 

1) working tree에서 cal.py를 수정하여 저장한다

2) modified cal.py 파일을 version으로 만들고 싶으면 stage로 올린다.

3) commit command를 사용하여 stage에 있던 파일을 commit하여 파일의 새로운 version을 생성한다.

 

-> 아래 process를 코드로 확인해보자~

#Checking Git Status
git status

#create python file
vim cal.py
ls -al

#git status check 
git status #untracked file에 cal.py가 보인다.

#working tree의 변경 내용을 stage에 추가한다
git add cal.py

#git status check
git status #cal.py가 Untracked files: 에서 changes to be committed로 변경됨.

#git commit 
git commit -m "create cal.py" #cal.py파일이 repository로 추가된다.

#git status check
git status #존재하는 모든 파일이 커밋되었으므로 working tree clean 확인 가능.

stage에 cal.py가 new file로 올라와있는 걸 확인할 수 있다.
git log를 통해 cal.py가 생성되어있음을 확인할 수 있다.

 

2) Handling Staging and Commit at the Same time

#Modify cal.py
vim cal.py

#Stage & Commit at the Same time
git commit -am "add sub method"

#Checking the version in the repository
git log  #commit 기록이 잘 되었음을 확인할 수 있다.

 

# Commit Log의 구성

-  Commit Hash

-  Head->master ( Indicates the most recent version)

-  Authors

-  Date

-  Commit Message

 

3) Checking the Changes

#Changing cal.py
vim cal.py #함수의 이름을 고친다

#Checking git status
git status #changes not staged for commit -> modified:cal.py

#Checking how the modified file differs from the latest version of the file in repo.
git diff #새로운 내용을 사용할거면 그대로 commit

 

4) Tracked file과 Untracked file의 차이점

-> 한번 stage/commit된 파일은 tracked file로, 수정이 되었는지 등이 다 track된다. 

-> 그러나 파일을 수정하면 tracked file 역시 working tree에 존재하는 상태이다. (애초에 다른 version이 됨)

+) 모든 file은 working tree에 항상 존재한다. (stage.commit된 상태인지만 다름)

#cal.py내의 클래스에 함수를 추가해서 modify함
vim cal.py

#Create cal2.py
vim cal2.py

#Check git status
git status #cal.py->tracked file/cal2.py untracked file

 

#Add a change in the working tree to the stage
git add cal.py
git add cal2.py

#check git status
git status #modified:cal.py new file:cal2.py로 둘다 stage된 상태이다.

#create new version of file using commit command
git commit -m "add mul method and cal2.py"
git log #커밋된 내용을 확인할 수 있다.

add를 통해 stage된 이후의 상태

 

commit된 이후의 상태를 확인할 수 있다.
git log --stat 옵션을 통해 더 자세한 modify과정을 확인할 수 있다.

 

5) Unmodified/Modified/Staged status 사이의 차이

#directory file list 확인
ls -la #cal.py cal2.py파일 확인 가능

#git status check - commit할게 없어 clean할 상태이다
git status

#change cal2.py
vim cal2.py

#check git status
git status #change not staged for commit: 이는 file이 modify되었음을 의미한다.

tracked file이지만, 수정되어 stage되기 전 상태임을 확인할 수 있다.

#add change in the working tree to the stage
git add cal2.py
git status #changed to be committed: cal2.py가 staged되었음을 의미한다.

#create new version of files using commit command
git commit -m "change pow method"
git status #이제 cal2.py는 unmodified 상태이다 (최신 version file과 차이가 없음)

### working tree/stage상태에서의 파일이 repository 내의 최신 version의 file내용과 다르면 modified된 것이다.

-> 즉, modified된 파일이 commit되면 unmodified 상태로 돌아가는 것이다. (Tracked / Unmodified file)

 

 

6) Reset & Revert

 - Working tree의 modified file을 restore하는 과정 : 'git checkout -- (file)'

: stage되기 이전에 checkout 을 통해서 working tree내의 이전 file 상태로 되돌린다.

#changing cal.py
vim cal.py

#checking git status
git status #modified: cal.py 확인 가능

#discarding changes in working directory
git checkout -- cal.py #(= git restore -- cal.py)
cat cal.py #cal.py를 modify하기 전으로 돌아간 것을 확인할 수 있다.

 

- Unstaging a file

: stage에 올라간 파일을 unstaged 상태로 내린다. : 'git reset HEAD (file)'

#modify cal2.py
vim cal2.py

#adding a change in the working tree to the stage
git add cal2.py

#git status
git status #changes to be commited : stage된 상태인걸 확인할 수 있음

#Unstaging a file
git reset HEAD cal2.py #(= git restore --staged cal2.py)
git status #changes not staged for commit 목록에 cal2.py가 존재함을 확인 가능하다

 

-Reseting to the latest commit : 'git reset HEAD^'

: 마지막 commit된 상태를 삭제하고 이전 상태로 되돌린다. 

#changing cal2.py
vim cal2.py #add method in class

#stage & commit simultaneously
git commit -am "add div method"

#checking the version in the repository
git log #add div method commit까지 저장되어있는 걸 확인할 수 있다.

#Resetting the latest commit
git rested HEAD^

stage&commit을 전부 취소하고 되돌린다.
commit된 내용이 취소되고 다시 unstaged 상태로 돌아간 것을 확인할 수 있다.

 

 - Resetting to the specific commit : git reset --hard <Commit hash>

: 특정한 커밋 시점으로 되돌리고 싶을 때 사용한다 (이후의 커밋은 다 삭제됨)

#rev.py를 생성하고, stage&commit한다.
vim rev.py
git add rev.py
git commit -m "print 1"

#rev.py를 modify하여 stage&commit한다
vim rev.py
git commit -am "print 2"

#rev.py를 세번 더 바꾼다. (위 과정을 print 3,print 4, print 5까지 반복)

#git log check한다
git log #이때 돌아가고 싶은 version의 commit hash number를 복사한다

 

version 2로 돌아가고 싶으면 print2 커밋의&nbsp; hash를 복사한다.

#Use Git reset command with the --hard option
git reset --hard <specific commit hash>
git log

#"HEAD is now at print2"라는 메세지가 뜨면, 이는 print2 시점으로 commit이 리셋되었음을 의미한다.

commit이 다 사라지고 print2 시점으로 돌아간 것을 확인할 수 있다.

 

 

- Reverting without deleting a commit : git revert <hashnum>

: 특정 커밋을 삭제하진 않고, 보류하는 식으로 확인할 수 있다.

-> repository의 파일을 확인해보면 commit "print 5"이전의 상태로 돌아간 것을 알 수 있다.

git log #print 1, print 2, print 5 commit 이 존재한다

#copy commit hash of "print 5" commit

#Using git rever command with the copied hash
git revert <copied commit hash>

 

# Git Reset & Revert 총정리

 1) Working Tree에 있는 파일을 수정하고 원본으로 돌리고 싶을때 : git checkout -- <Filename>

 2) Staged 상태인 파일을 Unstage하고 싶을 때 : git reset HEAD <Filename>

 3) Git의 가장 최신 commit을 취소하고 reset하고 싶을때: git reset HEAD^

 4) Git의 특정 커밋 시점 이전으로 돌리고 싶을 때: git reset --hard <commit hash>

 5) Git의 특정 커밋을 삭제하진 않고, 보류하고 싶을 때: git revert <commit hash>

'Computer Science > OpenSource+Git' 카테고리의 다른 글

Shell Environment  (0) 2021.12.11
Git Branch Command  (0) 2021.10.24
Git Overview/ Linux Basic Command  (0) 2021.10.24
OSS Tools  (0) 2021.10.24
OSS Licenses  (0) 2021.10.23