아 그래서 깃이 뭐냐고요

·2024년 7월 1일
0

깃 모르겠다!! 몇번을 들어도 진짜 하~~~나도 모르겠다!!!

코틀린 기초언어, XML 레이아웃 - 액티비티 - 컨탠트까지는 어찌어찌 따라갔고
우리 창업조 팀원분들 중 이해 못하신분께 과외로 알려드리기까지 했는데
깃은 ... 깃은 ...... 왜 봐도봐도 모르겠지 진짜 😂

오늘 어떻게든 디깅해서 반드시 마스터하겠어 🔥

(설치 과정은 생략)


[레벨1] 깃 : 로컬 버전관리 솔루션

그동안 저장했던 히스토리가 전부 남아요!

+ 깃 init [초기화] : 깃 탄생! 처음부터 시작한다!

1. 워킹 디렉토리

현재 작업중인 파일폴더들

  • [ MainActivity.kt / SignInActivity / SignUpActivity ]

↓ 깃 add [스냅샷] : 셀렉 시작! 업데이트 할 파일들만 골라담아 !

git add MainActivity.kt

스테이징 에어리어

잠깐 담아두는 중단단계.
어떤 파일을 업데이트할 지 고른다

  • [ MainActivity.kt ]

↓ 깃 commit [커밋] : 저장! 선택한 파일을 현재 브랜치에 업데이트한다!

git commit -m "메인액티비티 버그 해결함"

2. 로컬 리포지토리

오프라인 버전 저장소
메인 브랜치에 커밋 히스토리가 계속 남음 (*히스토리 단위 : 커밋)

  • NEW 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
    • 어제자 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
    • 3일 전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]

main 브랜치 업데이트하기

git init

깃을 초기화한다.
모든 브랜치가 초기화되고, 워킹 디렉토리는 "main" 브랜치 상태가 된다

git add

커밋할 파일을 골라담는다.

git add 파일이름

  • 예시 : git add MainActivity.kt
  • 동시에 add하려면 : 띄어쓰기로 여러 파일을 언급하거나, 줄바꾸고 다시 git add ...
  • 다른 폴더의 파일을 add하려면 풀네임으로 res / layout / ...

git add .

  • 쩜 ( . )과 함께 add하면 모든 파일을 add 할 수 있다.

git add *.xml

  • 모든 .xml 패턴의 파일을 add

git add res/

  • res 폴더 속 모든 파일을 add

git commit

골라담은 파일을 업데이트한다

  • 뭐 바꼈는지 -m "메시지" 적어주는게 국룰.

레벨1 시뮬레이션

한참 코딩을 하다가... 아! 슬슬 깃 써야겠다!

git init
git add .
git commit -m "메인브랜치에 남기는 첫커밋입니다"

작업하면서 계속 add, commit 으로 중간저장

git add MainActivity.kt
git commit -m "메인액티비티 코드 거의 다 씀"
git add FriendClass
git commit -m "친구 클래스 완성함"
git add MainActivity.kt FriendClass
git commit -m "버그 해결함"
.
.

저장소에 계속 히스토리가 남는 건 좋은데 . . .

[로컬 리포지토리]

메인 브랜치

실제로 배포되는 버전

로컬 리포지토리 속,
"메인 브랜치" 하나에 계속 add, commit으로 저장하는 중.
이 복잡한 개발과정을... 그저 "시간순"으로 히스토리만 남기고 있다니
.
.
너무 비효율적이고 위험한데?


[레벨2] 깃 : 로컬 버전관리 솔루션 v2

버전을 개발용/배포용, 각각의 기능별로 체계적으로 관리합니다

[로컬 리포지토리]

개발용 브랜치 (회원가입 기능)

개발용 브랜치 (로그인 기능)

개발용 브랜치 (검색 기능)

↓ 각 기능별로 개발이 끝나면 하나씩, 하나씩 동기화해서 합쳐

개발용 브랜치 (통합)

↓ 합친 기능을 최종 테스트해보고, 완벽하면 배포해

메인 배포용 브랜치

이러면 분업하기에도 용이하고, 테스트도 더 꼼꼼히 할 수 있겠군!

+ 깃 branch ㅁㅁㅁ [새 브랜치] : 새로운 브랜치를 생성합니다

이제부터 수정된 시간에 따른 히스토리는 "커밋" 단위로,
개발용/배포용/기능별로 역할이 달라지는 버전은 "브랜치" 단위로 구분합니다

2. 로컬 리포지토리

오프라인 버전 저장소
배포용/개발용/기능별로 버전을 구분하고 (버전 단위 : 브랜치)
시간순으로도 히스토리를 관리합니다 (
히스토리 단위 : 커밋)

  • 메인 배포용 : main 브랜치

    • 오늘자 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
    • 30일전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
    • 60일전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]

  • 개발용 (통합) : dev 브랜치

    • 어제자 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
    • 2일전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
    • 30일전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]

↑ 깃 merge ㅁㅁㅁ [머지] : 현재 사용중인 브랜치에 ㅁㅁㅁ 브랜치를 통합합니다


  • 개발용 (기능) : feature / 회원가입 브랜치

    • 어제자 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
    • 3일 전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]

  • 개발용 (기능) : feature / 로그인 브랜치

    • 2일전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
    • 5일 전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]

↑ 깃 commit [커밋] : 업데이트!

스테이징 에어리어

↑ 깃 add [스냅샷] : 골라담어!

↓ 깃 checkout ㅁㅁㅁ [불러오기] : 브랜치를 워킹디렉토리에 열어! (= 깃 switch, 전환해~)

1. 워킹 디렉토리

브랜치를 불러와서 작업합니다

  • feature/로그인 [ MainActivity.kt / SignInActivity / SignUpActivity ]

다양한 branch 관리하기

git branch ㅁㅁㅁ

현재 디렉토리를 복제해서 새 브랜치를 만듭니다. 근데 만들기만 하고 안열어줌. 따로 열어줘야됨.

git branch dev

dev 브런치를 만듭니다

git branch -d ㅁㅁㅁ

필요없어진 브랜치를 삭제합니다

git branch

깃브랜치만 쓰면 브랜치 리스트와 함께 별표 ( * )로 현재 브랜치를 알려줍니다

* main
  feature-branch
  bugfix-branch

git checkout ㅁㅁㅁ

git switch ㅁㅁㅁ

ㅁㅁㅁ 브랜치를 불러오기(전환)합니다. 워킹 디렉토리에 ㅁㅁㅁ 브랜치 파일이 열립니다.

git switch feature/sign-in

일반적으로 이렇게 "브랜치"를 불러오지만,
특정 시점의 "커밋" 히스토리를 불러오고 싶다면

git log 브랜치이름

우선 깃 로그로 해당 브랜치의 커밋 히스토리를 열람합니다

commit abcdef1234567890abcdef1234567890abcdef12
Author: Your Name <youremail@example.com>
Date:   Wed Jun 30 15:20:55 2024 +0900
    해당 파일에 대한 커밋 메시지
commit 1234567890abcdef1234567890abcdef12345678
Author: Another Author <anotheremail@example.com>
Date:   Tue Jun 29 12:14:25 2024 +0900
    이전 커밋 메시지

현재 브랜치 상태와 과거 커밋 히스토리 목록이 나옵니다
16진수 40자로 구성된 "해시값" 중 앞 7자리를 불러옵니다

git switch 해시값

abcdef1 처럼 해시값을 입력하면, 해당 히스토리의 커밋을 열람할 수 있습니다

git checkout -b ㅁㅁㅁ

git switch -c ㅁㅁㅁ

새 브랜치를 만들고, 워킹 디렉토리에 불러옵니다.
branch -> checkout 이렇게 두번 일 안하고 한번에 할 수 있어 편합니다.

git checkout -b feature/sign-in

기능 브랜치를 만들고, 불러옵니다.
feature/ 로 기능 브랜치임을 명시하고
my-new-branch 처럼 띄어쓰기 대신 하이픈( - )을 쓰는게 국룰

git switch -c bugfix/fucking-error

버그 수정을 위한 브랜치일땐, bugfix/ 같은 접두어도 쓴다고 합니다

git merge ㅁㅁㅁ

현재 브랜치에 ㅁㅁㅁ 브랜치의 정보를 통합합니다.
보통 dev 브랜치를 checkout으로 불러오고, feature/sign-in을 머지해서
새로 작성된 로그인기능 코드를 dev 브랜치에 통합하는 식으로 사용합니다.

충돌하지 않는 경우

새로 쓴 코드블럭이 겹치지 않는다 → 원활하게 통합성공!

충돌하는 경우

기존 코드블럭을 수정했거나, 줄이 겹친다면 → 충돌 발생!

<<<<<<< HEAD
기존 코드
=======
새로운 코드
>>>>>> feature/sign-in

기존 코드를 정리하고 git add, git commit으로 커밋한번 해주면 통합성공!

레벨2 시뮬레이션

얼추 뼈대는 만들었다. 이제 커밋을 하자.

git init
git add .
git commit -m "메인에 첫커밋"

맨 처음엔 main 브랜치 뿐인데... 체계적인 브랜치 구조를 만들자!

git branch dev
git branch feature/sign-in

dev 브랜치, 팀원이 개발할 sign-in 브랜치를 생성.

git checkout -b feature/sign-up

내가 개발할 sign-up 브랜치는 생성 + 불러와서 작업진행 . . .

git add SignUpActivity
git commit -m "버튼 완성했다"
git add SignUpActivity
git commit -m "버그 잡았다"
.
.
git add SignUpActivity
git commit -m "드디어 끝!"

sign-up 브랜치를 다 완성했다. 이제 dev 브랜치에 합쳐야지

git checkout dev
git merge feature/sign-up

역시 충돌이 났군. 코드를 정리했다. 이제 다시 커밋하자.

git add SignUpActivity
git commit -m "회원가입 기능이 완성되었습니다"

드디어 기능 하나 업데이트 완료... 팀원이 만들던 sign-in 브랜치 좀 손봐주자

git checkout feature/sign-in
작업중...
git add sign-in
git commit
git add sign-in
git commit
.
.
.


[레벨3] 깃허브 : 원격 협업관리 솔루션

여러 사람의 remote 리포지토지를 열람하고 협업합니다

커밋하기

워킹 디렉토리를 브랜치로 업데이트합니다
1. 워킹 디렉토리 → add(스테이징에어리어), commit → 2.로컬 리포지토리

브랜치 머지하기

브랜치를 단계별로 관리하며, 완성된 기능을 다음 단계로 통합합니다
[ 2. 로컬 리포지토리 안에서 ]
2-1. featrue/xxx 브랜치
↓ checkout dev + merge feature/xxx
2-2. dev 브랜치
↓ checkout main + merge dev
2-3. main 브랜치

내 원격 저장소에 푸시하기

로컬 저장소의 브랜치를 내 원격 저장소에 업로드합니다
2. 로컬 리포지토리 → push -u 원격저장소이름 feature/xxx → 3. 내 원격 리포지토리

깃허브에서 팀 저장소에 풀리퀘스트하기

내 원격 저장소의 브랜치를 팀의 원격 저장소에 제안합니다
3. 내 원격 리포지토리 → 깃허브에서 풀리퀘스트 → 코드리뷰, 검토 → 4. 팀 리포지토리


팀장으로 시작하기 (로컬 → 원격)

1. git remote add 내원격저장소이름 https:// ... .git

깃허브에 방금 막 개설한 원격 저장소 링크를 연결합니다

2. git push -u 원격저장소이름 --all

로컬 리포지토리의 모든 브랜치를 원격저장소에 통째로 업로드합니다

팀원으로 시작하기 (원격 → 로컬)

1. 깃허브에서 팀 리포지토리를 내 리포지토리로 Fork 해온다

2. git clone https:// ... .git

깃허브에 Fork해온 리포지토리를 로컬 리포지토리로 통째로 복제합니다.

팀원이 깃허브에 푸시하기

1. git commit featrue/xxx

완성된 로컬 feature 브랜치를 커밋한다

2. git pull 원격저장소이름 dev

git merge dev

내 원격 dev 브랜치를 로컬 리포지토리로 다운로드한다
feature/xxx에 dev를 머지하고 충돌, 버그 테스트를 진행한다

3. git push -u 원격저장소이름 feature/xxx

로컬에서 완성한 feature 브랜치를 원격 리포지토리에 푸시한다

4. 깃허브에서 팀 리포지토리로 Pull Request 한다

Comment : 의견
Approve : 승인
Request changes : 반려, 수정 요청


레벨3 시뮬레이션

팀장이라면

깃허브에 새로운 리포지토리를 개설합니다

git remote add 이름 http:// ... .git
git init
git add .
git commit -m "메인브랜치에 첫커밋"
git branch dev
git branch feature/aaa
git branch feature/bbb
git push -u 이름 -- all

깃허브 팀 리포지토리를 연결하고, 협업용 dev/feature 브랜치를 생성, all 푸시합니다

git checkout feature/bbb
개발중..
git add .
git commit -m "완성"

내가 맡은 b 기능을 완성합니다

git pull 이름 dev
git merge dev
git push -u 이름 feature/bbb

b 기능 브랜치에, 최신 dev를 불러와 머지하고 버그,충돌을 잡은 뒤 b 기능을 푸시합니다


git pull 이름 feature/aaa
git checkout dev
git merge feature/aaa
git merge feature/bbb
git push -u 이름 dev

[통합] 컨펌된 기능 브랜치를 dev에 모두 머지하고 dev를 푸시합니다


git checkout main
git merge dev
git push -u 이름 main

[배포] 확실한 테스트를 마쳤다면 배포용 main 브랜치를 푸시합니다

팀원이라면

깃허브에 팀 리포지토리를 Fork해온 뒤, 클론합니다

git clone http:// ... .git
git checkout feature/aaa
작업중..
git add .
git commit -m "완성"

내 브랜치를 완성합니다

git pull 이름 dev
git merge dev

최신 dev를 불러와 머지하고 충돌테스트를 진행합니다

git push -u 이름 feature/aaa

테스트를 마친 기능을 push하고 깃허브에서 PullRequest합니다


개념 정리

저장하는 공간

워킹디렉토리
( 스테이징 에어리어 )

로컬 저장소 :: local 리포지토리
( main - dev - feature )

원격 저장소 :: remote 리포지토리
( 내 원격저장소 - 팀 원격저장소 )

버전의 단위

브랜치 / 커밋

커밋 액션

git init

git add
.

git commit
-m ""

git log ~

브랜치 액션

git branch ~
-d

git switch ~
-c

git checkout ~
-b

git merge ~

깃허브 액션

Fork

git pull origin ~

Pull Request

git push -u origin ~

profile
디자이너의 개발 창업 도전기

0개의 댓글