본문 바로가기
Developing../POSIX:Linux

GIT - POSIX CLI

by bents 2020. 12. 7.

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 (과거의 버전 선택 ; 이후 버전 삭제)