프로그래밍/Git, IDE, 툴 관련

[깃] 초보자를 위한 - git 개념 및 명령어 한장 정리

포도알77 2020. 12. 11. 12:02

초보자를 위한 - git 개념 및 명령어 한장 정리

 내가 보려고 저장하는 한장 정리. 사용 편리를 위한 옵션들은 공부하는대로 추가할 예정..

 

1. 깃 원리

  깃은 버전 관리를 위한 툴으로, 소스 코드를 포함한 다양한 파일을 수정한 후 저장하게 되면 변경된 내용만 정리하여 버전으로 만들어 준다. 깃은 기본적으로 디렉터리를 작업 공간으로 한정하기 때문에, 원격 깃을 연결하여 push하지 않는 이상 로컬으로 동작한다.

 

 리눅스의 경우 최신 버전은 git이 기본적으로 설치되어 있다. 만약 윈도우즈를 사용하거나 리눅스상에 설치되어 있지 않다면, 아래의 프로그램을 설치하여 사용할 수 있다.

 

윈도우즈 : https://git-scm.com/

 리눅스 : sudo apt-get install git

 

2. 깃 초기화

 깃을 사용하기 위해서 작업하고자 하는 디렉터리로 이동하여 아래의 명령어를 수행한다.

git init                // 현재 디렉터리에 git을 준비
git add .               // 현재 디렉터리에 포함된 모든 파일을 git에 등록
git commit -m "init"    // 등록된 파일로 첫 commit을 만듬

 

 

git init 명령을 수행하고 나면 .git 디렉터리가 생기고, 로컬 깃이 준비된 상태이다. 이후 해당 디렉터리에 포함된 모든 파일 혹은 일부 파일을 git add . 명령으로 추가하고 git commit -m "메시지" 명령으로 초기 버전 등록한다.

 

3. 깃에서 파일의 상태

 깃은 (1) 일반, (2) 버전 등록 대기 상태, (3) 버전 등록된 상태로 총 3가지 상태가 존재한다. 각 상태마다 저장되는 위치가 다르며, 이를 통하여 다시금 (1) working tree(혹은 working directory), (2) Stage, (3) Repository로 구분할 수 있다.

 

 

 (1) Working Tree (working directory)

   이 위치는 작업 디렉터리를 뜻한다. 만약 git을 abc 폴더에 만들었다면 abc 폴더가 working tree가 된다.

  또한 아직 레파지토리에 한번도 저장하지 않은 파일은 untracked file, 등록된 파일은 tracked file으로 부른다. 이후 디렉터리에 파일을 추가, 삭제하거나 변경 하는 경우 modified으로 간주된다.

 

 (2) Staging area 또는 stage

 Stage는 git add 파일명 명령으로 등록할 수 있다. 나중에 repository에 등록하기 위하여 리스트화 시킨 파일들로 staged file으로 부른다.

 

 (3) Repository

 Repository는 (1) -> (2)를 통해서 Staged file들을 git commit -m "메시지"로 저장하는 장소이다. 등록 후에는 commit으로 버전 관리가 된다.

 

 

4. 깃 추가, 삭제, 조회

 

 (1) 커밋 추가

파일 수정
git add abc.txt
git status
git commit -m "abc 파일"
git log
  1. 파일을 수정한다.
  2. git add "파일명" 명령을 통하여 staged file으로 만든다.
  3. git status 명령을 통하여, 현재 staged file 목록과 modified된 파일 목록을 확인한다.
  4. git commit -m "커밋 메시지" 명령을 통하여, repository에 현재 수정 사항을 등록한다.
  5. git log 명령을 통하여 commit list를 조회한다.
  6. 혹은 git commit -am "커밋메시지" 명령으로 git add와 commit을 동시에 수행한다.

 

 (2) 커밋 복원 (삭제)

git log
git revert 28aa2e887.....(커밋번호)
  1. git log 명령으로 삭제하고자 하는 commit의 commit 번호를 확인한다.
  2. git revert 커밋번호 명령으로 해당 commit을 이전 상태로 돌린다.
  3. Revert에 대한 메시지를 수정하거나 그대로 저장하면 해당 commit이 Revert 된다.

 

 (3) 작업 파일 초기화

git log
git reset --hard master // master 브랜치의 최종 commit으로 reset
// 또는 
git reset --hard HEAD^^^^ // 현재 커밋(HEAD)에서 4개 전 commit으로 reset
git reset --hard HEAD~4   // 상동

// --soft : 해당 커밋으로 HEAD를 옮김
// --mixed : 해당 커밋으로 HEAD를 옮기고, Staging area를 비움
// --hard : 해당 커밋으로 HEAD를 옮기고, Staging area를 비우며, working directory 수정사항을 버림
  1. git log 명령으로 복원하고자 하는 commit 번호를 확인한다.
  2. git reset --hard 커밋번호 명령으로 모든 파일을 해당 commit 상태로 변경한다.
  3. 또는 git log에서 HEAD부터 원하는 commit 위치까지의 개수(n)를 git reset --hard HEAD~n으로 수행해도 된다.
  4. --hard는 working directory에 변경된 내용과 staging area를 비우고 해당 commit으로 복원하며, --soft는 단순히 현재 작업중인 commit HEAD만 해당 commit으로 옮긴다. --mixed는 staging area를 초기화하지만 working directory는 그대로 둔다.

 

 (4) 커밋 수정

git commit --amend

   1. 바로 직전 commit에 대하여 git commit --amend 명령을 통해 commit을 수정할 수 있다.

 

 

 (5) Staged File의 수정 내용 확인

git diff
  1. git add 한 파일에 대한 원본과 수정 내용을 확인하고자 할 때는 git diff 명령을 수행한다.

5. 브랜치

 깃 브랜치는 Repository에 저장한 commit 리스트를 뜻한다. 여럿이서 작업하거나 개발, 릴리즈용을 분리해서 관리하기 위해서 기본 브랜치인 master 이외에도 여러 브랜치를 만들고 이를 합치거나 삭제할 수 있다.

 (1) 브랜치 생성 및 이동하기

git branch abc    // abc라는 브랜치 생성
git checkout abc  // abc 브랜치로 이동

// 또는 한번에 생성 이동
git checkout -b abc
  1. git branch 브랜치이름 명령으로 현재 HEAD가 가르키는 위치에서 새로운 브랜치를 만든다.
  2. git checkout 브랜치이름 명령으로 해당 브랜치로 이동한다
  3. 혹은 git checkout -b 브랜치 명령으로 1,2 과정을 한번에 수행한다.

 

 (2) 브랜치 조회

git branch
  1. git branch 명령을 통해 현재 브랜치들을 확인한다.

 

 (2) 브랜치 합치기

// master ____.___   // master 브랜치에 abc가 합쳐짐, abc를 지우지 않으면 그대로 유지됨
// abc    ___/

git checkout master  // 합치려하는 브랜치로 이동 
git merge abc        // abc 브랜치를 master 브랜치로 합침
  1. git checkout master 명령을 통해 원본 브랜치로 이동한다.
  2. git merge 파생브랜치 명령을 통해 원본 브랜치에 파생브랜치를 합친다.

 

 (3) 브랜치 삭제하기

git branch -d abc    // abc 브랜치 삭제, abc가 다른 곳에 merge되지 않았으면 오류 발생
git branch -D abc    // abc 브랜치 강제 삭제
  1. git branch -d 브랜치이름 명령으로 해당 브랜치를 삭제한다.
  2. 만약 merge 되지 않았다면, 에러 메시지가 발생한다.
  3. git branch -D 브랜치이름 명령을 사용하면, merge하지 않았더라도 강제로 삭제할 수 있다.

 

 (4) 두 브랜치간 차이 확인

// master ___.a___.b___.c____
// abc        \______.d______

git diff master..abc // master에 없지만 abc에만 있는 커밋 출력
// d만 출력됨
  1. 두 브랜치에 commit들이 많아서 구분이 힘들 때 사용한다
  2. git log 브랜치1..브랜치2 명령을 통해 브랜치1에는 없지만 브랜치2에는 있는 commit들이 나온다.

 

 

 (5) Conflict 발생시

  깃은 line base로 수정된 line 상, 하를 비교하여 서로 다른 수정 사항을 합친다. 만약 동일한 라인을 수정하거나, 상, 하 비교되는 라인이 변경되면 conflict가 발생하고 merge가 중단된다.

 

  이때는 conflict가 발생한 파일에 위와 같이 <<<<, >>>>형태로 수정이 필요한 위치가 나오며 이를 수정하여 add, commit을 수행하면 정상적으로 merge가 진행된다.

git checkout master
git merge abc
// conflict 발생
// 파일 수정
git add conflict_file.c
git commit -m "abc 브랜치 merge 함"
  1. git checkout master 명령으로 mater 브랜치로 이동한다.
  2. git merge 파생브랜치 명령으로 파생브랜치를 master 브랜치에 merge한다.
  3. 컨플릭 발생
  4. git add 컨플릭파일명 명령을 통해 staged file화 시킨다.
  5. git commit -m "merge 파생브랜치" 명령을 통해 merge를 수행한다.

 

 

6. 원격지 깃 연동하기

 지금까지는 local에서 수행하는 내용이며, github나 혹은 다른 원격지의 git과 연결하여 사용하는 방법을 설명한다. 여기서부터는 사실상 git pull, push가 추가되는 수준이며 단순히 브랜치가 원격에 있는 것일 뿐이다.

 

 

 (1) 원격지 깃 연결하기

git remote add origin https://github.com/ABC/abc.git  // 깃허브의 abc를 원격지로 추가
git remote -v // 연결 상태 확인
  1. git remote add origin 원격지깃주소 명령을 통하여 원격지의 깃을 origin이라고 명명하고 추가한다. (alias)
  2. git remote -v 명령을 통하여 정상적으로 연결되었는지 확인한다.

 

 (2) 원격지 깃 삭제하기

git remote remove origin // origin으로 추가한 원격지를 삭제
  1. git remote remove origin 명령을 통해 origin으로 등록된 원격지 깃을 삭제한다. 

 

 (3) 커밋 푸시하기

 로컬에서 수정, 스테이징 그리고 commit을 생성한 다음 이를 원격지로 push하려면 아래의 명령을 사용한다.

git push -u origin master  // -u 옵션을 통해 향후에 origin 원격지의 master 브랜치를 저장
// 이후에는
git push                   // origin master 생략가능

// 그게 싫다면
git push origin master     // 이렇게 하여도 무방
  1. git push -u origin master 명령을 통해 origin 원격지의 master 브랜치에 커밋을 보낸다. (최초 1회만)
  2. git push 명령을 이용한다. (-u 옵션으로 한번 호출한 경우 origin master를 쓰지 않아도 됨)

 

 (4) 커밋 받아오기

  원격지의 깃 브랜치에 최신 커밋이 존재한다면 아래의 명령을 통하여 로컬로 가져올 수 있다.

// 로컬 master    _______.a_______
// origin master   /_______.a____.b____

git pull      // b 커밋을 받아서 로컬 master 브랜치에 merge까지 수행
// 또는 
git fetch     // b 커밋을 받아서 FETCH_HEAD 브랜치에 저장해둠 (merge는 직접 수행)
  1. git pull (origin master) 명령을 통하여 원격지 브랜치에서 최신 커밋을 받아오고 merge까지 수행한다.
  2. (3) 커밋 푸시하기에서 -u 옵션으로 한번 푸시한 경우 origin master를 생략할 수 있다.
  3. 또는 git fetch (origin master) 명령을 통해 최신 커밋을 받아오고 FETCH_HEAD 브랜치에 저장한다.
  4. fetch 이후에 최신 커밋을 로컬 master에 merge 하고자 하는 경우 git merge FETCH_HEAD 명령을 수행한다.

 

 끝.

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사