Programming/Git

[Git] Git 실습

Boxya 2025. 3. 26. 21:52

[KT] AIVLE SCHOOL 1일차 

'생활코딩'의 이고잉 강사님의 Git 강의

[KT] AIVLE SCHOOL 첫 날의 강의로는 '생활코딩'의 이고잉 강사님의 Git 강의였다.

Git 강의는  VSCode를 활용하여  Git을 학습하기 쉽도록 GUI를 이용한 강의를 진행해주셨다.

 

버전 관리의 이유 : 디버깅

  • working directory 내용을 과거로 갈 수 있다. 이를 통해 디버깅이 가능

vscode로 Git 활용하기 (로컬 저장소)

  1. 먼저 바탕화면에 'Git1' 이라는 폴더를 생성한다. (폴더 이름은 자유)
  2. vscode에서 생성한 폴더 'Git1'를 연다.
  3. 'Source Control(소스 제어)' 항목에서 'Initialize Repository(저장소 초기화)' 를 누른다.
    • 'Initialize Repository'를 누르면 해당 폴더에 .git 이라는 파일이 생성된다.
    • 해당 폴더가 git으로 관리한다는 뜻
    • 모든 버전은 .git 안에 저장한다.
    • 폴더의 .git 폴더는 숨김처리되어 안보일 수도 있다.
    • .git 디렉토리는 버전이 보관되는 장
  4. 'Git1' 폴더 안에 'work1.txt' 파일을 생성한다. (예시로 숫자 1 입력 후 저장)
  5. 이때 'Message(메시지)' 란에 메시지 작성 후 'Commit(커밋)'을 클릭하면 에러가 발생한다.                                       (Git의 user name과 email을 설정하지 않았을 경우)
    1. 터미널 창을 열어 'git bash'를 실행한다.
    2. 다음 명령어를 입력한다
      1. (user name) git config --global user.name "입력할 user name")
      2. (user email) git config --global user.email "입력할 user email")
  6. 이후 'Commit(커밋)' 클릭 시 정상 실행
    • 'Commit(커밋)' 클릭 전 변경 사항 영역에서 파일을 '+' 아이콘을 클릭하여  'stage area(스테이징된 변경사항)' 으로 옮긴다. (add 작업)
      • add는 commit 상태를 만든다
      • commit 대기상태는 satge area라고 부른다.
      • git은 내용을 기반으로 commit id가 생성된다.
    • 커밋 시 문구 변경
      • git commit --amend -m "바꿀 문구" : commit 문구 변경 (로컬 저장소에만 있을 시에 가능)

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.
      1. HEAD가 main을 가르키고, main이 B를 가르킨다. (HEAD -> main -> B)
      2. 이때 HEAD가 main이 아닌 B로 바로 checkout 한다. 
      3. 그러면 'Detached HEAD'가 되어 HEAD가 B를 직접 가르키게 된다.  (HEAD -> B)
      4. 이 상황에서 새 commit(D라고 가정)이 되면 main은 그대로 B를 가르키게 되고, (main -> B)
      5. HEAD는 새 Commit(D)를 가르키게 된다. (HEAD -> D)
      6. 이때 다시 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(자동병합))
    • 같은 파일에서 같은 부분을 수정하면 병할할 때 충돌이 일어난다.
      • 이때는 충돌된 부분을 사람이 어떻게 병합할지 선택한다.
  • 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 : 내용을 합치는 것
  • e.g.
    • 1번 컴퓨터에서 push하면 2번 컴퓨터에서 push할 시 오류가 발생한다.
    • 이때는 2번 컴퓨터에선 1번 컴퓨터에서 push한 내용을 받아와서 병합한 후에 push해야 한다. (pull)
    • 각 컴퓨터에서 같은 파일을 작업 했을 경우, 그 중에서도 같은 부분을 작업한 부분은 사용자가 어떻게 병합할지 결정한다.

실습 시나리오

  1. GitHub 저장소 만들기
  2. 저장소 복제하기
  3. common.txt.를 만들고 Commit(커밋)
    • 내용
  4. push 하기
  5. 저장소 복제하기 2 (같은 GitHub 저장소를 사용)
  6. 저장소 1에는 common.txt 내용 다음과 같이 수정 (L2 로 변경 후 커밋하고 L4로 변경 후 커밋 (각각 따로 커밋, 총 2번)

  7. 저장소 2에는 common.txt 내용 다음과 같이 수정 (R3 로 변경 후 커밋하고 R4로 변경 후 커밋 (각각 따로 커밋, 총 2번)

  8. 저장소 1 push
  9. 저장소 2 push => rejected 확인 (오류)
    • 저장소 1에서 push한 내용이 반영이 되지 않아 오류가 발생
  10. 저장소 2 pull (merge commit 생성 확인 / 같은 작업 부분 merge 해결
    • base 파일의 '4' 인 행에서 저장소 1에는 'L4'로, 저장소 2에는 'R4'로 저장되어 있기 때문에 
    • 해당하는 부분에는 어떻게 병합할 지 사용자가 정의를 해주어야 한다.
  11. 저장소 2 push
  12. 저장소 1 pull

이로써 Git의 활용 방법을 배워보았다.

  1. GitHub 계정에서 레퍼지토리(저장소)를 생성해보고 이 원격 저장소와 vscode에서의 로컬 저장소를 연동을 해보았고
  2. 이후 생성 혹은 변경 (또는 삭제) 된 파일을 add, commit 하는 방법을 배웠다.
  3. 또, 하나의 프로젝트 안에서 여러 개의 작업을 할 수 있도록하는 branch를 배웠다.
  4. 그리고 commit 한 파일을 원격저장소에 업데이트 하기 위한 push와, 원격 저장소의 내용을 가져오고 병합하기 위한 pull을 학습해보았다. (pull = fetch(원격 저장소의 내용을 가져옴) + merge(내용을 합침)
  5. 그리고 어떤 경우에 충돌(오류)가 나는지와 해당 경우에 어떻게 대처해야할지 배워보았다.
    • e.g. 각 컴퓨터에서 같은 파일을 작업 했을 경우, 그 중에서도 같은 부분을 작업했을 경우

이를 통해 Git을 이용하여 버전관리, GitHub를 통한 백업과 협업하는 방법에 대해서 학습해보았다. 

 

'Programming > Git' 카테고리의 다른 글

[Git] Git 이론  (0) 2025.03.26