GIT

https://opentutorials.org/course/2708

https://backlog.com/git-tutorial/kr/

https://rogerdudler.github.io/git-guide/index.ko.html

https://git-scm.com/book/ko/v2

[버전관리의 본질] - 모든 버전관리의 공통적인 기능

  • Version Control System (CVS, SVN, GIT, Dropbox, Google Drive)
  • repository 생성 :  git init
  • 관리 대상 파일 등록 : git add f1.txt
  • 프로젝트 폴더 상태 확인 : git status
  • 이름 세팅
    • git config --global user.name ddeepnet
    • git config --global user.email email@address.com
  • 버전 만들기 (commit)
    • 버전이란 의미있는 변화
    • git commit 입력
    • 자동으로 vim으로 들어가지는데, 여기 입력으로 버전 정봉에 대해 서술
    • git log : 버전 정보에 대해서 볼 수 있음
  • Stage area
    • 이후 파일을 다시 변경 후 git status 하면 modified 라고 뜸
    • 수정된 파일을 다시 버전 관리시스템에 add 해줘야 함
    • 즉, 이미 버전 관리가 되고 있던 파일을 다시 수정해서 버전을 수정 할 때도 add를 해줘야 함
    • git이 add를 하는 이유는, 여러 파일 중 commit 하기 원하는 파일만 하기 위해
    • git commit 시, add된 파일의 변화만 버전에 포함됨
    • 즉, stage area는 commit 대기 상태
  • 변경사항 확인하기
    • git log
    • git log -p : 버전 간의 차이점을 출력
    • git diff '버전 id'..'버전id2' : 버전 간의 차이점을 비교 할 때 (사이에 '..' 입력)
    • git diff : git add 하기 전과 add 한 후의 파일 내용을 비교 할 때, commit을 하기 전에, 자기 작업 내용을 마지막으로 리뷰 할 수 있는 기회를 제공
  • 과거의 버전으로 돌아가기
    • 버전ID로 돌아가기 : git reset --hard "버전id"
    • 버전ID의 커밋을 취소한 내용을 새로운 버전으로 만드는 명령 : git revert "버전ID"
    • 과거로 돌아가는 것은 아주 위험한 작업이니 주의
    • 돌아가더라도 그 이후 커밋이 사라지는 것이 아니라 복구 할 수 있으나 그러려면 git의 원리를 알아야함
    • 원격저장소에 공유를 한 후에는 절대로 reset을 하면 안됨. 오직 로컬에서만 reset 작업이 가능
  • 명령의 빈도와 메뉴얼 보는 방법
    • git add --help, git commit --help ...git command --help
    • 커뮤니티 질문해보기
    • 검색해보기

[Git 의 원리]

  • 파일 Add를 하면 index에 객체 주소가 생기는데, 이 주소는 파일 이름이 달라도 내용이 같으면 같은 주소를 갖는다.
  • 객체 주소는  sha-1이라는 hash를 통과해서 생긴다. 즉 같은 내용이면 모두 같은 주소가 생성됨.
  • 이 주소를 이용하여 objects라는 디렉토리 안에 경로를 만들고 그 안에 내용정보를 저장. Index에는 방금 add한 파일 이름(f1.txt)이 hash로 생성된 주소(경로)에 저장되어있다고 표시.
  • Commit 자체도 내부적으로는 객체로 저장함. 그 안에는 tree라는 값이 적혀있는데,  tree안에는  이 버전에 해당되는 파일의 이름과 내용이 링크가 되어 있음.
  • 객체(object)는 3가지, 1. blob : 파일의 내용을 담음. 2. Tree :  커밋이 일어난 시점의 작업 디렉토리에 있는 파일명과, 그 파일명이 담고 있는 내용에 해당하는 blob에 대한 정보를 갖음. 3. Commit : 이전 커밋이 누구인지 부모를 나타내는 parent값(이전 커밋이 있을 경우 생김), 커밋이 일어난 시점의 tree. 각 버전은 그 버전이 만들어진 시점의 정보를 tree를 이용한 Snapshot으로 가지고 있다.
  • Index라는 파일이 stage area 임 (cache라 불릴 때도 있음). Index파일 내의 주소값과 object의 최근 commit이 가리키는 tree정보를 비교하여, add 될 것이 있는지, add 만 되고 commit 되지 않은 것이 있는지 등의 정보를 git이 알 수 있음.

[git의 혁신]

  • 다른 버전관리시스템에 비해 Branch 기능을 쓸만하게 만듦
  • Branch 만들기
    • 기본 브랜치 : master
    • 브랜치의 목록을 볼 때 : git branch
    • 브랜치 생성 : git branch “새로운 브랜치 이름”
    • 브랜치 삭제 : git branch -d “삭제할 브랜치 이름”
    • 병합하지 않은 브랜치 강제 삭제 : git branch -D “삭제할 브랜치이름”
    • 브랜치 전환(체크아웃) : git checkout “전환하려는 브랜치 이름”
    • 브랜치를 생성하고 전환까지 할 때 : git checkout -b “생성하고 전환할 브랜치 이름”
  • Branch 정보 확인
    • 브랜치 간 비교 : git log “비교할 브랜치 명1”..”비교할 브래치 명2”
    • 로그에 모든 브랜치를 표시하고, 그래프로 표현하고, 브랜치 명을 표시하고, 한줄로 표시 하기 : git log —branches —graph —decorate —oneline
    • 브랜치 간의 코드를 비교 할 때 : git diff “비교할 브랜치 명1”..”비교할 브랜치 명2”
  • Branch merge
    • A브랜치로 B브랜치를 병합할때 (A<-B)
    • git checkout A
    • git merge B
    • Merge 할 때 한 브랜치에서만 변화가 있었으면 Fast-forward(빨리감기)를 해서 별도의 commit생성없이 같은 병합 후 commit을 가리키게 된다.
    • 만약 merge 할 때 두 브랜치에서 변화가 있었으면 Fast-forward가 아니라 3-way merge를 하는데 별도의 커밋을 생성하여 합침. 충돌이 있는 경우는 아래 참고.
  • Branch merge 시 충돌(conflict)가 일어나면
    • 다른 내용을 수정해도 다른 위치만 수정 되었다면 충돌이 일어나지 않고 자동으로 합쳐준다
    • 공통 부분에 수정이 있어서 병합에 실패하면, 에러 메시지가 뜨고 git status를 하면 충돌이 일어난 파일을 확인 할 수 있음
    • 충돌 발생 파일을 확인해보면 <<<<<<<HEAD ~ =======사이 구간이 현재 체크 아웃된 파일의 내용이고 ======== ~ >>>>>>>”병합대상브랜치명” 사이의 구간이 병합하려는 대상인 브랜치의 코드 내용. 이 정보를 참고해서 어떻게 해당 파일을 수정하여 merge에 올릴지 수정함.  위의 특수기호들을 제거하고 저장.
    • 충돌 작업이 끝났다는 것을 git에게 알려줌 : git add “충돌 파일 이름” 그리고 다시 git commit 하면 정상 merge가 됨
  • Commit하기 애매한  “작업 중” 상황에서  다른 브랜치로 Checkout해야 할 경우
    • Stash (감추다, 숨겨두다는 뜻): 이 기능을 활용해 작업 중이던 파일을 임시로 숨겨(저장하여)두고 다른 브랜치로 이동하여 작업하고, 다시 원래 작업 중이던 브랜치로 복귀하여 숨겨둔걸 복원하는 것
    • 작업 중이던 브랜치의 상태를 마지막 커밋의 상태로 초기화 해주는 것 (stash) 변경 사항을 없애 주는 것임.
    • 이런 stash없이 다른 브랜치로 checkout하면 커밋도 안되고 수정만 된 작업중이던 파일이 다른 브랜치에서도 수정된 파일로 잡혀 영향을 주기 때문.
    • git stash (save) (숨기기)
    • git stash apply (복원)
    • git stash list 에 stash 할 수 있는 것이 있고, 이 안에 stash는 임의적으로 삭제 하지 않는 이상 항상 살아있다. 즉 언제든 stash를 불러 올 수 있음. git stash list 에 뜨는 리스트 중 제일 위에 것이 최근 것이고, apply할 땐 가장 최근 것을 적용함.
    • 만약 그 이전 stash를 apply 하고 싶으면 git stash drop 을 통해 가장 최근 stash를 삭제 가능
    • git stash apply;git stash drop : 복원하고 삭제하라. ;를 통해 한 줄에 입력한 것 = git stash pop (=apply + drop)
    • Git에 의해 추적(버전관리)되고 있지 않는 파일은 stash가 되지 않음

[gitflow]