Git 21.03.13
in Dev on Java Script
- git : 버전 관리 시스템
- github : 버전 관리 시스템 관리 플랫폼
Git Work Flow
working directory : 작업 폴더 (.git이 있는 폴더)
staging area : repo에 commit 전에, 반드시 거쳐야만 하는 중간단계. (일부부만 commit하거나 충돌을 해결해줄 떄 용이하다.)
local repositoty : 로컬(오프라인) 저장소
remote repository : 온라인 저장소
branch : 브랜치란 독립적으로 어떤 작업을 진행하기 위한 개념. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있습니다.
master branch: repo를 처음 만들면, Git은 바로 ‘master’라는 이름의 브랜치를 만든다. 이 새로운 저장소에 새로운 파일을 추가 한다거나 추가한 파일의 내용을 변경하여 그 내용을 저장(커밋, Commit)하는 것은 모두 ‘master’ 라는 이름의 브랜치를 통해 처리할 수 있다. ‘master’가 아닌 또 다른 새로운 브랜치를 만들어서 checkout해야 다른 branch에서 작업 할 수 있다.
https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html
fork : 다른 사람의 Github repository에서 어떤 부분을 수정하거나 추가 기능을 넣고 싶을 때 해당 respository를 내 Github repository로 그대로 복제하는 기능. fork한 저장소는 원본(다른 사람의 github repository)와 연결되어 있다. 여기서 연결 되어 있다는 의미는 original repository에 어떤 변화가 생기면(새로운 commit) 이는 그대로 forked된 repository로 반영할 수 있다. 이 때 fetch나 rebase의 과정이 필요하다. 그 후 original repository에 변경 사항을 적용하고 싶으면 해당 저장소에 pull request를 해야한다. pull request가 original repository의 관리자로 부터 승인 되었으면 내가 만든 코드가 commit, merge되어 original 에 반영된다. pull request 하기 전까지는 내 github에 있는 forked repository에만 change가 적용된다.
clone : 특정 repository를 내 local computer에 복사하여 새로운 repo를 만든다. clone한 원본 repository를 remote 저장소 origin으로 가지고 있다. 권한이 없는 경우 해당 저장소로 push 하지 못한다.
remote repository에서 origin과 upstream의 차이점 :
upstream과 downstream은 두 레포간의 관계에 따라 정의되는 상대적인 개념이다. 어떤 한 레포가 절대적으로 업스트림이거나 다운스트림이 아니다. 나의 repo가 myRepo이고 다른 레포가 otherRepo라 하자. 내가 otherRepo로부터 pull from 해오고(당겨오고) push to한다면 내 myRepo가 downstream, otherRepo가 upstream으로 정의된다.
otherRepository(upstream) -> (fork) myRepository(origin)
otherRepository(upstream) -> (git pull) myRepository(local)
myRepository(origin) -> (git pull) myRepository(local)
Orgin과 Upstream의 차이는 깃허브 fork 맥락에서 이해되어야 한다. 내가 다른 사람의 repo를 fork 해왔을 때에 upstream은 일반적으로 오리지널 레포(다른 사람의 레포)를 의미한다. 즉 내가 OtherRepo를 fork해왔다고 할 때에 이 OtherRepo가 오리지널 레포이고 upstream은 이를 지칭하는 것이다.
한편 origin은 내 fork를 의미한다. repo를 clone 할 때에 디폴트 리모트는 origin이라고 불린다. 그러니까 내 포크를 myRepo라고 할 때, 클론하면 이것이 내 레포가 origin이 된다. 내가 오리지널 레포의 변화를 추적하고 싶으면 upstream이라는 이름의 리모트를 추가해야 한다. 내 레포(포크)에 컨트리뷰트하려면 pull과 push로 하면 되고, 오리지널 레포(업스트림)에 컨트리뷰트하려면 pull request를 날리면 된다.
버전 관리 Git Command
- init : git repository 생성(현재 디렉토리를 기준)
$ git init
- status : git을 통해 관리하고 있는 디렉토리의 status(커밋 목록 등) 확인
$ git status
- config : 환경설정
git config --list
- add : working directory의 수정 사항을 staging area로 올리는 명령어
수정된 모든 파일 추가
$ git add .
수정 된 파일 선택해서 추가
$ git add [파일명]
- commit : staging area에 있는 수정 사항을 local repository로 보내는 명령어 commit 시에 메시지를 적어야하는 이유 : 협업을 위한 변경 사항 기록 및 추적.
$ git commit -m '커밋 메시지'
마지막 commit 메시지 수정하기
$ git commit --ammend
- 커밋 목록 확인
$ git log
commit 내용 한줄로 확인
$ git log --oneline
- rest : commit ID값(git log를 통해 확인)을 통해 해당하는 버전으로 리셋하는 명령어 (선택된 버전 이후의 commit 버전은 모두 삭제)
git reset --hard [커밋 ID]
- revert : 선택한 commit 버전의 전 버전으로 되돌리는 명렁어 (revert는 선택한 버전의 이전 버전을 복사해서 새로운 커밋 버전으로 생성)
git revert [커밋 ID]
Branch
- branch : 브랜치 목록을 확인하는 명령어 기본은 master 브랜치 위에서 작업을 하게된다.
// branch 목록 보기
$ git branch
// branch 생성
$ git branch [생성할 branch 이름]
- checkout : 해당 브랜치 또는 commit으로 이동
repo를 생성하면 기본적으로 HEAD가 만들어지고 기본적으로 master branch를 가리킨다. checkout은 HEAD의 값을 바꾸는 기능이다. 만약 checkout 명령어를 통해 브랜치가 아닌 commit ID값을 입력하면 브랜치로부터 떨어져있다는 detacted 되있다고 한다.
// HEAD 브랜치 이동
$ git checkout [branch 이름]
// commit 값으로 이동(detacted)
$ git checkout [commit ID값]
- merge : 브랜치를 병합하기 위한 명령어 병합을 하기 위해서 우선 master branch 상태가 되어야 한다.
// 병합하기전 master branch 이여야 한다.
$ git checkout master
$ git merge [병합할 branch 이름]
충돌(conflict)
같은 라인에서 각각의 수정이 있는 파일을 merge하였을 경우 Conflict 발생.
'<<<<<' 에서 '=====' 사이의 내용은 HEAD, 즉 현재 브랜치의 내용을 나타내고,
'=====' 에서 '>>>>>' 사이의 내용은 다른 브랜치의 내용을 나타낸다.
git은 같은 라인에서 브런치 각각의 수정을 자동으로 병합할 수 없으므로 사용자에게 보기를 주고 선택하도록 하는 것이다.
Back up
- remote : Local Repository의 파일을 Remote Repository와 연결하는 명령어
// origin은 원격저장소 별칭으로 origin을 기본으로 한다.
$ git remote origin [원격저장소에 생성한 주소 URL]
// 연결된 원격 저장소 확인
$ git remote -v
- clone : Remote Repository의 파일을 복제해서 Local Repository에 저장하는 만드는 명령어 원격저장소의 이름을 딴 폴더가 생성되고 폴더 안에서 프로젝트가 git을 통해 관리된다.
git clone [remotoe repo에 생성한 주소 URL]
- push : Local Repository에 존재하는 commit된 파일들을 Remote Repository에 밀어넣는(업로드) 명령어
$ git push
- pull : Remote Repository의 파일을 Local Repository에 당겨오는 명령어 (git fetch와 git merge를 합친 것)
$ git pull
collaboration
- fetch : remote repo만 업데이트하는 명령어. merge 명령어를 통해 업데이트 된 파일과 병합해야 한다. 신중하게 파일을 pull하고 싶을때 사용. (즉, pull = fetch + merge)
$ git fetch
// 가장 최신의 커밋을 병합해주는 명령어
$ git merge FETCH_HEAD
Open Source Contribute Process
기여할 오픈 소스 Github repo에서 내 repo로 Fork
Git clone으로 local repo로 다운로드
local repo에서 코드 수정
add, commit, push (local repo에서 remote repo(fork에서 내 repo로 가져온 repo)로 push)
원본 remote repo에 pull request
fork 해온 원본 remote repository 관리자가 승인하면 적용