Git과 github
Git & github
Git은 소스코드의 버전을 관리하는
버전 컨트롤 시스템(Version Control System)
Github은 git 을 관리할 수 있는 중앙 시스템이며, 개발자 간의 협업 시에 사용되는 repository(저장소)를 제공해주는 중앙 서버 역할을 한다.
즉, git 은 개개인의 로컬 pc내 소스 코드를 추적하는 시스템이며 github은 그러한 소스 코드들이 모여 있는 곳이라고 생각할 수 있다.
github에 있는 코드를(remote 환경) git clone 을 통해서 local 로 복제할 수 있다. 최초에 소스를 받을 때만 사용한다.
로컬에서 작성한 코드는 다시 중앙 서버로 보낼 수 있다. 이것을 push 라고 한다. 하지만 push에 앞서 세 가지 단계를 거친다.
- modified
- staged
- committed
Modified 단계는 로컬에서 수정이 일어난 단계이다. 최초 코드를 수정하고 나면 modified 단계가 된다.
Staged 단계는 중간 save 단계로 곧 commit 될 것이라고 마크된 상태이다. 추가 수정사항이 있거나 잘못된 부분이 있는 경우 되돌리기 위한 임시 저장 상태이다. git add
를 통해서 staged 단계로 만들 수 있다.
마지막으로 committed 는 commit이 된 상태이다. 즉, 수정 사항이 git에 저장된 상태라고 볼 수 있다. git commit -m "설명"
방식으로 commit 할 수 있다. Commit 까지 완료되면 push 작업을 통해 github(중앙 서버)에 밀어 넣는다.
문제가 없다면, push 후에 github에서 pull request 한다. 이는 수정된 소스를 master 에 merge 해줄 것을 요청하는 것을 말한다.
이미지 출처
Master & branch
대부분의 경우, 완성된 결과가 있는 저장공간과 작업을 진행 중인 저장공간을 분리한다. 전자는 master branch(보통 master라고 함) 이고, 후자는 branch라고 한다. Branch 명은 일반적으로 feature/이름
방식으로 작성한다. Branch에서 작업이 완료되면 다시 add, commit, push 단계를 통해 github으로 올리고 pull request, merge 의 순서로 진행된다.
한 번 사용한 branch는 재사용하지 않고 또다른 작업을 위한 branch를 새로 생성하는 것이 좋다.
Process
git과 github을 활용한 프로세스는 다음과 같이 진행된다.
- local working directory를 생성한다.(mkdir)
- 해당 directory로 이동하여 git init 으로 local repo를 생성한다.(ls -a 로 .git 생성 확인)
- git clone 하여 최초 remote repo 에 있는 파일을 로컬로 가져온다.
- git branch 로 branch 를 생성한다.
- git checkout branch명 으로 해당 branch로 이동한다.
- 파일을 수정한다.
- git add 를 통해 staged 상태로 전환한다.
- 더 이상의 수정 사항이 없는 경우 git commit 을 통해서 committed 상태로 전환한다.
- git push를 통해 remote repo로 수정 파일을 보낸다.
- pull request를 통해 merge를 요청한다.
위와 같이 순조롭게만 진행되면 좋겠지만, 내가 작업을 하는 사이에 master가 변경된 경우 conflict 가 발생할 수 있다. 이런 경우에는 다시 pull origin master 를 통해 파일을 로컬로 가져와서 HEAD(내가 만든 부분)와 MASTER 간의 차이를 조정하면 된다.
이 때, local master에서 pull origin master를 해야 한다. 그리고 다시 내 local branch로 이동한 뒤, git merge master 를 통해서 local master의 파일을 local branch로 merge하여 최신화 한 후에 수정한다.
Git 명령어
- git init : 최초 git local repo 생성
- git clone : remote 환경의 소스를 복제(최초) / 자동으로 remote repo 를 origin 이라는 이름으로 저장한다.
- git config user.name : username 설정
- git config user.email : email 설정
- git branch : branch 생성
- git checkout : branch 간 이동
- git add : staged 상태로 전환
- git commit -m "설명" : committed 상태로 전환
- git push origin branch_name(local) : remote 환경으로 push
- git pull origin master : remote master 에서 소스 복제
- git merge master : local master 소스를 branch로 최신화
- git log : commit log 확인
- git rm : git에 등록된 파일 삭제
- git diff : modifed 상태에서 수정사항 확인
- git status : 상태 확인 (modified or staged)
- git mv : git 에서 파일 이동 혹은 rename에 사용
- tig(plug-in) : git 히스토리 확인 가능
- git log --pretty=oneline : 로그 한줄로
- git show {commit_id} : 해당 commit 상세 변경사항
- git remote add origin {url} : origin 이라는 이름으로 remote repo 추가
- git fetch : pull 하면 merge 까지 하게 되는데 단순히 코드만 가져오고 싶은 경우 사용
- git blame {file_name} : 특정 파일, 특정 코드 작성자가 누구인지 확인
- git revert {commit_id} : commit 을 취소하고 다시 commit
- git revert {commit_id}...{commit_id} : 앞 commit_id 는 초과 개념임(초과,이하)
- git reflog : HEAD 가 가리키는 commit 의 history 를 보여줌. commit history 를 모른채 reset(--hard) 한 경우, 이를 되돌리고 싶을 때 참조
- reference log 줄임말임
- git reset 을 한다고 해서 commit 이 전부 사라지는 것은 아님
- git rebase {branch_name} : git merge 와 결과는 같지만 merge commit 이 생기지 않음
- conflict 발생하면 해결 후에
git rebase --continue
실행
- git stash : working directory 내용들을 임시로 스택에 저장하고 최근 commit 기준으로 초기화
- git stash list : 임시 저장된 작업 리스트 확인
- git stash apply : 스택에서 임시 저장된 내용을 working directory 로 다시 가져옴
- git stash apply stash@{n} : 가장 최근 작업이 아닌 특정 작업을 불러오고 싶은 경우 사용
- git stash drop stash@{n} : 스택에서 작업내용 삭제
- 잘못된 브랜치에서 작업한 경우, 해당 내용을 stash로 저장하고 올바른 브랜치로 이동해서 apply 하면 된다.
- git stash pop : 최근 작업내용을 불러오는 동시에 스택에서 삭제함
- git stash pop stash@{n} : 특정 작업내용을 불러오면서 스택에서 삭제함
- git cherry-pick {commit_id} : 특정 commit 만 가져와서 merge 하고 싶은 경우
Tips
git log --pretty=oneline --all --graph : 로그를 보기 좋게 그래프 형식으로 표현
git add 후에 다시 unmodified 로 돌아가고 싶을 때(git add 취소)
최신 커밋을 수정하고 싶은 경우
- 우선 수정을 한다.
- git add . && commit --amend : 최근 커밋을 업데이트 함
commit 을 한다고 staging area 파일이 지워지는 것은 아니다.
git cli alias
- git config alias.history 'log --pretty=oneline'
- git history = git log --pretty=oneline
HEAD : HEAD는 branch를 통해서 commit 을 바라보기 때문에 brach를 이동하면 결국엔 HEAD 가 이동하는 것으로 볼 수 있음
- git reset --hard {commit_id} : 해당 commit 기준으로 이동
- git reset --hard HEAD^ (현재 HEAD의 바로 이전 commit)
- git reset --hard HEAD~n (현재 HEAD의 n단계 전 commit)
- 반드시 과거 commit 으로만 이동할 수 있는 것은 아니며 이후 commit 으로도 이동할 수 있다.
- git checkout {commit_id} : HEAD 가 직접 commit 을 가리키게 함. 보통 특정 시점에 새로 branch 를 만들기 위해서 사용 (Detached HEAD 상태)
- 이후에 git branch {branch_name}
- git checkout {branch_name}
하게 되면 아래와 같이 된다.
Tag
- git tag {tag_name} {commit_id}
- git show {tag_name}
Branch
- git branch -d {branch_name}
- git checkout -b {branch_name} : 만들고 동시에 이동
- git merge --abort : merge 취소
일반적으로 push 할때,
git push origin master
= git push origin master:master
origin
: remote repo name
master:master
: local master brach/remote master branch
git push -u origin master
-u
: --set-upstream 약자
- 자동으로 remote mater branch 를 추적하는 tracking connection
- master branch 가 없으면 새로 생성하고 push
- 한 번 설정되면 그 다음부터는 local master branch 에 위치해 있을 때
git push
/git pull
만 해도 됨