깃(Git)은 분산 버전관리 시스템(DVCS = Distributed Version Contirl System)으로 컴퓨터 파일의 변경사항을 추적하고, 한 파일에 대한 여러 사용자의 공동 작업을 조율하는데 사용된다.
- 즉, 하나의 프로젝트에서 여러 개발자가 협업하기 위한 기술
분산 버전 관리 툴인 깃(Git)을 사용하는 프로젝트를 지원하는 웹호스팅 서비스
- 즉, 파일 저장소(서버)
CLI(Command Line Interface):
GitBash
와 같이 명령어를 이용해 조작
GUI(Graphical User Interface):GitDesktop
,SourceTree
와 같이 시각적으로 보이는 유저 인터페이스를 활용해 조작
README : 디렉터리나 압축 파일에 포함된 파일에 대한 정보를 포함하여 함께 배포되는 파일
Git Ignore : 관리할 필요 없는 파일을 기술하는 파일
License : None (소스코드를 가져다 쓸 때 저작권 관련하여 어떤 라이선스로 이용가능한지를 명확히 기술하는 것)
IT업계 종사자라면 사용할 수 있어야 하는 git bash
Git Bash에서 아래 명령어를 통해 이름, 이메일 설정
git config --global user.name "(본인이름)" git config --global user.email "(본인이메일)"
사용 예제
git config --global user.name "abc" git config --global user.email "abc@naver.com"
아래 명령어로 이름, 이메일 확인
git config --global user.name git config --global user.email
기본 브랜치 이름 변경
- master / slave : 흑인 노예 연상 -> main / branch으로 변경됨
- 이에따라 기본 브랜치의 이름을 main으로 변경
git config --global init.defaultBranch main git config --global init.defaultBranch
- git init: 폴더 경로에 git 연동, 깃 저장소 생성 및 .git 파일 생성
git init
- git status: 현재 폴더의 상황(변동사항)을 git의 관점에서 보여줌
- git diff: 현재 폴더의 상황(변동사항)을 git의 관점에서 보다 자세히 보여줌
git status git diff
- git status의 폴더 상황(변동사항)에서 배제하겠다는 의미
- github 서버로 업데이트할 파일을 선택하겠다는 의미
- 1. 포함할 필요가 없는 파일: 자동 생성 or 다운로드 되는 파일(빌드, 결과물, 라이브러리)
- 2. 포함하지 말아야 하는 파일: 보안상 민감한 파일
- .gitignore를 이용해 설정
.gitignore 파일 내에 배제시킬 파일의 이름을 작성
- .gitignore 파일 배제 작성법
## 1. 파일 + 폴더 배제 : 파일 또는 폴더 자체 배제(폴더 내 모든 파일 배제) folder game ## 2. 폴더 배제 : 폴더 자체 배제(폴더 내 모든 파일 배제) folder/ ## 3. 파일 이름 배제 backjoon1004.cpp ## 4. 특정 폴더 파일 이름 배제 /backjoon1004.cpp foldler/backjoon1004.cpp /folder/backjoon1004.cpp ## 5. 특정 확장자 배제 *.c *.cs *.html ex... folder/*.c folder/*.cs folder/*.html ex... # 6. !배제를 배제 !not_ignore_thisc.c !not_ignore_thiscs.cs !not_ignore_thishtml.html file.c # 7. 최상위 폴더의 file.c /file.c # 8. 모든 .c 확장자 파일 *.c # 9. 특정 폴더 내, 모든 폴더 안에 특정 파일 배제 folder/**/debug.log
## 버전에 파일 담기 git add filename.py # 모든 파일 담기 git add . # git add 취소하기 git rm --cached <file> ## 버전으로 묶어주기
# vi 입력모드로 진입 git commit # vi 모드 명령어 # i : insert -> 커밋 메시지 작성 # Esc : 종료 # : : 커밋 저장 및 종료 설정 # :q = 저장하지 않고 종료 # :q! = 저장하지 않고 강제 종료 # :wq = 저장 후 종료 # 커밋 메세지 한 번에 작성 git commit -m "comment" # add + commit + 커밋 메시지 git commit -am "comment" # 커밋 이력 확인 git log
## Reset # 되돌아갈 시점의 커밋 해시 복사 git reset --hard (돌아갈 커밋 해시) # 현재 커밋 상태로 초기화. 현재 없지만 reset하면서 다시 생성된 파일은 수동으로 삭제 git reset --hard ## Revert # 수정할 커밋의 해시를 찾는다 git revert (수정할 커밋 해시) :wq # 커밋 수정 내용이 이후 커밋의 코드에 영향을 주는 경우 conflict가 발생하게 된다 # "Replace Lions with Leopards" 커밋을 revert하면 이후 leopard를 수정하는 부분에서 conflict git revert 6909f6ca6ab597a8b78cfcfc99ee8ca6a85a539a # 커밋 revert로 삭제가 필요한 leopards.yaml 삭제 git rm leopards.yaml git revert --continue :wq # revert 시에는 commit이 동시에 되는데 commit 없이 revert 하고 싶을 때 # (다른 액션도 함께 커밋하고 싶을 때) git revert --no-commit (수정할 커밋 해시) # 커밋되지 않은 것들을 지우고 현재 커밋 상태로 초기화하고 싶을 때 git reset --hard
- 프로젝트를 하나 이상의 모습으로 관리해야할 때 사용 ex) 서비스용, 테스트서버용, 개발용
- 여러 작업들이 독립적으로 진행될 때 사용 ex) 기능1, 기능2, 기능3, 코드개선, 긴급수정
- 각 분기(Branch)에서 작업 후, Main 분기(Branch)에 통합
# 브랜치 생성 git branch (신규 브랜치 명) # 브랜치 목록 확인 git branch # 다른 브랜치로 이동 git switch (신규 브랜치 명) # 브랜치 생성과 이동을 동시에 하기 git switch -c (신규 브랜치 명) # 브랜치 삭제하기 # 지워질 브랜치에만 있는 내용의 커밋이 있을 경우(=다른 브랜치로 가져오지 않은 내용이 있는 경우) # -d 대신 -D로 강제 삭제 git branch -d (삭제할 브랜치 명) # 브랜치 이름 변경 git branch -m (기존 브랜치 명) (신규 브랜치 명) # 여러 브랜치의 내역을 한번에 보기 -> Source Tree or Github Desktop으로 확인하는게 더 편함 git log --al --decorate --oneline --graph
- Branch 융합 = Merge / Rebase
- Merge : 두 브랜치를 한 커밋에 이어붙이는 방식
o 브랜치 사용 내역을 남길 필요가 있을 때
o 다른 형태의 merge도 있음# merge # 1. merger 시, 주가 될 브랜치로 이동 # 2. merge는 reset으로 되돌리기 가능. merge 전 해당 브랜치의 마지막 시점으로 reset git switch main git merge sub # 병합된 브랜치는 삭제 git branch -d add-coach
- Rebase : 브랜치를 다른 브랜치에 이어붙이는 방식
o 한 줄로 깔끔히 정리된 내용을 유지하기 원할 때
o 이미 팀원들과 공유한 커밋에 대해서는 사용하지 않는 것이 적합# Rebase로 합치기 # merge와 반대로 합쳐질 브랜치로 이동한다 git switch new-teams git rebase main # new-teams 브랜치가 main에 합쳐졌지만 아직 main은 new-teams 브랜치의 끝에 있지 않다. # 따라서 main 브랜치로 이동 후 git switch main #new-teams의 시점으로 fast-forward해준다 git merge new-teams # 합친 브랜치 삭제 git branch -d new-teams
- abort : 충돌이 너무 많거나 당장 충돌 해결이 어려운 경우 머지 중단
## merge에서 충돌이 발생하는 경우 git switch main git merge conflict-1 # Auto-merging tigers.yaml # CONFLICT (content): Merge conflict in tigers.yaml # Automatic merge failed; fix conflicts and then commit the result. # abort : 당장 충돌 해결이 어렵다면 merge 중단 git merge --abort # 해결 가능 시 충돌 부분 수정 후 git add, commit으로 병합 완료 git add . git commit
- rebase : 다시 심어 해결
#브랜치 이동 git branch sub2 git rebase main ## rebase에서 충돌이 발생하는 경우 # 오류 메세지와 git status 확인 # 당장 해결이 어려운 경우 중단 git rebase --abort # 해결 가능 시 충돌 부분 수정한 뒤 아래 명령어 수행 (continue하여 또 충돌이 있는 지 찾는다) # 충돌이 해결될 때까지 반복 git add . git rebase --continue # main에서 git merge conflict-2로 merge하여 마무리 git switch main git merge conflict-2 git branch -d conflict-1 git branch -d conflict-2
버튼 UI에서 알아서 찾아서 누르면 된다.
1.
add
: stage에 올리기2.
ㅇ commit 메세지 작성 후 commit 수행commit
: git commit3.
push
: git push3-1.
publish-branch
: git push를 통해 해당 브랜치 자동 publish4.
pull
: git pull(fetch까지 동시에 진행)4-1.
fetch
: fetch를 통해 브랜치 받아오기4-2.
branch clone
: 원격 브랜치 우클릭 -> 체크아웃5.
reset
: 원하는 타임캡슐에 우클릭 -> 이 커밋까지 현재 브런치를 초기화6.
revert
: 원하는 타임캡슐에 우클릭 -> 커밋 되돌리기7.
create brance
: 브랜치 버튼 클릭8.
brance switch
: 원하는 브랜치 더블클릭9.
merge
: 주체가 될 branch에 위치 -> merge를 원하는 branch 우클릭 -> 현재 브랜치로 branch 병합 클릭10.
-> 주체가 될 branch에서 병합될 branch를 merge 수행rebase
: 병합될 branch에 위치 -> 주체가 될 branch 우클릭 -> 현재 변경사항을 main에 재배치 클릭11.
충돌 해결
: CLI단에서 해결12.
원격
: 저장소 -> 원격저장소 추가 -> 추가 -> origin + https 경로 붙여넣기(default 원격 여부 클릭)
(Github)은 코드 공유 및 협업 서비스로 프로젝트를 레포지터리 단위로 올리고, Git으로 관리하는 프로젝트를 공유하며 저장되는 서버 공간이다.
- 전 세계의 수많은 오픈소스 프로젝트들이 Github에서 공유된다.
ex) Gitlab, Bitbucket
# 로컬에 원격 저장소 추가 후 푸시 (repository 명령어 복붙) # 여기서는 https 프로토콜 사용 # 로컬의 git 저장소에 원격 저장소로의 연결 추가 git remote add origin (원격 저장소 주소) # 브랜치 명 수정 git branch -M main # 로컬 저장소의 커밋 내역을 원격으로 push (업로드). origin의 main branch로 push git push -u origin main # 원격 저장소 목록보기: origin 이름 출력 git remote # 원격 저장소 목록보기: origin 세부정보 출력 git remote -v # 원격 지우기 (github repository가 지워지는 것이 아니라 로컬 프로젝트와의 연결만 삭제) git remote remove (origin 등 원격 이름)
# 1. Github에서 프로젝트 다운받기(쓸모없는 방식) # 2. 프로젝트를 다운받고자 하는 폴더에서 우클릭 - Git Bash here git clone https://github.com/gin-girin-grim/git-practice.git(원격 저장소 주소)
# 원격으로 커밋 밀어올리기 (push) git push
# 원격으로 커밋 당겨오기 (pull) git pull
# pull 할 것이 있을 때 push를 해버리면? git push # To https://github.com/gin-girin-grim/git-practice.git # ! [rejected] main -> main (fetch first) # error: failed to push some refs to 'https://github.com/gin-girin-grim/git-practice.git' # hint: Updates were rejected because the remote contains work that you do # hint: not have locally. This is usually caused by another repository pushing # hint: to the same ref. You may want to first integrate the remote changes # hint: (e.g., 'git pull ...') before pushing again. # hint: See the 'Note about fast-forwards' in 'git push --help' for details. # 우선 먼저 pull을 하고 push를 해준다 # 1-1. merge 방식 git pull --no-rebase # 1-2. rebase 방식 # pull 상의 rebase는 협업 시에도 사용 OK git pull --rebase # 2. push git push
# 협업 시 충돌이 발생하는 경우 # 이후는 merge/rebase 방식과 동일. 충돌 처리 후 git add ., git commit git pull --no-rebase git pull --rebase -> git add . -> git rebase --continue
# 로컬의 내역을 강제로 push 하기
# 먼저 로컬의 충돌 전 커밋으로 reset 후
git push --force
# 로컬에서 브랜치 만들어 원격에 push 해보기 git branch -c from-local # push 해 줄 브랜치를 명시해준다 git push --set-upstream origin from-local git push -u origin from-local # 동일한 코드 # 원격 브랜치 목록까지 보기 git branch --all git branch -a
# 원격의 브랜치를 로컬로 받아오기 # 원격에 브랜치를 생성해도 원격 저장소 상태를 받아오지 않으면 로컬에서 변화를 볼 수 없음 $ git fetch From https://github.com/gin-girin-grim/git-practice * [new branch] from-remote -> origin/from-remote git branch -a # 로컬에도 같은 이름의 브랜치를 생성하여 연결 및 switch # 원격에서 로컬로 from-remote 브랜치를 복사하고, 이후에도 로컬의 from-remote 브랜치와 # 원격의 from-remote 브랜치를 연동하겠다는 의미 git switch -t origin/from-remote
# 원격 브랜치 삭제 git push (원격 이름) --delete (원격의 브랜치 명) git push origin --delete from-remote