Git이란?
소스 코드를 효과적으로 관리할 수 있게 해주는 오픈소스로 버전 관리 시스템(version control system)이라고도 한다.
개발 프로젝트 진행 시 최신 소스 여부나 수정 사항 등을 확인하는 이력 관리가 필요한데, 버전 관리 시스템은 이러한 이력 관리를 도와주는 역할을 한다.
코드 버전 관리를 하는 이유는?
수정할 때마다 파일을 새로 만들면 관리가 힘들기 때문에
언제든 이전 버전의 코드로 돌아갈 수 있기 때문에
이력(수정 내역, 수정자 정보 등을 통해 문제의 원인 제공자를 찾기가 쉬워진다.)을 남기기 위해
하나의 프로젝트를 두고 여러 명의 개발자들이 협업할 수 있기 때문에
Github란?
Git이 사용된 프로젝트들의 저장소
개발자들의 Social Network
정리
Git
은 프로젝트 버전 관리를 도와주는 시스템이고 Github
는 Git을 이용해 버전 관리를 한 프로젝트들을 관리해주는 호스팅 서비스다.Repositories(저장소)
Git repository는 Git으로 관리하는 프로젝트 저장소로 크게 두 종류가 있다.
Local repository - 본인의 컴퓨터에 저장된 로컬 버전의 프로젝트 저장소
Remote repository - 로컬 repository와는 반대로 내 컴퓨터가 아닌 외부 (일반적으로 원격 서버) 버전의 프로젝트 저장소. 팀에서 작업할 때 특히 유용합니다. 이곳에서 프로젝트 코드를 공유할 수 있고, 다른 사람의 코드를 확인할 수도 있습니다. 또, 로컬 버전의 프로젝트와 병합하고, 변경 사항을 적용 할 수 있는 곳입니다.
버전 관리 대상 디렉터리(프로젝트 디렉터리)로 이동 : cd
명령어 활용하기
깔린 git version 확인 : git —version
Git 시작하기 : git init
—> '.git'이라는 숨김 폴더 생성 —> 명령어가 활성화되면 Git은 현재 저장소에 대한 모든 변경사항(추가되는 문장 파일 등의 이력)을 추적/관리하게 된다. 즉, 파일 및 폴더의 변경 사항을 이력별로 저장해 두는 로컬 저장소(local repository)가 생성된다.
* 원치 않는 폴더에서 git이 활성화 됐을 경우: 해당 폴더로 이동하여 rm -rf .git
명령어로 저장소를 제거
* git init
을 입력하면 해당 프로젝트 파일에서 자동으로 master branch가 생성 및 활성화 된다. branch 이름은 수정될 수 있고, 새로운 branch를 만들어 전환하는 것도 가능하다.
숨김 폴더 확인: ls -al
Git 상태 확인 : git status
파일 수정 이력 기록 준비 :git add
git add
는 git으로 관리되지 않고 있던 파일들을 staging area에 추가해준다.
git add .
: 프로젝트 폴더 내의 모든 파일과 폴더를 staging area에 추가하고, commit을 남길 수 있게 해준다.
파일 수정 이력 기록 : git commit -m "Commit message"
Commit 이력 보기 :git log
내가 위치한 경로 확인: pwd
실습해보기 : 프로젝트 폴더로 이동 —> git init
—> touch
로 파일 생성 —> git status
—> git add .
—> staging area에 추가하여 기록으로 남길 것을 명령 —> git status
—> 메시지가 바뀐 걸 확인할 수 있음 —> git commit -m “Creating sample.md”
—> git status
—> commit 이력 보기 —> git log
—> 나가려면 q
위 실습을 통해 desktop에 local repository를 하나 생성한 것으로 볼 수 있다.
Github에 접속하여 remote repository 생성 및 push 실습을 해보자. repository name은 중복을 허용하지 않으므로 주의!!
repository name을 입력하고 public 옵션을 선택한 뒤, Create repository 클릭
git push란?
commit한 변경사항을 밀어서 git hub에 올리는 것 c.f) 반대는 pull
commit한 이력이 repository로 저장된다. 현재 폴더를 그대로 업로드하는 것이 아니라, 지금까지의 이력/버전(commit)을 올리는 것이다.
push할 remote repository 주소 입력 : repository 생성한 폴더로 이동 —> git remote add origin (remote repository 주소.git)
현재 연결되어 있는 저장소(remote repository) 주소 확인하기: 로컬 저장소로 이동 —>git remote -v
현재 사용 중인 branch 이름을 'main'으로 바꾸기(선택 사항): git branch -M main
push 명령어: git push -u origin [branch name]
ex) git push -u origin main
MAC OS환경에서 git push 실행시, 아래와 같은 로그가 뜨며 error가 발생했을 경우
문제를 해결하려면 먼저 Github에서 Personal Access Token 생성해야 한다.
생성을 완료했으면 MAC 응용프로그램인 keychian에 접근하여 github.com에 설정된 암호를 Token으로 바꿔줘야 한다. 자세한 내용은 아래의 링크에 나와있다.
맥 OS: git push에서 The requested URL returned error: 403 해결 방법
Github 원격 저장소에 잘못 push한 폴더 삭제 방법
git rm --cached [File Name]
: 원격 저장소에 있는 파일을 삭제한다. 로컬 저장소에 있는 파일은 삭제하지 않는다
ex) git rm --cached -r .idea/
: .idea 폴더 하위의 모든 파일 삭제
ex) git rm --cached ./api/models/.room.py.swp
Branch
branch를 활용한 작업의 진행 순서
branch 활용의 장점
관련 명령어
git branch <new-branch-name>
: branch 생성git checkout <branch-name>
: branch 전환git checkout -b <new-branch-name>
: branch 생성과 동시에 생성된 branch로 이동git branch
: 프로젝트에 존재하는 모든 branch 확인git merge <branch-name>
: branch 병합. 특정 branch의 작업 내용을 master branch에 적용할 때 사용된다.git branch -d <branch-name>
: branch 삭제(조심해서 사용)Rebase 필요성
Rebase 단점
사용 방법
Branch 작업 완료 —>git pull origin main
—> 작업 branch로 이동 —> Git rebase -i main
—> interactive 창이 열림 —> commit 내역이 창에 순서대로 뜸 —> 가장 상단의 것을 pick
, 나머진 s로
바꿈 —> **commit 메시지는 그대로 두기 —> :wq
—> 다음 에디터 화면으로 전환 —> 최종 commit message 설정 —> :wq
—> git log
—> 최근 commit이 하나로 대체됨을 확인할 수 있다.
2~3개의 commit 당 rebase 1회 —> 그래야 conflict 처리가 편리해진다.
‘Git push origin branch -f’
로 강제 push해야 pull request가 이뤄짐
충돌 해결하기
git add .
—> git rebase --continue
—> 멈춰 있던 리베이스가 진행된다. —> 또 conflict 발생 —> 다시 충돌 해결 후 conintue 반복 —> 계속 해결이 안되면 git rebase --abort
로 rebase를 진행하기 전 상태로 돌아갈 수 있다. git 저장소(Local repository)를 만드는 방법엔 두 가지가 있다. 첫 번째는 위에서 언급했던 git init
명령어로 본인 컴퓨터의 기존 프로젝트나 디렉터리를 저장소로 만드는 방법이다. 두 번째는 다른 서버에 있는 git 저장소를 본인의 컴퓨터로 clone하는 방법이다. 두 번째 방법은 주로 공동 프로젝트에 참여하여 협업이 필요한 경우 사용된다.
clone 방법
git clone URL
clone 이후 전용 branch 생성하여 작업하기
복제된 프로젝트 폴더 안에 전용 branch 생성: git branch feature/본인 이름
feature/현재 작업하는 기능명
으로 branch 이름을 짓는다.branch 확인: git branch
전용 branch로 이동: git checkout branch 이름
본인의 작업물이 저장될 폴더 생성: mkdir 폴더명
개인 작업 폴더로 이동 후 프로젝트 폴더 생성: ex) django-admin startproject project_westagram
이후 실행한 작업 이력을 add
--> commit
--> log 확인
--> push
해주면 된다.
remote repository 페이지로 이동 후, Compare & pull reqeust 클릭
제목 및 내용 작성
git pull origin [내려받을 branch 이름]
: origin(원격 저장소 주소)의 내용을 사용자의 로컬 branch로 내려받음
git merge [병합할 branch 이름]
: 현재 사용 중인 branch(개인 작업 branch)로 병합할 branch(main)의 내용을 가져옴
pull하는 과정에서 충돌이 발생하는 경우
git stash
: commit되지 않은 채 남아있는 이력들을 백업하는 명령
Git stash list
: 백업해둔 이력들의 목록을 확인하는 명령
git stash drop [stash 이름]
: 백업해둔 이력 목록 삭제 명령
git clean -f
: 추적되지 않은(unstage) 파일을 삭제. 해당 명령어를 사용하면 삭제된 파일을 복원할 수 없기 때문에 심사숙고해서 사용해야 한다.git clean -d -n
: git clean
명령으로 삭제될 대상을 미리 확인하는 명령어git rebase
를 사용하려면 vim과 같은 텍스트 편집기(editor)를 git과 연결해줘야 한다. 간혹 연결이 돼있지 않거나, 연결은 됐지만 editor의 이미지를 찾지 못해 error가 발생하곤 하는데, 이 경우 git의 기본 editor를 다시 연결해줘야 한다.
실제로 git rebase
를 실행하려다가 아래와 같은 버그가 발생했다.
hint: Waiting for your editor to close the file... dyld: Library not loaded: /System/Library/Perl/5.28/darwin-thread-multi-2level/CORE/libperl.dylib
Referenced from: /opt/homebrew/Cellar/macvim/8.2-170/MacVim.app/Contents/MacOS/Vim
Reason: image not found
error: vi died of signal 6
error: There was a problem with the editor 'vi'.
해결 방법은 간단하다. 명령어를 통해 git의 기본 편집기를 재설정하도록 하자.
git config --global core.editor /opt/homebrew/bin/nvim