AI TECH

이고잉 git 특강: 버전 관리

prefer_all 2022. 10. 18. 15:44
<기본 실습>
-  프로젝트 폴더를 만든다
-  저장소를 만든다: gin init
-  파일을 만들고 두 개의 커밋을 만든다
    work1.txt => work1, work2.txt => work2, work3.txt=> work2로 commit
   git status, gitit add FILE_NAME, git commit -m "COMMIT MESSAGE"

- 시간 여행

  git log --oneline --graph 
  git chekout COMMIT_ID
  git checkout master하면 시간 여행 끝남

- 명령어로 exp branch 만들고 작업할 수 있도록 checkout한다
  git branch exp (현재 HEAD가 가리키는 걸 새로운 branch로) => HEAD가 master을 가리킴. master에서 진행됨
  git checkout exp  (HEAD가 exp를 가리킴)
-  서로 다른 branch에서 작업한다
   exp branch에서 exp.txt 만들고, master branch에서 master.txt 만들고
   각각 exp1, master1로 commit

- 병합한다
  git merge exp    (vi 편집기처럼 esc키 + :wq)

 

상태 확인하기

 

git status : commit 이전 상태 확인

git log / git log --oneline : commit 상태 확인

git reflog 

reflog란?
reflog는 git에서 가리키는 referenced commit이 변경된 내역이다.
reflog를 기록하는 것은 대표적으로 HEAD와 branch 두 가지이다.

Source control 사용하기

source control: M 누르면 변경 사항 확인 가능             (커밋 안 한 상태에서) git diff


Untracked / Tracked

- git add를 한번이라도 한 파일은 tracked 상태

- git commit -a 옵션은 tracked 상태의 파일만 커밋에 포함시킨다.

- untracked 는 명시적으로 git add 해줘야 한다. 반대로 git add를 한 번이라도 했다면 git이 추적기능을 붙여 auto adding이 가능해진다.

- .gitignore

- git add . 절대로 해서는 안됨

 

add의 3대 상태
1. 커밋 대기상태
2. Untracked를 tracked로 만든다.
3. 충돌 해결을 깃에게 알려준다.

 

git commit -am 


Checkout을 통해 특정 커밋시점으로 돌아가기

HEAD를 a9fbe30 시점으로 옮기고자 한다면

$ git checkout a9fbe30

 

$ git log --oneline --all

master는 마지막 작업을 가르키고 HEAD는 현재 작업을 가르킨다.

 

+ attached / detached

HEAD -> 브랜치(ex.MASTER) -> 특정 커밋 순서로 commit을 가리키는 상태 : ‘attached HEAD’ 상태(state)라고 한다.

Detached HEAD란 HEAD가 브랜치를 통해 간접적으로 commit을 가리키지 않고, 직접 커밋을 가리키는 것을 말한다.

 

→ HEAD가 다시 main을 가르키도록 만들려면

main 브랜치로 checkout하면 된다.

 

Detached HEAD란?

- HEAD가 특정 branch가 아닌 특정 commit을 직접 참조하고 있는 상태를 말한다. 
- Detached HEAD 상태에서 새롭게 생성된 commit은 참조하는 branch가 없기 때문에
   다른 branch로 checkout 하게 되면 해당 commit은 가비지 콜렉터에 의해 삭제됩니다.
   => 실험할 때 사용

1. 실험이 성공하고 끝이 나면 master가 exp를 병합한다
- 'merge' into current branch 새로운 version의 부모는 master, exp이며  master는 새로 만들어진 version을 가리킨다.
- 병합을 취소하려면 'reset' current branch

2. exp가 master를 병합한다. exp가 master에 있는 작업물을 중간 중간 없데이트한다.
- 즉, 수시로 master에 있는 수정사항을 exp로 자주 가져와라
- exp가 새로만든 내용을 따라감

exp는 삭제할 때까지 사라지지 않음

Checkout(시간 여행) VS Reset(복원)

- git checkout BRANCH_NAME, git checkout master 로 시간 여행

- HEAD가 master을 가리킴 (HEAD => Master => 다른 상태들)

- checkout은 HEAD를 옮기고 reset은 HEAD가 가르키는 BRANCH를 옮긴다

- reset은 우리가 마지막으로 작업한 브랜치를 복원하거나 삭제한다. master은 reset을 통해 어디로든 갈 수 있다.

- HEAD=> branch 상태에서 git reset --hard로 이전 commit으로 돌릴 수 있다.

# master가 commitId에 해당하는 버전을 가리킴
git reset --hard (commitId)
# head가 원하는 commitId에 해당하는 버전을 가리킴
git checkout (commitId)

 

git reset --hard COMMIT_ID # Branch(ex.master)를 해당 commit_id로 이동
if(attached){
	HEAD의 Branch가 움직임
} else {
	== checkout # Head를 Branch로 이동
}

 

 

 

reset로 main(master) 이동시키기

$ git reset --hard 3f729

 

다시 되돌리고 싶을 때는 git reflog로 이전 커밋ID를 확인한 후 다시 reset 하면 된다.

$ git reflog

$ git reset --hard f536088

.gitignore 파일

 

commit하고 싶지 않은 파일명을 .gitignore 파일에 작성한다.


Git Graph 사용

Create Branch 후 check out 옵션 선택       git checkout -b exp

- 파란색 Branch 더블 클릭하면 checkout된다

 

예제) exp라는 branch를 만들고 exp.txt 만드는 작업 후 commit => master branch로 돌아와서 master.txt 만드는 작업 후 commit

터미널에서는   git log --oneline --all --graph

 

 

Merge

 

git checkout master하고 gie merge exp하면 아래와 같음


단축키 만들기

git config --global alias. [원하는 단축키]  "[바꾸려는 내용]"

단축키 수정하려면  vim ~/.gitconfig


Merge와 Conflict 뽀개기

각 브랜치에서 파일 수정하고 commit한 후 

git checkout master

git merge exp 하면 아래와 같음

- 안 넣어주면 m2, e3에서도 충돌남

 

conflict 수정한 다음에 git add common.txt / git commit -m "COMMIT MESSAGE"


Remote

git push --set-upstream origin master    한 번은 인증해야함