안녕, 세상!

Git 시공간 제어 및 버젼 관리 본문

It공부/git

Git 시공간 제어 및 버젼 관리

dev_Lumin 2020. 12. 27. 19:59

(1) 시공간 제어

웹 사이트에 내 코드나 파일들을 올려서 공유하는 형식이 아닌 순수 git 자체를 이용해서 여러 시점을 저장하여 다양한 시도를 해볼 수 있으며 여러 시점을 만들면서 과거에 commit으로 저장한 캡슐(시점)을 불러오거나 현재 상태를 유지한 상태로 과거만 불러올 수 있는 이런 시공간 제어를 할 수 있습니다.

 

시공간 저장

git init

현재 디렉터리를 git 디렉터리로 설정 후 특정 파일들을 생성합니다.

생성 후 저장을 꼭 합니다.

git status
git add -A
git status
git commit -m 'first commit'

add와 commit 과정을 거친 후 특정 파일들을 수정, 삭제, 추가 과정을 거칩니다.

 

그 후 변경된 사항에 대해서 위의 add와 commit 과정을 마찬가지로 수행합니다.

 

git log

현재 위치한 branch 기준으로 여태껏 뭍은 타임캡슐(시점)들을 확인할 수 있습니다.

log에서 나온 리스트들은 Stack과 같은 형식으로 맨 위가 제일 최근에 저장한 캡슐(시점)입니다.

 

 

완전히 특정 과거로 돌아가기 (Reset)

돌아갈 과거 이후의 행적(캡슐, 시점)은(캡슐,시점) 완전히 지우고 과거로 돌아갈 수 있습니다.

(과감한(hard) 행동)

 

git reset d98809 --hard

 d98809는 돌아갈 과거 시점의 commit번호 중 앞 6자리를 입력하면 됩니다.

번호는 git log를 통해 확인할 수 있습니다.

위의 명령어를 치면 그 과거로 돌아왔다고 나오고 과거가 현재가 되며 돌아온 과거 이후의 행적은 모두 지워지므로 다시 미래 시점(과거로 돌아오기 전 현재)으로 갈 수 없습니다.

 

현 시공간 유지하고 바로 이전 과거로 돌아가기 (Revert)

현재부터 돌아갈 과거 이후의 행적을 모두 살린 상태에서 과거로 돌아가겠다는 것입니다.

git 자체의 리스트는 과거로 돌아간 행위가 과거로 돌아가기 전 현재의 미래가 되었다고 간주해서 현재 log 위에 revert된 commitlog로 쌓여서 저장된다고 생각하면 됩니다.

 

여기서 주의해야 할 점은 Revert 명령어는 해당 시점의 동작을 취소하겠다는 명령어입니다.

그러므로 현 시공간을 유지하고 과거로 돌아가려면 현시점을 취소시키면 되므로 현 시점을 revert 해야 합니다.

그래서 revert 명령어 작업 한 번이 바로 직전 과거로만 돌아갈 수 있는 한계가 있습니다.

더 이전 과거로 돌아가려면 반복해서 revert를 해주면 됩니다.

 

git revert 123456

(123456은 돌아갈 과거의 commit 번호 예시)

 

 

 

 

(2) 버전(평행우주) 관리

평행우주(버전)는 branch들을 생성함으로써 만들 수 있습니다.

git의 태초의 우주는 main(master)우주이며 main기준으로 추가로 가지치기를 하여 branch라는 평행우주들을 만들 수 있습니다.

 

평행우주(Branch) 생성

branch 생성은 다음 명령어로 생성할 수 있습니다.

git branch 생성할branch명

이렇게 새로 branch를 생성하게 되면 현재 branch의 형상(내용들)이 새로 생성한 branch에 그대로 복사되어 넘어가게 됩니다.

(그래서 평행우주라고 표현함)

그러므로 branch를 현재 어느 branch위치에서 새로운 branch를 생성하느냐도 굉장히 중요합니다.

 

git branch

현재 branch 목록 출력

 

git checkout 브랜치명

해당 브랜치로 이동

 

 

새로운 평행우주(branch)에서 코드를 수정, 추가, 삭제,추가, 작업 후 꼭 저장을 하고 add,commit 과정을 해주어야 내역들이. git에.git 저장되므로 반드시 잊지 말고 해줘야 합니다.

 

 

브랜치 생성과 checkout을 동시에 해주는 명령어는 다음과 같습니다.

git branch -b 생성할브랜치명

 

 

평행우주(Branch) 병합

평행우주를 병합하는 것은 merge 라는 명령어를 통해 병합할 수 있습니다.

평행우주를 병합을 통해 실험적으로 해보았던 것을 기존 우주와 합쳐서 수정을 할 수 있습니다.

 

git branch

꼭 현재의 branch를 확인해 줘야 합니다.

 

git merge 병합할branch명

병합을 할 branch는 현재 branch안의 특정 시공간의 캡슐(시점)로부터 파생되어 연결되어 있는 branch이어야 합니다.

그리고 병합을 하게 된다면 파생된 근본 캡슐(시점) 기준으로 수정, 추가, 삭제된 내역들 중 변경된 사항들만이 현재 branch에 변경되어 병합이 됩니다.

 

만약 근본 캡슐 기준으로 현재 branch와 병합할 branch가 같은 파일의 같은 부분을 수정했다면 conflict가 발생하게 됩니다.

, 같은 부분을 수정했으니 둘 중 어떠한 수정사항을 병합할지 선택해야 합니다.

 

이러한 conflict 해결 방법은 한쪽의 수정사항을 코드에서 직접 지워주고 저장한 다음

git add -A

git commit 만 한 후

:wq 하면 자동으로 병합이 완료됩니다.

 

 

 Branch 삭제

다 사용한 branch 삭제 명령어는 다음과 같습니다.

git branch -D 브랜치명

 

(3) branch에 따른 git log --graph

git log에 --graph 옵션을 붙여주면 나름 시각적으로 branch 간의 연결을 확인할 수 있습니다.

git log --graph

알아두어야 할 점은 git log 명령어는 현재 branch 정보만 가져온다는 것을 알아두어야 합니다.

 

만약 모든 branch의 관계를 보고 싶으면 --all 옵션을 추가하면 됩니다.

git log --graph --all

 

브랜치들을 관리하면서 병합(merge) 과정에서 merge를 했음에도 불구하고 시각적으로 보았을 때 옆으로 나온 가지가 안 보이는 경우가 있습니다.

그 이유는 해당 병합을 굳이 옆으로 가지 쳐서 표현할 필요가 없기 때문입니다.

 

예시로 설명하겠습니다.

다음과 같이 main에 a파일을 생성한 후 main브랜치에서 branch1을 생성합니다.

그러므로 branch1에는 main에 있던 a파일이 그대로 존재할 것입니다.

이후 git checkout branch1로 이동한 후 branch1에서 b파일을 생성합니다.

(생성하고 저장한 후 add와 commit과정은 필수!)

b파일을 생성하고 다시 git checkout main을 이용하여 main으로 돌아오게 되면 b파일은 보이지 않고 a파일만 보일 것입니다.

(그 이유는 branch가 다르고 branch1에서 b를 저장했기 때문)

현재 branch가 main인 상태에서 git merge branch1을 하면 conflict 될 요소가 없으니 말끔하게 서로 병합이 됩니다.

이러한 과정을 log로 출력하면 다음과 같습니다.

위에서 말했듯이 그냥 일자로만 표현됩니다.

그 이유는 branch1에서 b라는 파일이 생성됨으로써 branch1에서 수정사항이 발생하는 동안 main에서는 아무런 변화(수정)가 없었으므로 어차피 병합될 마당에 굳이 가지를 쳐서 표현할 필요가 없기 때문입니다.

그러므로 시점이 두 개 밖에 보이지 않는 것입니다. 

하지만 위와 같이 (master, branch1) 이런 식으로 둘이 병합이 되었다는 기록은 남습니다.

 

옆으로 가지치기가 되려면 branch1에서 무언가가 수정되는 동안 main에서도 수정이 이뤄지고 그 후에 병합이 되어야 옆으로 가지치기가 된 그래프를 확인할 수 있습니다.

 

다음과 같은 경우입니다.

 

이전의 예시와 과정은 같고 차이점은 main에서 중간에 c파일을 생성함으로써 시점에 변화를 준 것입니다.

이 과정을 log로 보면 다음과 같습니다.

다음과 같이 옆으로 가지가 쳐서 그래프가 잘 나오는 것을 확인할 수 있습니다.

 

 

 

Comments