GIT 도 리눅스처럼 POSIX CLI 사용가능함
# 깃 목적
- 버전관리(update history+comments) : commit/log/diff/checkout/reset(revert)
- 백업 : remote/push/pull/clone
- 협업 : branch/checkout/merge/mergetool
# 종류
- (original) git-scm
- (simple) github
- (windows) totoisegit
- (Complex) sourcetree
# GIT - POSIX CLI
## POSIX CLI : 리눅스 커맨드 기초 명령어
CLI 종류
- POSIX (Portable Operating System interface)
: UNIX series computer control standard - unix, linux, macOS
- non POSIX
: CMD, Powershell - Window, IOS, Android
--> Emulator : Window - git bash, Androiod - termux, hacker's terminal
--> Secure shell (POSIX server)
파일(+프로그램)과 디렉토리에 대한 CRUD
```
pwd print working directory
ls
cd / root directory -- 절대경로 이동 $ /User/benkim/posix
cd ./ current directory -- 상대경로 이동 $ ./posix
cd ../ parent directory
cd ~ home directory
rm -r delete directory
mv a b move(rename) file name
```
CLI의 활용
- 순차작업 실행하기
```
# 독립실행
mkdir dummy; cd dummy; touch hello.txt;cd ..;ls -R
# 성공조건부 실행
mkdir dummy&&cd dummy&&touch hello.txt&&cd ..&&ls -R
```
깃 명령어 요약정리
- https://seamless.tistory.com/43
## VERSION CONTROL ; 과거비교
### 깃 초기화
```
cd hello-git-cli # rm -rf .git
git init .
cd .git # version info manager
```
### 파일 상태
1. Work space : working tree ; 작업 디렉토리
```
$ git status
# untrackedfiles = 기존의 버전관리 대상이 아닌 파일
```
2. Stage : staging area ; 버전관리대상(수정파일) 지정 디렉토리
```
$ git add hello.txt
$ git add . # 현재 디렉토리 내 모든 파일
$ git add src # src디렉토리 내 모든 파일
```
3. Repository : versioning area ; 버전(수정사항 반영완료) 디렉토리
```
$ git commit -m "message1" # 버전을 생성commit하다.
$ git commit -am "untracted file은 추적되지 않아서 최초 1회는 따로 add해야 함"
$ git commit --amend # 메세지 수정하기
# git commit시 editor 변경 tip
$ git config --global core.editor "nano" #"vim" 또는 에디터경로
```
### 버전 상태 점검/확인
- repo 버전 확인하기 ; 신규버전 생성 생길 때마다 출력됨.***+HEAD이동할때도 로그 출력
```
$ git log # 버전 로그
$ git log --stat # 버전별 여러 파일의 수정내용 확인
```
- Working tree내 수정사항 점검
```
$ git diff # 최신 버전 대비 working tree 수정내용(차이점) 확인; 파일단위
$ git log -p # 버전별 여러 파일의 수정내용(차이점) 확인
(예습)
$ git reset --hard # 최신 버전으로 되돌리기 / 차이점 보고 잘못되면, 원래 버전으로 복구
```
- 과거의 특정 버전의 코드 리뷰하기 ; HEAD이동(repository)
```
$ git checkout version_hashnumber # 과거 버전으로 이동-탐색가능
$ git checkout master # 최신 버전으로 이동
```
### 버전 삭제/복원
- 원하는 버전으로 복원하기
```
$ git reset --hard version_hash # 모든 코드를 version_hash으로 복원
$ git reset --mixed version_hash #
$ git reset --soft version_hash # 수정된 코드 남겨놓고 version_hash으로 복원
--soft
Does not touch the index file or the working tree at all (but
resets the head to <commit>, just like all modes do). This
leaves all your changed files "Changes to be committed", as git
status would put it.
--hard
Resets the index and working tree. Any changes to tracked files
in the working tree since <commit> are discarded
```
- 직전 단계의 버전으로 복원하기 ; (역순으로) 최신버전부터 원하시는 버전까지 revert를 반복한다!
```
$ git revert version_hashnumber
```
### 버전관리시 주의사항
- diff tool을 활용하여 차이점 확인하라.
- 버전관리 대상이 아닌 파일을 제외하라(임시파일, 개인메모) : .gitignore
- 저장소를 복제하지 말고, branch을 사용하여 다양한 작업이 가능하다.
- 버전 식별자로 commit아이디 말고 tag를 활용하라.
- git 이외에 Dropbox, gdrive, onedrive을 활용할 수도 있다.
## BACK-UP
### 백업에 필요한 구성요소
- 나의 컴퓨터(지역저장소)
- 회사의 컴퓨터(원격저장소) : 백업용 컴퓨터
### 백업 주요 용어
- 백업(push) : 지역저장소 --> 원격저장소
- 복원(pull) : 원격저장소 --> 지역저장소
- 복제(clone) : 원격저장소 --> 제3의 지역저장소
### 원격 저장소 제공 업체
- 깃 원격 저장소를 임대하기 (git hosting) : 임대 제공자
- 예 : github, gitLab.com(비공개 무제한 제공), source
- 원격 통신 방법 : http, ssh
### 주요 사용법
- 원격 저장소 연결
```
$ cd 지역저장소
$ git remote add origin https-address # 지역저장소 이름지정 + 지역저장소에 데이터 내려받기
# $ git remote set-url origin https://USERNAME@git-address
$ git remote -v # 원격저장소 이름 확인
```
- 업로드 / 백업 push
```
# 푸쉬 초기화 세팅 : origin에서 master로
$ git push --set-upstream origin master
> password, username입력
# 이후에는 아래같이 입력만 해도 됨.
$ git push
```
- 다운로드 ( 복제 clone, 수정부분 반영 pull )
```
$ cd git
$ git clone remote-git-address # ~/git/clone_repo
$ git clone remote-git-address mydirectory # ~/git/mydirectory/clone_repo
```
```
$ git pull
```
### 백업/버전관리시 추천사항
- ssh 자동로그인
- issue tracker : to-do list로 issue tracker를 사용하라.
- repository 안에 repo 들어가있으면 안됨.
## BRANCH-CONFLICT ; Collaborative
: 정보 유실 방지
### 브랜치 정의
등장배경 / 기존 문제점
1. 고객사마다 사용기능을 다르게 만들어야 한다면 어떻게 버전관리 할 것인가?
2. 다른 고객사의 기능을 재활용하고 싶다면 어떻게 할 것인가?
3. (충돌) 같은 파일, 다른 수정내용에 대한 파일 병합
주요용어
1. BASE : 부모 노드
2. BRANCH : 분기 노드
3. MERGE COMMIT : 병합
### 브랜치 기본 사용법
- 브랜치 상태 확인하기
```
$ git log --all --graph --oneline # all branch with a line of graph shape
```
- 복제하지 않고 같은 내용을 사용하기
```
# 생성하고 목록보기
$ git branch group_func # create new branch
$ git branch # list
# 브랜치 이동하기 -working copy변동함
$ git commit -am "adding a new line"
$ git checkout group_func
```
### 브랜치 병합 사용법 ; 2개씩 병합
- 파일명이 다른 경우, 브랜치 자동병합
```
$ git branch o2
$ nano master.txt
$ git add . && git commit -am "master work2"
$ git checkout o2
$ nano o2.txt
$ git add . %% git commit -am "o2 work2"
# 현재 브랜치로 병합
$ git checkout master
$ git merge o2 # **git merge + branch_name
# 복구
$ git reset --hard 52396a2b1 # **git reset --hard + version_hash_number
```
- 같은 파일명, 다른 부분 병합
```
$ nano work.txt
$ git branch o2 # 같은 버전을 공유해야 하므로 미리 생성해야 함?
$ nano work.txt
$ git commit -am "master work2"
$ git checkout o2
$ nano work.txt
$ git add . && git commit -m "o2 work2"
$ git checkout master
$ git merge o2 # 현재 브랜치로 병합
```
- 같은 파일명, 같은 부분 병합 -> 충돌!
```
$ git checkout master
$ git merge o2 # 현재 브랜치로 병합시, 충돌발생!
$ git status
both modified
$ nano work.txt
head위치(master)에서의 수정된 내용 ====== branch위치(o2)에서의 수정된 내용
">>>"와 "<<<" 그리고 "===" 부분을 삭제하고, 충돌된 코드부분을 수정/저장하라.
(master)$ git status
(master)$ git add . && git commit
최종 병합 완료!
```
- 더 다양한 병합 방법들 ; 3개씩 병합 (3way merge)
- 자동병합기능이 있다.
예) base(원본) : a / branch1 : a / branch2 : b --> merge : b (**수정!**)
예) base(원본) : a / branch1 : c / branch2 : b --> merge : **conflict !**
- 외부도구를 사용해야 한다.
예) p4merge
```
$ git checkout -b master branch1 branch2
$ nano work.txt
$ git checkout branch1
$ nano work.txt
$ git checkout branch2
$ nano work.txt
# 병합전문도구 - p4merge 다운로드하기
# mac / linux - p4merge git config 검색
git config --global merge.tool.p4mergetool.cmd + 경로정보
cat ~/.gitconfig
git mergetool
# tool로 충돌해결
~~~~~~
# 결과 확인 ; orig는 원본파일
git status
```
### 기타
코드 파일(명령어) ; 프로그램
컴퓨터 자동화 도구 ; 쉘 스크립트
프로그램의 다른 이름 ; 패키지
패키지(프로그램)를 관리하는 도구 ; 패키지 매니저 - apt-get, yum, homebrew,
컴퓨터의 기본요소 - 저장/처리
네트워크 설정/관리 도구
### 고급
- git flow ; (깃 워크플로우) 깃 모범 사용 규칙을 돕는 프로그램
- Cherry-pick : 부분 병합 (브랜지 버전 선택적 병합)
- Rebase : sequantial 병합
##- checkout / reset 활용원리 ; 어떤 데이터를 볼지가 핵심
- checkout : head 제어 ; change
- HEAD >>> master
- HEAD >>> VERSION_NUMBER ( detached = no branch )
- reset : branch 제어 ; delete
- reset BRANCH (브랜치가 바라보는 버전)
- reset VERSION_NUMBER (과거의 버전 선택 ; 이후 버전 삭제)
'Developing.. > POSIX:Linux' 카테고리의 다른 글
GIL - POSIX THREAD (0) | 2020.12.30 |
---|---|
3. Basics - OS로써 LINUX (사용자/네트워크) (0) | 2020.12.07 |
4. LINUX CLI - 파일검색 / 텍스트 처리 (0) | 2020.12.07 |
2. Basics - OS로써 LINUX 구조 (0) | 2020.12.07 |
1. Basics - 리눅스 기본 (0) | 2020.12.07 |