Git 용어 정리


Git에서 활용되는 용어를 정리합니다.



원격 저장소(Remote Repository)

서버에 구축된 저장소


로컬 저장소(Local Repository)

각각의 개발자들이 본인 PC에 구축한 저장소


클론(Clone)

원격 저장소의 소스코드를 로컬 저장소에 복사하는 과정 서버 오류로 인한 데이터 손실 시, 로컬 저장소의 데이터로 복구 가능(현재 버전 뿐만 아니라 모든 히스토리를 복사해온다.)


작업 디렉토리(Working Directory)

PC에서 현재 작업중에 있는 디렉토리 개발자 작업시 프로젝트의 히스토리가 쌓이는 공간 Git에서 관리는 하지만, 추적은 하지 않음


스테이징 영역(Staging Area)

작업 디렉토리 상의 변경점이 올라가는 임시 저장 영역 git에 의해 변경점 추적 관리되는 영역 커밋을 준비하고 검토 할 수 있는 중간 영역


로컬 저장소(Local Repository)

커밋들이 영구적으로 저장되는 영역 원격저장소로 부터 복사(clone)한 커밋들이 존재하는 영역


커밋(Commit)

Git에서 가장 의미있는 변경의 최소 단위
변경의 단위는 개발자마다 조직마다 모두 다르다.
“커밋하다”스테이징 영역의 변경점을 로컬 저장소로 저장하는 과정


Git 기본 플로우

  1. 원격저장소에서 로컬 저장소로 소스코드 복사
  2. 개발 시작(로컬 저장소 내 작업 디렉토리에서 변경점 생성)
  3. 발생한 변경점을 스테이지 영역에 추가(add)
  4. 의미있는 변경점이 쌓이면 최종 커밋 생성(commit)
  5. 로컬 저장소에 영구적으로 저장


Pull

원격저장소에 있는 다른 개발자의 커밋들을 받아온다.


Push

로컬저장소에서 만든 커밋을 원격저장소로 업로드 한다.


사용자의 이름, 이메일 기본 설정

 git config --global user.name "Wookshin"
 git config --global user.email "cotlsdnr1@gmail.com"


설정 정보 확인

 git config --global --list


vi 에디터를 통해 직접 수정하는 방법

 vi ~/.gitconfig


Fork

상대방의 원격저장소(Github)를 나의 원격저장소(Github)에 복사한다.


git init

Git의 핵심 폴더인 .git 폴더가 생성 master라는 기본 브랜치 생성


원격 저장소와 연결하기

git remote add [저장소별칭] [저장소 주소]

 git remote add origin https://gitlab.com/wookshin/myfirstproject.git


현재 저장소에 등록된 원격 저장소 이름 확인

 git remote


현재 저장소에 등록된 원격 저장소의 URL 상세 확인

 git remote -v


저장소 이름 변경

git remote rename [현재 저장소별칭] [변경할 저장소 별칭]


현재 폴더 내 파일의 상태 확인하기

 git status


커밋의 히스토리 확인하기

 git log


Untracked

Git에 의해 관리되지 않은 파일 단 한번도 스테이징 영역(staging area)에 포함되지 않은 파일


Tracked

Git에 의해 관리되는 파일 한 번 이상 스테이징 영역(staging area)에 포함된 적 있는 파일


스테이징 영역에 변경점 추가

 git add TestService.java

작업 디렉토리의 변경점 중 커밋 예정인 파일들은 스테이징 영역에 추가합니다.


커밋 생성

 git commit

의미있는 변경 단위라고 판단되면, 로컬 저장소에 영구적으로 저장한다.


커밋 히스토리 확인

 git log

commit : 커밋의 ID(SHA-1 hash 값을 키값으로 저장)
Author : 커밋 반영한 담당자 정보
Date : 커밋 반영 날짜와 시간


커밋 히스토리 확인 2

 git show b076a

git show {commit id}


Commit 시 git이 데이터를 저장하는 장소

 find .git/objects -type f


hash로 된 파일 내용 확인하기

 git cat-file -p [방금 생성한 커밋의 sha-1 hash값] #파일의 내용  
 git cat-file -t [방금 생성한 커밋의 sha-1 hash값] #파일의 타입  

 git cat-file -p [tree, sha-1 hash값] #파일의 내용  
 git cat-file -t [tree, sha-1 hash값] #파일의 타입  

 git cat-file -p [blob, sha-1 hash값] #파일의 내용  
 git cat-file -t [blob, sha-1 hash값] #파일의 타입  

BLOB : 바이너리 데이터 자체만 저장된 BLOB 객체 (Binary Large Object)


변경된 코드 확인

 git diff

작업 디렉토리에서 기존 코드 대비 변경점 확인
변경점이 적은 경우 쉽게 바로 파악이 가능하지만, 변경점이 많은 경우 변경점 파악이 어려움


변경된 코드 확인 2

 git difftool


difftool 설정

1) 외부 도구 설정 (예, Beyond Compare)
2) 설치 후 실행 파일 위치 확인
3) git config 를 통해 실행파일 path 등록

 git config --global difftool.bc4.path 'C:\Program Files\Beyond Compare 4\BCompare.exe'

4) 기본 difftool로 bc4 설정

 git config --global diff.tool bc4

Beyond Compare 설치 : https://www.scootersoftware.com/


unstaged 변경

 git restore --staged MainService.java

잘못 staged 된 파일을 unstaged 로 변경하기


Git 명령어 옵션 정보 확인

 git log --help

명령어 뒤에 –help 옵션을 입력하면,
웹 브라우저를 통해 해당 명령어의 메뉴얼 페이지가 실행됩니다.


커밋 되돌리기

 git commit --amend

마지막 반영한 최신 커밋 메시지를 변경하고 싶을 때,
최신 커밋 수정 가능한 에디터가 실행됩니다.


코드의 원복

git에서는 원복의 단위가 커밋이다.
git revert ‘마지막에 반영한 commit ID’

 git revert 9bb3a9f


원격 저장소에 커밋 반영하기

git push [저장소 별칭] [브랜치]

 git push origin master


원격 저장소의 커밋을 로컬 저장소로 가져오기

git pull [저장소 별칭] [브랜치]

 git pull origin master


원격/로컬 저장소 생성 방법 2가지

방법1

  1. 로컬저장소 폴더 생성
  2. 로컬저장소 초기화(git init)
  3. 원격저장소와 연결(git remote add)

방법2

  1. 로컬저장소 폴더 생성
  2. 원격저장소 복사(git clone)


git log 역순으로 보기

 git log --reverse


커밋 히스토리 관련 옵션

 git log -p   #코드의 변경점도 같이 보여준다
 git log -p -2   #가장 최신 로그 2개를 보여준다
 git log -u   #-p와 동일하면 역할 (코드의 변경점도 보여준다)
 git log -u 'commit ID'   #특정 커밋의 로그를 보여준다
 git log -1   #가장 최신 로그 1개를 보여준다
 git log -2   # 가장 최신 로그 2개를 보여준다
 git log --name-only   #커밋대상 파일 리스트를 보여준다
 git log --oneline   #각 커밋 로그를 한줄로 보여준다
 git show 'commit ID'   #특정 커밋의 자세한 정보를 보여준다(diff 기능)


커밋 히스토리 관련 옵션 2

 git log --author 'torvalds'
 git log --since=2.weeks
 git log --grep '...'


브랜치(branch)

기본 브랜치로부터 파생한 독립적인 작업 공간입니다.
최신 커밋을 가리키는 일종의 포인터입니다.
매우 가볍습니다.
생성, 이동, 병합(merge)이 매우 쉽습니다.


현재 작업 중인 브랜치 확인하는 명령어

 git branch

첫 번째 커밋을 만들어야 브랜치가 생성된 커밋을 가리킬 수 있다.


현재 브랜치를 가리키는 일종의 포인터
현재 브랜치의 마지막 커밋에 대한 스냅샷


브랜치 생성

 git branch feature-login   #새로 생성할 브랜치명
 git branch   #현재 브랜치 확인
 git log   #브랜치가 어떤 커밋을 가르키고 있는지 확인


브랜치 이동

 git checkout feature-login   #브랜치 이동(HEAD 이동)
 git branch   #현재 브랜치 확인
 git log   #브랜치가 어떤 커밋을 가르키고 있는지 확인


Checkout

HEAD는 checkout 대상 브랜치로 이동합니다.
로컬 저장소의 상태는 HEAD가 가리키는 마지막 커밋이 최신이 됩니다.
작업 디렉토리의 파일 상태도 변경됩니다.


전체 브랜치의 로그를 확인하기 (그래프로, 한 라인으로)

 git log --all --graph --oneline


브랜치 생성과 동시에 이동

 git checkout -b issue


브랜치 병합(merge)

1) 기준이 되는 브랜치로 이동합니다. 햐

 git checkout master   #issue 브랜치 -> master 브랜치로 이동

2) 합쳐질 브랜치를 병합합니다.

 git merge issue


Fast-forward Merge

브랜치의 위치만 최신 커밋으로 이동시키는 방식입니다.
기준 브랜치의 커밋(master)과 병합될 브랜치의 커밋(issue)이 일직선상에 있을 때 Fast-forward Merge가 발생합니다.


브랜치 삭제

더 이상 사용되지 않는 브랜치는 삭제하기

 git branch -d issue


3-way Merge

아래 3개 커밋을 모두 고려하여 방합하는 방식으로 3-way Merge의 결과는 새로운 커밋으로 생성됩니다.

  1. master와 feature-login 브랜치의 공통 부모 커밋
  2. master 브랜치의 최신 커밋
  3. feature-login 브랜치의 최신 커밋


변경사항의 충돌 (conflict)

개발하는 기능의 목적에 맞게 어떤 변경사항을 어떻게 반영할지를 결정하고 수정하여 반영하는 것을 conflict을 해결하는 과정이라 한다.


충돌을 해결하는 방법

1) 직접 merge를 합니다.

 vi MainService.java

2) mergetool을 사용합니다.

 git mergetool


mergetool 사용하여 충돌을 해결하는 방법

  1. 개발자의 의도대로 수정합니다.
  2. COnflict 표준 기호를 제거합니다. ( <<<<<<<, -------, >>>>>>>)
  3. 수정 완료되면 저장 후 종료합니다. (:wq)
  4. 나머지 3-way 창은 수정 없이 종료합니다. (:q)
  5. 병합이 제대로 되었는지 확인 후, commit을 생성합니다.


cherry-pick

다른 브랜치의 커밋을 선택적으로 가져와 현재 브랜치에 적용 시킬 때 사용합니다.

 git cherry-pick 9bb3a9f   #git cherry-pick {commit id}


Git에서 태그란?

태그는 특정 시점의 소스코드 정보를 기록합니다. 프로젝트 진행 중 의미있는 시점의 커밋을 태깅한 것입니다.

의미있는 시점이란,


Git 태그의 종류

1) Lightweight 태그

 git tag v1.0   #git tag [태그명]


2) Annotated 태그

 git tag -a v1.0 -m "Implemented login feature"   #git tag -a [태그명] -m [태그 메시지]


Annotated 태그 생성하기

 git tag -a v1.0 -m "Implemented login feature"
 git log


태그 정보 확인하기

 git show v1.0


특정 시점의 커밋 태그하기

1) 태깅하고자 하는 커밋의 ID 값을 확인한다.
2) 커밋 ID 값을 인자로 태깅한다.
3) 태그 정보를 확인한다.

 git log --oneline
 git tag -a v0.1 [커밋ID] -m "fix issue number-1"
 git log --oneline
 git show v0.1


git stash

작업 도중 브랜치를 전환할 때 git stash를 이용하여 작업 디렉토리 내 unstaged 파일들을 백업 후 전환합니다.


git stash 저장

 git stash save
 git stash list

*WIP : Work In Progress


git stash 불러오기

 git stash apply


git stash 삭제

 git stash drop


git rebase

base의 위치를 바꿔 머지하는 방식입니다.


숨겨진 브랜치(원격 저장소의 브랜치)까지 모두 보기

 git branch -a


원격 저장소의 브랜치를 로컬 저장소로 활성화

 git checkout -t origin/test   #-t는 tracking을 의미


rebase 사용 방법

1) rebase 할 대상 브랜치에서 git rebase 명령어를 사용합니다.

 git rebase master   #master의 최신 커밋이 base가 되어 test 커밋들이 뒤에 붙습니다. 

2) master 브랜치로 전환 후 최종 merge합니다.

 git checkout master
 git merge test


merge vs. rebasse


GitFlow 설명

https://nvie.com/posts/a-successful-git-branching-model


GitFlow 모델


정규표현식으로 시간 절약하기
당신의 하루에 몇 시간을 더하세요
WPF MVVM 패턴, 그리고 Binding
WPF(Windows Presentation Foundation) 시리즈
AWS SAA 준비 - (4) 비용에 최적화된 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (3) 안전한 아키텍처
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (2) 성능이 뛰어난 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
AWS SAA 준비 - (1) 복원력을 갖춘 아키텍처 설계
(정리) Exam Readiness - AWS Solutions Architect Associate
15분 안에 ToC를 구현해보자!
Vanilla JS로 Table of Contents 구현하기
모듈
모던 자바스크립트 Deep Dive | 48장 | 모듈
에러 처리
모던 자바스크립트 Deep Dive | 47장 | 에러 처리
제너레이터와 async/await
모던 자바스크립트 Deep Dive | 46장 | 제너레이터와 async/await
프로미스
모던 자바스크립트 Deep Dive | 45장 | 프로미스
REST API
모던 자바스크립트 Deep Dive | 44장 | REST API
Ajax
모던 자바스크립트 Deep Dive | 43장 | Ajax
비동기 프로그래밍
모던 자바스크립트 Deep Dive | 42장 | 비동기 프로그래밍
타이머
모던 자바스크립트 Deep Dive | 41장 | 타이머
Set과 Map
모던 자바스크립트 Deep Dive | 37장 | Set과 Map
디스트럭처링
모던 자바스크립트 Deep Dive | 36장 | 디스트럭처링
브라우저의 렌더링 과정
모던 자바스크립트 Deep Dive | 38장 | 브라우저의 렌더링 과정
스프레드 문법
모던 자바스크립트 Deep Dive | 35장 | 스프레드 문법
이터러블
모던 자바스크립트 Deep Dive | 34장 | 이터러블
7번째 데이터 타입 Symbol
모던 자바스크립트 Deep Dive | 33장 | 7번째 데이터 타입 Symbol
String
모던 자바스크립트 Deep Dive | 32장 | String
RegExp
모던 자바스크립트 Deep Dive | 31장 | RegExp
Date
모던 자바스크립트 Deep Dive | 30장 | Date
Math
모던 자바스크립트 Deep Dive | 29장 | Math
DOM
모던 자바스크립트 Deep Dive | 39장 | DOM
Number
모던 자바스크립트 Deep Dive | 28장 | Number
배열
모던 자바스크립트 Deep Dive | 27장 | 배열
이벤트
모던 자바스크립트 Deep Dive | 40장 | 이벤트
ES6 함수의 추가 기능
모던 자바스크립트 Deep Dive | 26장 | ES6 함수의 추가 기능
클래스
모던 자바스크립트 Deep Dive | 25장 | 클래스
this
모던 자바스크립트 Deep Dive | 22장 | this
빌트인 객체
모던 자바스크립트 Deep Dive | 21장 | 빌트인 객체
strict mode
모던 자바스크립트 Deep Dive | 20장 | strict mode
클로저
모던 자바스크립트 Deep Dive | 24장 | 클로저
프로토타입
모던 자바스크립트 Deep Dive | 19장 | 프로토타입
함수와 일급 객체
모던 자바스크립트 Deep Dive | 18장 | 함수와 일급 객체
실행 컨텍스트
모던 자바스크립트 Deep Dive | 23장 | 실행 컨텍스트
생성자 함수에 의한 객체 생성
모던 자바스크립트 Deep Dive | 17장 | 생성자 함수에 의한 객체 생성
프로퍼티 어트리뷰트
모던 자바스크립트 Deep Dive | 16장 | 프로퍼티 어트리뷰트
let, const 키워드와 블록 레벨 스코프
모던 자바스크립트 Deep Dive | 15장 | let, const 키워드와 블록 레벨 스코프
전역 변수의 문제점
모던 자바스크립트 Deep Dive | 14장 | 전역 변수의 문제점
스코프
모던 자바스크립트 Deep Dive | 13장 | 스코프
함수
모던 자바스크립트 Deep Dive | 12장 | 함수
원시 값과 객체의 비교
모던 자바스크립트 Deep Dive | 11장 | 원시 값과 객체의 비교
객체 리터럴
모던 자바스크립트 Deep Dive | 10장 | 객체 리터럴
타입 변환과 단축 평가
모던 자바스크립트 Deep Dive | 9장 | 타입 변환과 단축 평가
제어문
모던 자바스크립트 Deep Dive | 8장 | 제어문
연산자
모던 자바스크립트 Deep Dive | 7장 | 연산자
데이터 타입
모던 자바스크립트 Deep Dive | 6장 | 데이터 타입
표현식과 문
모던 자바스크립트 Deep Dive | 5장 | 표현식과 문
변수
모던 자바스크립트 Deep Dive | 4장 | 변수
Iteration와 Generator
코드스피츠 77 ES6+ 3화 참조
WHATWG 탄생 배경
WHATWG, W3C, HTML의 관련에 대한 역사
프론트엔드(FE) 면접 질문 정리
FE관련 면접 질문 및 답변 정리한 내용입니다.
쿠버네티스(kubernetes, k8s) 용어 정리
쿠버네티스(kubernetes, k8s) 용어 정리
젠킨스(Jenkins) 정리
젠킨스(Jenkins) 정리
Docker 용어 정리
Docker 용어 정리
Git 용어 정리
Git 용어 정리
반응형 웹 디자인(Responsive Web Design)
CSS responsive 에 대하여
JS this에 대하여
this에 대해 알아보자
SQL*PLUS에 대하여
SQL*PLUS 정의 및 사용방법
Oracle에서 SQL Plan 확인하기
Oracle에서 SQL Plan을 확인해보자