[KT] AIVLE SCHOOL 1일차
'생활코딩'의 이고잉 강사님의 Git 강의
[KT] AIVLE SCHOOL 첫 날의 강의로는 '생활코딩'의 이고잉 강사님의 Git 강의였다.
Git 강의는 VSCode를 활용하여 Git을 학습하기 쉽도록 GUI를 이용한 강의를 진행해주셨다.
버전 관리의 이유 : 디버깅
- working directory 내용을 과거로 갈 수 있다. 이를 통해 디버깅이 가능
vscode로 Git 활용하기 (로컬 저장소)
- 먼저 바탕화면에 'Git1' 이라는 폴더를 생성한다. (폴더 이름은 자유)
- vscode에서 생성한 폴더 'Git1'를 연다.
- 'Source Control(소스 제어)' 항목에서 'Initialize Repository(저장소 초기화)' 를 누른다.
- 'Initialize Repository'를 누르면 해당 폴더에 .git 이라는 파일이 생성된다.
- 해당 폴더가 git으로 관리한다는 뜻
- 모든 버전은 .git 안에 저장한다.
- 폴더의 .git 폴더는 숨김처리되어 안보일 수도 있다.
- .git 디렉토리는 버전이 보관되는 장
- 'Git1' 폴더 안에 'work1.txt' 파일을 생성한다. (예시로 숫자 1 입력 후 저장)
- 이때 'Message(메시지)' 란에 메시지 작성 후 'Commit(커밋)'을 클릭하면 에러가 발생한다. (Git의 user name과 email을 설정하지 않았을 경우)
- 터미널 창을 열어 'git bash'를 실행한다.
- 다음 명령어를 입력한다
- (user name) git config --global user.name "입력할 user name")
- (user email) git config --global user.email "입력할 user email")
- 이후 'Commit(커밋)' 클릭 시 정상 실행
- 'Commit(커밋)' 클릭 전 변경 사항 영역에서 파일을 '+' 아이콘을 클릭하여 'stage area(스테이징된 변경사항)' 으로 옮긴다. (add 작업)
- add는 commit 상태를 만든다
- commit 대기상태는 satge area라고 부른다.
- git은 내용을 기반으로 commit id가 생성된다.
- 커밋 시 문구 변경
- git commit --amend -m "바꿀 문구" : commit 문구 변경 (로컬 저장소에만 있을 시에 가능)
- 'Commit(커밋)' 클릭 전 변경 사항 영역에서 파일을 '+' 아이콘을 클릭하여 'stage area(스테이징된 변경사항)' 으로 옮긴다. (add 작업)
HEAD와 main
- 타임머신으로 예를 들면 HEAD는 현재 시간이고, main은 마지막 시간이다.
- main은 마지막 버전을 가르킨다.
- 새로 만들어진 버전의 부모는 HEAD다.
- 특별사항이 없을 경우 HEAD는 main을 가르키기 때문에 main이 가르키는 값을 가르킨다.
- 이때, main이 가르키는 값이 바뀌면 HEAD도 그 값을 가르킨다.
- checkout
- checkout은 HEAD를 바꾼다.
- reset
- HEAD가 가르키는 branch를 바꾼다
- e.g. git reset A : HEAD가 가르키는 branch가 A가 된다.
- branch
- 하나의 프로젝트 안에서 여러 개의 작업을 하고 싶을 때 사용
- 'Detached HEAD' state
- HEAD가 main을 거쳐 가르키지 않고 바로 가르킨다. 이때는 새로운 버전 실험 시 실패하면 버리기 좋다.
- e.g.
- HEAD가 main을 가르키고, main이 B를 가르킨다. (HEAD -> main -> B)
- 이때 HEAD가 main이 아닌 B로 바로 checkout 한다.
- 그러면 'Detached HEAD'가 되어 HEAD가 B를 직접 가르키게 된다. (HEAD -> B)
- 이 상황에서 새 commit(D라고 가정)이 되면 main은 그대로 B를 가르키게 되고, (main -> B)
- HEAD는 새 Commit(D)를 가르키게 된다. (HEAD -> D)
- 이때 다시 HEAD를 main 또는 B로 checkout하게 되면 새 Commit(D)는 삭제된다.
Branch
- 새로운 branch 생성 후 작업한 내용이 성공한 경우 main branch와 병합(merge)
- main 브랜치가 exp(새로운 branch)를 합칠 수도 있고, exp가 main을 합칠 수도 있다.
- main 브랜치가 exp를 합칠 경우 main 브랜치에 checkout하여 병합(merge)을 진행한다.
- 이 경우는 main과 exp가 합쳐지고, main 브랜치가 이를 가르킨다.
- main 브랜치가 exp를 병합하든 exp 브랜치가 main을 병합하든 내용은 똑같다.
- main이 exp를 병합하면 main이, exp가 main을 병합하면 exp가 가르키는 것이 바뀐다.
- 서로 다른 branch가 같은 파일을 수정했을 경우
- 같은 파일에서 다른 부분을 수정하면 그 내용끼리 병합(merge)
- 서로 다른 branch에서 수정한 파일의 조상 파일(base)을 찾아 이 base 파일과 변경된 두 파일을 비교하면서 수정된 내용을 병합한다. (auto merge(자동병합))
- 같은 파일에서 같은 부분을 수정하면 병할할 때 충돌이 일어난다.
- 이때는 충돌된 부분을 사람이 어떻게 병합할지 선택한다.
- 같은 파일에서 다른 부분을 수정하면 그 내용끼리 병합(merge)
- e.g. 'w1' 커밋에서 'exp'라는 branch를 생성하고 'exp'브랜치에서 'w3' 커밋, 'main' 브랜치에서 'w2', 'w3' 커밋
- 'w1' 커밋에서 'main' 과 'exp' branch가 존재하고, 'exp' 브랜치에서는 'w3' 작업, 'main' 브랜치에서는 'w2', 'w3'을 작업하여 각각 다른 작업을 진행할 수 있다.
- 'exp' 작업이 성공하여 합치고자 할 경우 'main' 브랜치와 병합(merge) 할 수 있다.
Push와 Pull
- Push
- 로컬 저장소의 버전 내역을 원격 저장소로 업로드하는 기능
- Pull
- 원격 저장소(Remote Repository)의 변경 사항을 가져와 로컬 저장소(Local Repository)에 적용하는 명령어이다.
- 원격 저장소의 버전 내역을 로컬 저장소로 다운로드하는 기능
- 원격 저장소의 내용을 지역 저장소로 다운로드하는 행위가 포함되어 있다.
- 원격 저장소에서 가져온 내용을 지역 저장소의 내용과 병합하느 작업이 포함되어 있다.
- pull은 fetch와 merge를 합한 기능이다.
- fetch
- 원격 저장소의 내용을 가져오는 것 (원격 저장소의 내용을 지역 저장소로 다운로드)
- 같은 부모버전으로 시작한 지역 저장소와 원격 저장소가 각자 버전을 만들었다면 fetch를 했을 때 분기가 생긴다.
- fetch는 병합을 하기 전에 각 작업자들의 버전이 어떻게 만들어지고 있는지 확인 할 때 유용하다.
- merge : 내용을 합치는 것
- fetch
- e.g.
- 1번 컴퓨터에서 push하면 2번 컴퓨터에서 push할 시 오류가 발생한다.
- 이때는 2번 컴퓨터에선 1번 컴퓨터에서 push한 내용을 받아와서 병합한 후에 push해야 한다. (pull)
- 각 컴퓨터에서 같은 파일을 작업 했을 경우, 그 중에서도 같은 부분을 작업한 부분은 사용자가 어떻게 병합할지 결정한다.
실습 시나리오
- GitHub 저장소 만들기
- 저장소 복제하기
- common.txt.를 만들고 Commit(커밋)
- 내용
- 내용
- push 하기
- 저장소 복제하기 2 (같은 GitHub 저장소를 사용)
- 저장소 1에는 common.txt 내용 다음과 같이 수정 (L2 로 변경 후 커밋하고 L4로 변경 후 커밋 (각각 따로 커밋, 총 2번)
- 저장소 2에는 common.txt 내용 다음과 같이 수정 (R3 로 변경 후 커밋하고 R4로 변경 후 커밋 (각각 따로 커밋, 총 2번)
- 저장소 1 push
- 저장소 2 push => rejected 확인 (오류)
- 저장소 1에서 push한 내용이 반영이 되지 않아 오류가 발생
- 저장소 2 pull (merge commit 생성 확인 / 같은 작업 부분 merge 해결
- base 파일의 '4' 인 행에서 저장소 1에는 'L4'로, 저장소 2에는 'R4'로 저장되어 있기 때문에
- 해당하는 부분에는 어떻게 병합할 지 사용자가 정의를 해주어야 한다.
- 저장소 2 push
- 저장소 1 pull
이로써 Git의 활용 방법을 배워보았다.
- GitHub 계정에서 레퍼지토리(저장소)를 생성해보고 이 원격 저장소와 vscode에서의 로컬 저장소를 연동을 해보았고
- 이후 생성 혹은 변경 (또는 삭제) 된 파일을 add, commit 하는 방법을 배웠다.
- 또, 하나의 프로젝트 안에서 여러 개의 작업을 할 수 있도록하는 branch를 배웠다.
- 그리고 commit 한 파일을 원격저장소에 업데이트 하기 위한 push와, 원격 저장소의 내용을 가져오고 병합하기 위한 pull을 학습해보았다. (pull = fetch(원격 저장소의 내용을 가져옴) + merge(내용을 합침)
- 그리고 어떤 경우에 충돌(오류)가 나는지와 해당 경우에 어떻게 대처해야할지 배워보았다.
- e.g. 각 컴퓨터에서 같은 파일을 작업 했을 경우, 그 중에서도 같은 부분을 작업했을 경우
이를 통해 Git을 이용하여 버전관리, GitHub를 통한 백업과 협업하는 방법에 대해서 학습해보았다.
'Programming > Git' 카테고리의 다른 글
[Git] Git 이론 (0) | 2025.03.26 |
---|