본문 바로가기
GIT.GITHUB

[GIT/GITHUB] 깃 '이해'하기 (repository, commit, checkout, reset 해보기)

by sjs_2215 2019. 8. 9.

출처:

[생활코딩 git 강의]: https://opentutorials.org/module/3733
[sourcetree, git 설치 가이드]: https://github.com/egoingsb/git-offline/wiki/Sourcetree
[git doc]: https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F
[버전 관리 도구란?]: https://opentutorials.org/course/2482/13915

 

GIT1

수업소개 이 수업은 버전관리 시스템 git을 소개하는 수업입니다.  수업대상 이 수업은 아래와 같은 상황에 있는 분들을 위한 수업입니다. 아래에서 문서란 일반적인 텍스트 문서에서부터 이미지, 소스코드를 망라한 모든 파일이라고 생각하시면 됩니다.  수 많은 문서를 관리해야 하는 분 이 문서들이 자주 변경되는 분 문서의 변경 이력을 체계적으로 관리해야 하는 분 문서의 조작을 막아야 하는 분 문서를 안전하게 백업해야 하는 분  문서를 다른 사람과 공유해서 공동

opentutorials.org

 

egoingsb/git-offline

Contribute to egoingsb/git-offline development by creating an account on GitHub.

github.com

 

Git - 버전 관리란?

1.1 시작하기 - 버전 관리란? 이 장에서 설명하는 것은 Git을 처음 접하는 사람에게 필요한 내용이다. 먼저 버전 관리 도구에 대한 이해와 Git을 설치하는 방법을 설명하고 마지막으로 Git 서버를 설정하고 사용하는 방법을 설명한다. 이 장을 다 읽고 나면 Git 탄생 배경, Git을 사용하는 이유, Git을 설정하고 사용하는 방법을 터득하게 될 것이다. 버전 관리란? “버전 관리” 는 무엇이고 우리는 왜 이것을 알아야 할까? 버전 관리 시스템은 파일

git-scm.com

 

버전관리 도구 - 프로그래밍 입문

버전 관리(version control, revision control)란 동일한 소스 코드에 대한 여러 버전을 관리하는 것을 말한다. 공학과 소프트웨어 개발에서 팀 단위로 개발 중인 소스 코드나, 설계도 등의 디지털 문서를 관리하는데 사용된다. 그러한 문서의 변경 사항들에 숫자나 문자로 이뤄진 "버전"을 부여해서 구분한다. 버전을 통해서 변경된 시간과 변경된 사항그리고 그 변경 사항을 작성한 작업자를 추적할 수 있다. 버전 관리 소프트웨어 도구들은 거의

opentutorials.org


"git은 information manager from hell"

1. git의 특징

  • git은 4세대 버전 관리 시스템
  • 깃은 안전하다
  • 절대 삭제 안하고-어떤 버전도 '지우지' 않는다. 안 보이게 만들어서 삭제 효과를 내는 것
  • 절대 수정하지 않는다 - 새로 만든다.

공부 방법과 순서

공부 순서: 버전 만들기->체크아웃(자주 하진 않지만, 나중 개념에 큰 의미가 있는 아이

공부 방법: 글을 읽기 힘들고 이해하기 힘들 땐 "실행"을 통해 본인이 이해하자

항상 헤드를 찾자. 아무리 복잡한 플젝이라도 간파 가능.

  • git을 여러 가지 툴(ex. sourcetree, totoisgit)을 통해 사용할 수 있다는 점을 알고 있기. 각각의 장단점이 있다.
  • gui 말고 cmd로 하는 법도 알아야 함
git init = 이 디렉토리를 초기화해줘.

ls -al = 현재 디렉토리 파일명들 보여줘 

2. repository 만들기

  • sourcetree에서 create 버튼 누르기

sourcetree의 create/add/clone = 최초로 저장소 만들기/이미 존재하는 저장소를 불러오는 것/ 이미 존재하는 저장소를 복제하는 것

  • 진행할 프로젝트 경로(바탕화면-egoing_git)를 지정

repository를 만든다 = 프로젝트 경로를 지정한다 = 내가 설정한 플젝 경로 여기를 너네가 추적해. 나 여기 버전 관리할 거니까


3. 버전 만들기

버전이란:

버전 관리(version control, revision control)란 동일한 소스 코드에 대한 여러 버전을 관리하는 것을 말한다. 공학소프트웨어 개발에서 팀 단위로 개발 중인 소스 코드나, 설계도 등의 디지털 문서를 관리하는 데 사용된다. 그러한 문서의 변경 사항들에 숫자나 문자로 이뤄진 "버전"을 부여해서 구분한다.

버전을 통해서 변경된 시간과 변경된 사항 그리고 그 변경 사항을 작성한 작업자를 추적할 수 있다.

 

버전 관리를 하는 이유:

작업 물들을 나눠서 commit 할 수 있음

파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있게 해 줌

버전 관리 시스템의 과정

사진 출처: https://git-scm.com/

사진 의문점: 체크아웃을 하면 working dir 아니라 staging area로 가는 것 아닌가?

해답: 추적을 하려면 stage에 올리는 건 맞음. 근데 staging area가 working directory안에 있는 거고, 이 둘이 같다고 보면 되므로 체크아웃하면 더 깊게 working dir로 간다고 이해하면 됨

ex) 예를 들어 설명

working dir에 c와 d 작업이 있다고 가정하자.

 

1.c를 수정하고 c를 staging area에 올림 (이미 a, b는 올라가 있다고 가정)

(c가 stage area에 올라갔다고 해서 working dir에 없는 것 아님- 왜냐 stage area는 working dir안에 있기 때문)

2.repository에 a, b, c를 같이 커밋함.

그럼 c3라는 커밋 아이디를 가지게 되고

이렇게 커밋을 c1, c2, c3 이렇게 만들어놓으면.

각각의 시점에 스냅숏을 만들어 놓은 거임. = 이게 버전 관리

변경사항들로 버전이 되는 것.

특징

  • 커밋=내가 왜 수정했는지 돌아볼 수 있는 잣대
  • __이전 커밋이 직후 커밋의 부모가 됨. __

'그 전 커밋이 부모다'라는 개념이 -> commit과의 commit 사이는 어떻게 연결되는가를 설명해줌

  • (제일 첫 번째 commit 한 건 parent가 없음)
  • 어디에서 commit 하냐에 따라서 parent 가 달라짐

    -> parent와 head의 상관관계를 알고 있어야 함

  • 어떤 파일을 버전으로 만들려면 = 스테이지 상태로 바꿔야 한다는 것!

 

(아래 사진 참고)

VCS 구조

구조 설명:

project dir 안에,

working dir, repository 저장소

working dir 안에 stage area

 

내 폴더로 구조 설명:

.git = 저장소

work.txt 파일들=저장소를 제외한 모든 것. working dir임


4. Checkout 해보기 (feat. 시간여행)

이제 버전 만드는 거 말고

버전을 되돌아가고 삭제해보자

체크아웃 = head를 옮기자

ex. c1으로 체크아웃한다고 해보자. 이는 아래 2개 점과 같은 말이다.

  • = c1의 내용을 내 working copy에 들이부어서 시간 여행 하자
  • = c1이 만들어진 시점으로 이동하자

"마스터는 마지막 커밋을 가리킨다."

"헤드는 나의 워킹 카피가 어떤 버전에서 유래했는가를 알려준다."

 

DETACHED 현상이란?

  • DETACHED 현상 -master로 체크아웃하지 않고 그대로 commit 하면 발생

-c3가 c4부모가 되는 건 맞는데, master가 c3를 가리키게 됨. master가 마지막 커밋을 가리키지 않음

-나중에 c4가 삭제가 아닌 내 눈에 안 보이는 상태가 될 수 있음

이유: 아무도 c4로 연결되어있지 않기 때문

 

  • detached 현상 방지:

-> master로 체크아웃하고 커밋해야 함 (head가 master를 가리키게)


5. reset으로 커밋 삭제도 하고 복원도 하기

5-1. 커밋 삭제(reset) = 'head가 가리키는 브랜치를 바꾸기'

= __reset(초기화) = 마지막 버전을 움직인다. __

-만약 head가 브랜치가 아닌 어떤 특정 버전을 가리킨다면 '헤드를 바꾸기'

진짜로 삭제되는 게 아니라, 눈에 안 보이고 아무도 연결하고 있지 않게 해서 삭제와 같은 효과를 냄

reset 할 때 hard로 하기

 

5-2. 커밋 복원(reset) ->커밋 아이디를 가지고 있을 때

how?

  1. 터미널로 해 보장

터미널 명령어 치면 됨.

git reset --hard 커밋아이디

이게 가능한 이유는 절대 지우지 않기 때문이다.

 

5.3 커밋 복원(reset) ->커밋 아이디를 모를 때

모든 히스토리를 가지고 있기에 git reflog를 통해 추리 가능

 

git reflog 보는 법:

결과(노란색) 행위/원인(오른쪽. 노란색 제외 다)

HEAD@{숫자} = 상대적인 커밋 아이디

노란색 = 절대적 커밋 아이디

사진 출처:https://suwoni-codelab.com/git/2018/04/07/Git-reflog/


Comments