Util

Git (생활코딩)

Ju_Hyang 2020. 5. 18. 23:01
git 의 3대 목적
  1. version
  2. backup
  3. collaborate
 
 
git의 첫번째 목적
  1. Version
    • 작업을 진행하다보면 여러가지 파일들이 생성 된다.
    • 일반적으로 작업을 나눌 경우 ‘다른 이름으로 저장’을 통해 작업을 나눈다.
    • 이 경우에 언제 작업했는지, 어떤 작업을 했는지 기록하기가 힘들다 !
  1. Backup
    • 파일에 관해 불확실한 것 ? 언제 소실될지 모른다
    • 파일에 관해 확실한 것 ? 언젠가는 꼭 소실된다.
    • 이 소실되는 것을 방지해서 backup을 해야한다 !
    • 지역저장소 —> 원격저장소 :: Push
    • 원격저장소 —> 지역저장소 :: Pull
  1. Collaborate
    • backup 을 하면 협업을 하는 것이나 다름 없다.
    • 유저 1이 원격저장소에 Push를 하게되면, 다른 유저 2는 Pull 을 하여 이어서 작업하고 다시 원격저장소에 Push를 한다.
 
Git의 종류
  1. Github.com 의 Github Desktop
  2. TortoiseGit :: Windows 전용, Windows 탐색기에 기생.
  3. Sourcetree :: 복잡하지만 자유롭다.
  4. git
 
 
 
Git Command Line Interface
  • GIT 을 terminal 에서 사용하는 방법을 익힌다.
 
  • git config —global user.email “EMAIL"
  • git config —global user.name “USER_NAME"
  • 사용자에 대한 정보를 입력 !
 
  1. git 초기화
    • git init . :: 현재 디렉토리를 git으로 관리하겠다고 초기화 하는 명령어 이다. (Initialize repository)
    • 이 결과 .git 폴더가 생성되고 버전 관리에 대한 정보가 저장이 된다. 이 디렉토리를 지울 경우 버전관리가 사라지게 된다.
  1. 버전 생성
    • Working tree :: 수정한 파일들 / Staging Area :: 버전을 만들려고 하는 파일들 // Repository :: 버전이 만들어져 있는 파일들
    • git status :: git 의 현재 상태를 화면에 출력시킨다.
      • commit == version
    • git add {file} :: file 을 Staging Area 에 올린다. (버전 관리를 하기 위해서)
    • git commit :: 실행시 에디터가 실행된다
      • -m “COMMIT_MESSAGE” :: 옵션을 사용하여 에디터 없이 바로 메시지를 생성하면서 버전생성을 하고 이는 Repository로 들어간다.
    • git log :: 현재까지의 모든 version에 대한 설명을 출력한다.
      • —stat :: 버전에 관련되어 있는 파일들을 함께 출력한다.
  1. 버전간의 차이점 비교
    • git diff :: 변경사항을 출력한다.
    • git reset —hard :: 마지막 커밋으로 돌아간다 ! 현재의 변경사항을 초기화
    • git log -p :: 각 커밋의 변경 내용과 함께 log가 출력 된다.
  1. 이전 버전으로 이동
    • git checkout {COMMIT_ID} ::COMMIT_ID 의 버전으로 현재 코드를 이동 시킨다. (HEAD의 이동)
    • git checkout master :: 최신의 버전으로 돌아감
  1. 보충 
    • git add {DIRECTORY} :: 디렉토리 전체에 있는 파일들을 add 한다.
    • git add -am “COMMIT_MESSAGE” :: git add . + git commit -m 의 역할을 한다. 단, 새로 생긴 파일에는 add가 되지 않고 한번이라도 add된 파일에만 작동이 된다.
    • git commit :: 옵션 없이 실행 할 경우 기본 에디터가 실행이 되고, 여러줄의 커밋 메시지를 남길 수 있다. 
    • git config —global core.editor “EDITOR” :: 위에서 실행되는 기본 에디터를 바꿀 수 있다.
  1. 버전 삭제
    • git reset —hard {COMMIT_D} :: COMMIT_ID 로 버전으로 reset하고 그 뒤의 커밋들을 모두 삭제 시킨다.
    • 주의사항 :: 공유되기 전 버전까지만 reset을 진행해야 한다.
  1. 버전 되돌리기
    • git revert {COMMIT_ID} :: 해당 commit 을 취소 시키면서 새로운 버전을 생성한다. (COMMIT_ID 의 이전상태로 바뀐다)
    • 충돌을 막기 위해서 각 commit의 역순으로 하나씩 가야한다.
    • COMMIT_ID 에서 변경된 사항만 변경을 시키기 떄문에 한꺼번에 여러가지 commit을 뛰어 넘을 때 충돌이 일어나게 된다. (conflict)
 
 
 
GIT 3 - Branch Conflict CLI
  1. Branch
    • git log —all —graph —oneline :: branch 에 대한 정보를 그래프 / 한줄로 표현
    • git branch :: branch 목록 출력
    • git branch {BRANCH_NAME} :: branch 생성
    • HEAD는 현재 어느 branch에 있는 지에 대한 정보를 알려준다.
    • git checkout {BRAHCN_NAME} :: brahcn 전환(이동)
  1. Merge (병합)
    • base :: 합치려고 하는 것의 공통의 조상
    • merge commit :: 합쳐진 것의 결과물 
    • git commit —amend :: commit 메시지 수정
    • git merge {BRANCH_NAME} :: BRANCH_NAME 을 현재 HEAD에 병합한다.
    • conflict 오류 시 해당 파일 수정 후 다시 add 후 git commit 실행하면 merge가 실행된다. 
  1. Conflict (충돌) - 3 Way Merge
    • here :: A H C H
    • base ( 원본 ) :: A B C D
    • there :: A B T T
    • here + there
      • 2 Way Merge :: A ( B / H ) ( C / T ) ( H / T )  Conflict
    • base + here + there
      • 3 Way Merge :: A H<from here> T <from there> (H / D / T)
      • 수정된 branch 의 내용을 가져와서 병합한다
  1. 외부 도구를 이용한 병합
    • here :: A H C H
    • base ( 원본 ) :: A B C D
    • there :: A B T T
    • here 에서 git checkout there 실행 시 마지막 부분에서 conflict가 발생.
    • p4Merge 라는 도구를 이용하면 쉽게 Merge 를 할 수 있다.
    • 실행법 :: git mergetool
 
 
GIT 4 - cherry-pick & rebase 
  • cherry-pick :: 특정한 commit의 변화 내용만 골라와서 뒤에 붙이는 기능
  • rebase :: 병렬적인 commit 트리를 직렬형으로 변경하여 로그에 직관성을 높인다.
  • 두 가지 모두 commit 들의 순서와 배치re를 바꿀 수 있도록 해준다.
 
  1. Cherry-pick의 개념과 기본 사용법
    • git cherry-pick {COMMIT_ID} :: COMMIT_ID 의 스냅샷이 아닌 변화 내용만 가지고와서 현재의 branch 뒤에 붙여서 새로운 commit 으로 만든다.
  1. rebase 의 개념과 기본 사용법
    • base를 재배치하여 병렬적인 branch의 구조를 선형으로 바꾸도록 한다.
    • git rebase {BRANCH_NAME} :: 현재 branch 의 base 를 BRANCH_NAME 의 마지막 commit 으로 바뀐다. 이때 BRANCH_NAME 에서 하나 작업들은 남아있다.
    • rebase 는 원격 저장소에 push 하기 전에 실행 되어야 한다.
    • merge 의 결과와 rebase 의 결과는 서로 같아야 한다.
 
 
 
ㅇㅇㅇ