Linux-3 Git (22/11/23)

nazzzo·2022년 11월 24일
0

Git 입문


오늘는 git의 기본적인 설정과 사용법에 대해 알아보겠습니다.



1. Git 기본설정

& git --version //git이 최신버전인지를 확인합니다

$ git config --global user.name "사용할 유저명을 입력합니다"
$ git config --global user.email "이메일 주소를 입력합니다"


# linux or window
$ git config --global core.autocrlf true


# mac
$ git config --global core.autocrlf input
// 위 코드는 Window 환경과 Mac pc의 엔터키에 대한 호환처리를 위해 입력합니다.

1-2. workspace 정의



먼저 git 학습을 위한 디렉토리를 생성해야 합니다.

이를 위해 문서 디렉토리 안에 lecture_git이라는 이름의 폴더를 만들었습니다.


Window (Linux)

$cd /mnt/c/Users/"유저명"/Documents/lecture_git

Mac (terminal)

cd ~/Documents/lecture_git




만약 오류가 발생한다면 아래 코드를 입력해보세요

command(ctrl) + shift + p

Shell Command: install 'code' command in PATH

입력 후 위와 같은 메세지가 출력되면 성공입니다


VSCode의 확장 기능을 통해 VSCode 내에서 git을 관리하는 것도 가능합니다.
이를 위해서는 윈도우의 WSL(우분투)과 VSCode를 연동해야 합니다.

VSCode를 켠 뒤 마켓플레이스에서 Remote- WSL를 찾아 설치합니다.

설치가 완료되면 일단 VSCode를 종료하고 터미널에서
lecture_git 디렉토리를 찾아간 뒤, WSL을 실행하고 code .를 입력합니다.

명령어가 성공적으로 발동되면 VSCode가 자동으로 켜지게 됩니다.

이제 VSCode의 상단에 있는 터미널 탭에서 새 터미널을 열어서
git이 잘 동작하고 있는지를 확인해야 합니다.

이를 위해 lecture_git 폴더 안에서 몇 가지 예제 파일을 만들고
연동이 잘 되고 있는지를 확인해보려고 합니다.


아래와 같은 3종류의 예제 파일을 만들어 보겠습니다.

development.json

{
    "username": "root",
    "password" : "root",
    "database" : "board_dev",
    "host" : "127.0.0.1",
    "dialect" : "mysql"
}

test.json

{
    "username": "root",
    "password" : "root",
    "database" : "board_test",
    "host" : "127.0.0.1",
    "dialect" : "mysql"
}

production.json

{
    "username": "root",
    "password" : "root",
    "database" : "board",
    "host" : "127.0.0.1",
    "dialect" : "mysql"
}

JSON?

JavaScript Object Notation
JSON 포맷은 Javascript의 객체 문법으로 만들어진 데이터를
문자형 데이터로 변환해서 저장합니다.
이로 인해 웹상에서 객체 데이터를 손쉽게 주고 받을 수 있습니다.

JSON.parse() : JSON 문자열을 Javascript 객체로 변환시키는 메서드입니다.
JSON.stringify() : Javascript 객체를 JSON 문자열로 변환시키는 메서드입니다.



2. Git 입문


본격적으로 git의 기능들을 사용해보려고 합니다

먼저 VSCode의 터미널에 git init이라는 명령어를 입력합니다

해당 명령어를 입력하면 현재 디렉토리(lecture_git) 안에
.git 이라는 이름의 숨김 폴더가 생성됩니다

2-1. .git


사용자가 생성한 git 히스토리들은 모두 이 숨김 폴더안에 저장됩니다

아래 명령어를 입력해봅시다

$ git status

명령어가 발동되면 현재 git이 추적중인 모든 파일과 디렉토리의 정보를 출력합니다
(git status는 앞으로도 습관적으로 사용해야할 명령어...)


2-2 .gitignore


git은 설정한 디렉토리(.git이 들어있는) 안의 모든 파일과 디렉토리를 추적하고 있습니다
하지만 git으로 프로젝트를 관리할 때에도 그 프로젝트 안의 특정 파일들은
git으로 관리할 필요가 없는 경우가 생길 수 있습니다.

이럴 때엔 .gitignore 파일을 만들어 그 안에 예외항목을 기입해야 합니다.


먼저 .gitignore라는 이름의 파일을 생성해봅시다.

만들어진 파일 안에 이전에 만들었던 production.json를 입력하고 저장합니다.

다시 git status 명령어를 입력해보면 해당 파일에 관한 내용은 빠져 있는 것을
확인할 수 있습니다. production.json이 이제 git의 추적 대상에서 제외되었기 때문입니다.

이처럼 .gitigonre은 git 프로젝트 작업을 하면서
git으로 관리하고 싶지 않은 파일들을 다룰 경우가 생길 시에 사용하게 됩니다.

  • .gitigore사용법 정리
*.js 
// *은 모든 js파일을 관리하지 않겠다는 뜻입니다.

package-lock.json 
// package-lock.json 이라는 이름을 가진 '모든' 파일을 추적하지 않습니다.

node_modules/
// node_modules라는 디렉토리와 그 안에 속한 모든 파일들을 추적하지 않습니다.

3. Git 작업순서도


git은 구조적으로 다음과 같은 세 가지 공간으로 이루어져 있습니다.

  • Working directory
  • Staging area
  • Repository

첫 번째는 Working directory, 현재 작업중인 디렉토리(작업 폴더)를 뜻합니다.

이 안에서는 작업물을 git추적중인 것(Tracked)
추적되지 않는 것(`Untracked)으로 구분합니다.

  • Tracked : 한 번이라도 .git에 의해 관리된 적이 있는 파일
  • Untracked : 아직 한 번도 .git에 의해 관리된 적이 없는 파일

여기서 add 명령어를 이용하면 git이 추적할 파일들을 Staging area로 넘기게 됩니다.

$ git add "파일명"
// 파일명에 해당하는 파일을 Staging area로 넘깁니다.
// 또는
$ git add .
// 작업한 모든 파일들을 Staging area로 넘깁니다.

두 번째는 Staging area로, 이곳은 대기소와 비슷한 기능을 가진 영역입니다.

이곳은 Working directory에서 넘어온 파일을
.git이 데이터를 추적하기 전까지의 중간다리 역할을 합니다.

파일의 저장과 기록(commit) 역할을 담당하며
이곳에서 사용자가 선택한 파일들만이 .git 안으로 넘어갈 수 있습니다.


+) git add 취소하기

$git restore --staged "파일명"

// git restore --staged development.json
// git rm --catched development.json

+)
add를 진행한 파일은 VSCode 내에서도 UI적으로 변화가 생깁니다.
(리스트에서 파일명 오른쪽에 A 마크 : 해당 파일이 staging area에 들어갔음을 의미합니다)



마지막은 Repository, 바로 .git폴더입니다.

우리의 최종 목표는 Working directory에서 작업중인 Untracked 파일을
Staging area를 거쳐 최종적으로 .git 안으로 옮기는 것입니다.

commit 명령어를 통해 작업을 마친 파일들을 git 폴더로 옮길 수 있습니다.

먼저 git commit 명령어를 입력하면 메세지를 적을 수 있는 에디터가 열리게 되는데요
에디터 안에서는 프로젝트의 변경사항을 몇가지 룰을 따라 메시지 형태로 기록해야 합니다
(에디터 안에서 저장은 Ctrl+S, Ctrl+X로 에디터를 빠져나올 수 있습니다)


커밋 메시지에 입력할 머릿글은 아래의 형식을 따르도록 합니다

  • feat : 새로운 기능 추가
  • Fix : 버그 수정
  • Docs : 문서 내용 수정
  • Style : 코드 스타일 변경
  • Design : UI 변경
  • Test : 테스트 코드 작성, 테스트 코드에 관한 리팩토링
  • Refactor : 실제 코드에 관한 리팩토링
  • Rename : 파일명 수정
  • Remove : 파일 삭제


    +) 추가로 메시지로 입력할 내용은 50자 이내로 작성하는 것이 좋습니다
// 예시) 
"fix: test.json 데이터베이스 내용 수정"
// 머릿글 : 내용 

(커밋 메시지를 쓸 때 이러한 룰을 따르는 이유는
팀원들과의 소통을 원활하게 하는 것과 더불어
히스토리 로그를 추적하기 쉽도록 하기 위함입니다)

$ git commit
$ git commit -m "커밋 메시지 입력" //에디터에 진입하지 않고도 커밋을 처리할 수 있습니다

$git log //:q로 나가기

*커밋 작업중 무한 dquote에 빠졌을 때는 Ctrl + G를 눌러서 빠져나갈 수 있습니다




4. branch



지금까지는 커밋 히스토리를 한 줄로만 진행해왔지만
코딩 작업중 기능이 구현된 코드를 그대로 남겨두고
새로운 시도와 테스트를 하고 싶은 경우가 생길 때가 있습니다

branch는 이런 고민이 생겼을 때 또 다른 가지(브랜치)를 만들어
새로운 커밋 히스토리를 뻗어나갈 수 있게 해주는 명령어입니다

git branch : 새로운 브랜치를 생성합니다

git branch "branch 이름"
// git branch develop

git branch 명령어로 새 가지를 만들면 커밋 히스토리가 나아갈 방향이
maindevelop 두 갈래로 나뉘게 됩니다


이제부터는 우리가 뻗어나갈 가지를 이리저리 이동할 수 있습니다

git switch "branch 이름"

(git branch만 입력했을 때 이름 앞에 별표(*)가 뜨는 것이 현재 선택된 가지입니다)


git switch -c "branch 이름"

(↑ branch를 만듦과 동시에 이동시키는 명령어입니다)


git branch -d [branch 이름]

branch를 삭제하는 명령어 옵션입니다.
(대신 현재 선택중인 branch라면 오류가 발생합니다.
이 경우는 switch 명령어로 선택중인 branch를 바꾸고나서 삭제해야 합니다.)


branch 이름을 바꿀 수도 있습니다.

git branch -m [기존 branch 이름] [바꿀 branch 이름]

*git branch의 default 이름은 master였지만
최근에는 'main'으로 바꿔쓰는 추세라고 합니다.

git switch 2e7aa678c9a7143564625a76c437e477c09f9ed1

해당하는 해시값을 가진 상태를 출력합니다

git switch main

git이 바라보고있는 디렉토리가 master로 바뀝니다.

git checkout [해시값]

해시값으로 체크하는 코드는 구경만...

git switch -d [해시값]

switch 명령어의 -d 옵션은 해시값을 찾아 이동하고자 할 때 사용합니다.
(switch, restore는 원래 체크아웃 명령어의 기능 중 하나였지만
체크아웃 명령어가 하는 기능이 너무 많아서 기능을 분리)


5. Git Graph


VSCode의 유용한 확장프로그램 중 하나인 Git Graph를 설치해봅시다

설치를 마치면 VSCode 좌측의 탭으로 가서 빨간 네모박스에 그려진 아이콘을 클릭합니다.

이 확장프로그램을 이용하면 작업의 진행척도나 커밋 메시지 등의 다양한 정보를
한 눈에 쉽게 확인할 수 있게 됩니다.

가운데가 비어있는 동그라미 표시가 HEAD가 가리키는(현재 바라보고 있는) 작업시점이며
git switch 명령어를 이용하면 HEAD를 이동시킬 수 있습니다



6. reset, revert

둘 다 롤백을 위해 사용하는 명령어이지만 기능상으로 큰 차이가 있습니다

  • reset : 커밋 내역(히스토리)을 삭제하면서 이전으로 돌아갑니다.
  • revert : 히스토리를 남긴 채로 이전으로 돌아갑니다
    대신 되돌리고자 했던 커밋 내역이 HEAD로 올라갑니다 (Copy & Paste)

먼저 git log를 입력해서 되돌리고 싶은 커밋 시점의 해시값을 찾습니다

git log // 커밋 히스토리를 조회합니다



reset 명령어를 먼저 사용해보겠습니다

6-1. reset

// 문법
git reset [commit 해시값]
// or
git reset --mixed [commit 해시값]
  • git resest 명령어에는 3가지 옵션이 있습니다.
    • --mixed : reset 명령어의 기본 옵션이며 생략이 가능합니다
    • --hard : 되돌아가고자 하는 히스토리 경로에 있는 커밋 내역을
      히스토리까지 완전히 삭제합니다. 이 옵션을 이용해서 되돌렸을 때는
      Working directory와 Repository가 일치하게 됩니다
      (git status를 썼을 때에도 올그린)
    • --soft : 히스토리상의 코드를 삭제하지 않고
      Repository에서 Staging area로 보냅니다
      또한 Working directory(저장소)에는 코드가 남아있습니다

덧붙여서 reset --hard를 통해 삭제학 내역을 복구하는 것도 가능합니다.

git reflog
// git reset, git rebase 명령어로 삭제된 커밋을 포함한 모든 커밋 히스토리를 출력합니다

git reset --hard "git reflog를 통해 찾은 해시값"

단, 이 방법을 써서 삭제한 내역을 복구한다 하더라도
재생시킨 데이터를 기존의 히스토리와 합치는 것은 무척 어렵습니다
(작업중 큰 실수를 했을 때 최후의 수단으로써 알아두기만 합시다...)

대신 잘못 commit한 한 줄의 history만 삭제해야할 경우에는
reset --hard를 유용하게 사용할 수 있습니다.

git reset --hard HEAD^
//  or
git reset --hard HEAD~1
// 숫자 1은 가장 최근의 커밋 내역, 숫자 2는 그 다음을 뜻합니다



6-2. revert

revert는 커밋 히스토리를 삭제하는 것이 아니라
되돌아갈 지점을 히스토리를 최상단에 새로 만들면서 되돌리는 방법입니다.

reset에 비해 안전한 만큼 자주 쓰이는 명령어이지만
구동 원리를 이해하는 것이 다소 어려울 수 있습니다



사용상 주의점 ~ 충돌(reverting)

만약 되돌린 코드 내용과 이전 히스토리상의 코드 내용이 겹치면서
그 값이 다른 경우(충돌)에는 커밋이 바로 진행되지 않고
되돌린 코드가 working directory에 생성됩니다

이때는 사용자가 직접 사용할 코드 내용을 선택하고 정리한 뒤
git revert --continue를 입력,
그게 아니라면 git revert --abort로 명령어를 취소해야 합니다.



0개의 댓글

관련 채용 정보