깃 모르겠다!! 몇번을 들어도 진짜 하~~~나도 모르겠다!!!
코틀린 기초언어, XML 레이아웃 - 액티비티 - 컨탠트까지는 어찌어찌 따라갔고
우리 창업조 팀원분들 중 이해 못하신분께 과외로 알려드리기까지 했는데
깃은 ... 깃은 ...... 왜 봐도봐도 모르겠지 진짜 😂
오늘 어떻게든 디깅해서 반드시 마스터하겠어 🔥
(설치 과정은 생략)
그동안 저장했던 히스토리가 전부 남아요!
1. 워킹 디렉토리
현재 작업중인 파일폴더들
- [ MainActivity.kt / SignInActivity / SignUpActivity ]
git add MainActivity.kt
스테이징 에어리어
잠깐 담아두는 중단단계.
어떤 파일을 업데이트할 지 고른다
- [ MainActivity.kt ]
git commit -m "메인액티비티 버그 해결함"
2. 로컬 리포지토리
오프라인 버전 저장소
메인 브랜치에 커밋 히스토리가 계속 남음 (*히스토리 단위 : 커밋)
- NEW 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
- 어제자 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
- 3일 전 커밋 [ MainActivity.kt / SignInActivity / SignUpActivity ]
깃을 초기화한다.
모든 브랜치가 초기화되고, 워킹 디렉토리는 "main" 브랜치 상태가 된다
커밋할 파일을 골라담는다.
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 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. 로컬 리포지토리
오프라인 버전 저장소
배포용/개발용/기능별로 버전을 구분하고 (버전 단위 : 브랜치)
시간순으로도 히스토리를 관리합니다 (히스토리 단위 : 커밋)
메인 배포용 : 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 ]
스테이징 에어리어
1. 워킹 디렉토리
브랜치를 불러와서 작업합니다
- feature/로그인 [ MainActivity.kt / SignInActivity / SignUpActivity ]
현재 디렉토리를 복제해서 새 브랜치를 만듭니다. 근데 만들기만 하고 안열어줌. 따로 열어줘야됨.
git branch dev
dev 브런치를 만듭니다
git branch -d ㅁㅁㅁ
필요없어진 브랜치를 삭제합니다
git branch
깃브랜치만 쓰면 브랜치 리스트와 함께 별표 ( * )로 현재 브랜치를 알려줍니다
* main feature-branch bugfix-branch
ㅁㅁㅁ 브랜치를 불러오기(전환)합니다. 워킹 디렉토리에 ㅁㅁㅁ 브랜치 파일이 열립니다.
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 처럼 해시값을 입력하면, 해당 히스토리의 커밋을 열람할 수 있습니다
새 브랜치를 만들고, 워킹 디렉토리에 불러옵니다.
branch -> checkout 이렇게 두번 일 안하고 한번에 할 수 있어 편합니다.
git checkout -b feature/sign-in
기능 브랜치를 만들고, 불러옵니다.
feature/ 로 기능 브랜치임을 명시하고
my-new-branch 처럼 띄어쓰기 대신 하이픈( - )을 쓰는게 국룰git switch -c bugfix/fucking-error
버그 수정을 위한 브랜치일땐, bugfix/ 같은 접두어도 쓴다고 합니다
현재 브랜치에 ㅁㅁㅁ 브랜치의 정보를 통합합니다.
보통 dev 브랜치를 checkout으로 불러오고, feature/sign-in을 머지해서
새로 작성된 로그인기능 코드를 dev 브랜치에 통합하는 식으로 사용합니다.
충돌하지 않는 경우
새로 쓴 코드블럭이 겹치지 않는다 → 원활하게 통합성공!
충돌하는 경우
기존 코드블럭을 수정했거나, 줄이 겹친다면 → 충돌 발생!
<<<<<<< HEAD 기존 코드 ======= 새로운 코드 >>>>>> feature/sign-in
기존 코드를 정리하고 git add, git commit으로 커밋한번 해주면 통합성공!
얼추 뼈대는 만들었다. 이제 커밋을 하자.
git init
git add .
git commit -m "메인에 첫커밋"맨 처음엔 main 브랜치 뿐인데... 체계적인 브랜치 구조를 만들자!
git branch dev
git branch feature/sign-indev 브랜치, 팀원이 개발할 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
.
.
.
여러 사람의 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 : 반려, 수정 요청
팀장이라면
깃허브에 새로운 리포지토리를 개설합니다
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/bbbb 기능 브랜치에, 최신 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 ~