본문 바로가기

Web Programming/Web PR

Git 메모장

1. 버전 관리 기본


$ git log # 깃 기록 보기
$ git diff # 최신 버전의 깃과 최근 차이 보기
$ git commit -amend # 가장 최근 커밋 메시지 수정
$ git checkout -- file # file 파일을 가장 최신 버전으로 되돌리기
$ git reset HEAD file # file 스테이징 취소
$ git reset HEAD^ # 가장 최근 커밋 취소(--soft 커밋전, --mixed 커밋스테이징 전, --hard 파일 수정전)
$ git reset 커밋해시 # 특정 버전으로 되돌리기
$ git revert 커밋해시 # 커밋 로그 삭제 없이 되돌리기(이력 쌓기)


2. 버전 관리 branch


$ git branch 이름 # 깃 브랜치 만들기
$ git checkout 이름 # 깃 브랜치 전환
$ git log --oneline --branches --graph # 각 브랜치의 커밋 그래프로 함께 보기
$ git log master..이름 # mater 브랜치와 이름 브랜치 차이점 보기
$ git merge 이름 # 깃 브랜치 병합
$ git branch -d 이름 # 깃 브랜치 삭제
$ git stash # commit 보류하기(status로 확인)
$ git stash list # 보류한 내용들 확인
$ git stash pop # 보류한 내용들 다시 불러오기


3. 깃헙 원격 저장소 관리



$ git remote add origin 저장소 주소 # 원격 저장소 추가
$ git remote -v # 원격 저장소 확인
$ git push origin master # master 브랜치를 origin에 push
$ git pull origin master # origin 저장소를 master 브랜치로 pull
$ ssh-keygen # 키젠 생성



4. 깃헙 협업 관리


$ git clone 주소 저장dir # 주소로부터 원격저장소를 가져와 dir에 저장
$ git fetch # 원격 저장소로부터 커밋 가져옴(FETCH_HEAD 브랜치로 가져옴)
$ git checkout FETCH_HEAD # FETCH_HEAD 로 체크아웃
$ git merge FETCH_HEAD # 확인 후 깃 merge
$ git checkout -b 이름 # 이름 브랜치를 만들고 checkout 까지 바로 수행
$ git push origin 이름 # 이름 브랜치를 origin 원격 저장소에 push
(pull request 통해서 내용 확인 및 원격 저장소에 merge 진행)


5. 마크다운 참고

링크

 

마크다운(Markdown) 사용법

마크다운(Markdown) 사용법. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com


6. 태그 Tag

 

1) light weight tag

$ git tag 태그명 커밋ID(또는 브랜치 등) # 태그 생성
$ git tag # 태그명 확인
$ git checkout 태그명 # 태그명으로 체크아웃
$ git tag -d 태그명 # 태그 삭제


2) annotated tag

$ git tag -a 태그명 -m "bug fix" 커밋ID(또는 브랜치)
$ git tag -v 태그명 # 정보 확인
$ git remote add origin 저장소 이름 # 원격 저장소 추가
$ git push -u origin master # 원격 저장소 push
$ git push --tags # 원격 저장소에 태그 푸시

git tag -v 태그명

 

3) 원리

.git/ref/tags 안에 파일이 작성되고 해당 파일은 커밋 정보를 기록한다.

그래서 해당 파일을 통해 태그 정보를 관리하게 된다.

지명 태그는 추가적인 정보까지 함께 담아서 관리한다.


7. 리베이스 Rebase 

 

1) merge vs rebase

base 두 브랜치가 공통적으로 가지고 있는 버전
$ git checkout feature
$ git merge master
$ git rebase master

rebase는 기존 feature의 최신 커밋들을 temp 저장소에 저장 후 삭제
그리고 feature의 base를 다시 master로 옮긴 후 

temp 저장소에 있는 feature 최신 커밋들과 병합을 하게 됨


둘다 master와 feature 작업 결과물을 가지고 있다
차이점은 rebase는 일렬로 히스토리 기록(merge는 병렬로 기록)
이에 따라서 rebase는 관리가 어렵고 위험하므로 merge를 선호

2) rebase 실습

 

git log --decorate --all --oneline --graph 

현재, master 브랜치와 rb 브랜치를 두 개 만들어서 두 개의 커밋이 이어져가고 있다 가정.

그 상황에서 rebase를 통해서 합치려고 하는 상황.

 

상황



git checkout rb 후

git rebase master를 통해서 합치려고 하면 아래와 같이 confilct 발생(같은 파일 수정)

충돌 상황 만들어보기

충돌상황 해결을 위해 conflict 파일에 가서 내용을 수정 후 git add

그리고 git status를 통해서 현재 상황을 파악한다.

명령어 수행(git rebase --continue)

 

충돌상황 해결 후 rebase 성공

다시 checkout master 가서 git merge를 통해 브랜치 합치기(fast forward) 

master 브랜치로가서 merge
최종 rebase 결과


gitflow 실습



1) 초기 구성 시나리오

$ git remote add origin 원격저장소
파일 수정
$ git add 파일
$ git commit -am "master 1"
$ git branch -b develop
파일 수정
$ git commit -am "develop 2"

2) 기능 개발 시나리오

 

$ git branch -b feature-some # 기능개발
파일 수정
$ git commit -am "feature-some 3"
작업 완료
$ git checkout develop # develop 브랜치 이동
$ git merge feature-some # 병합
$ git branch -d feature-some # 기존 브랜치 삭제


3) 배포 시나리오

 

$ git branch -b release-1.0 # 배포브랜치
파일 수정
$ git commit -am "release-1.0 4"
작업 완료
$ git checkout master # master 브랜치 병합
$ git merge release-1.0
$ git tag -a 1.0 -m "first release" master # 태그 생성
$ git checkout develop # develop 브랜치 병합
$ git merge release-1.0


4) 핫픽스 시나리오

 

 

$ git checkout -b hotfix-some # 핫픽스 브랜치
파일 수정
$ git commit -am "hotfix-some 5"
$ git checkout master # master 브랜치 병합
$ git merge hotfix-some
$ git tag -a 1.1 -m "hotfix-some" master # 태그 생성
$ git checkout develop # develop 브랜치 병합
$ git merge hotfix-some



전체 결과

 

깃플로우 공부