2024. 3. 13.
목차
배운 내용 정리
기본적인 터미널 명령어
정말 많이 쓰이는 명령어지만 항상 필요할 때마다 기억이 잘 안난다…
이 기회에 제대로 외워두자.
# 현재 디렉토리 위치 출력
$ pwd
# 현재 디렉토리에 있는 내용 출력
# 옵션 : long(-l), all(-a)
$ ls
# 디렉토리 변경
$ cd [위치]
# 디렉토리 생성
$ mkdir [디렉토리명]
# 파일 생성
$ touch [파일명.확장자명]
# 파일 내용 read 하기
$ cat [파일명.확장자명]
# 파일 제거
$ rm [파일명.확장자명]
$ rm -rf /
# 파일 이동 / 복사
$ mv [파일명.확장자명] [이동할 디렉토리]
$ cp [파일명.확장자명] [복사할 디렉토리]
# 파일 검색
$ grep "키워드" [파일명.확장자명]
Vim
리눅스 에디터의 꽃인 Vim이다.
다른 사람들은 적응되면 편해서 Vim만 쓰게 된다는데 난 아직도 이해가 잘 안된다… 왜 좋은지는 아직 잘 모르겠지만 어쨌든 서버 컴퓨터에서 작업할 때 많이 쓸테니 사용법은 확실히 알아두자.
# (파일이 없다면 파일 생성 후) vim 에디터로 파일 열기
$ vim [파일명]
Vim 에디터로 진입하면 처음에는 일반 모드(Normal Mode)로 설정된다. Vim에서 사용할 수 있는 모드는 다음과 같다.
- 일반 모드(Normal Mode) : 커서 이동, 드래그, 복사 같은 간단한 작업만 가능하다.
- 입력 모드(Insert Mode) : 문서 편집은 이 모드에서 이루어진다.
- 명령라인 모드(Command-line Mode) : 파일 저장, Vim 종료 등의 명령을 실행할 수 있다.
- 비주얼 모드(Visual Mode) : 잘 몰?루
모드간 전환 방법은 다음과 같다.
- 일반 모드 → 입력 모드 :
i
, o
, a
, s
중 하나의 키(대소문자 구분됨)를 누르면 모드를 변경할 수 있다. 각 키의 차이는 편집을 시작할 위치가 현재 커서의 위치에 대하여 어느 곳에 위치해 있는지 를 결정한다.
- 일반모드 → 명령라인 모드 :
:
를 입력하면 모드를 변경하고 이어서 명령어를 작성할 수 있다.
- 입력/명령라인 모드 → 일반모드 :
ESC
키를 입력한다.
다음은 Vim을 종료할 때 사용하는 명령어이다.
# 명령라인 모드에서
# 그냥 종료 (파일이 편집되지 않아야 함)
$ :q
# 저장하고 종료
$ :wq
# 강제로 종료 (모든 변경사항을 잃어버림)
$ :q!
이외에도 문서를 편집할 때 도움을 주는 정말 많은 명령어와 핫키들이 있지만 나중에 알아보도록 하자… 너무 많다
Git
Git은 파일을 담아두는 저장소를 로컬과 원격으로 분리하여 버전 관리를 용이하게 해주는 버전 관리 시스템(VCS)이다.
로컬 저장소는 작업 디렉토리(working directory), 임시 저장소(staging area), .git directory(repository) 로 구분된다.
- 작업 디렉토리 : 컴퓨터에 존재하는 실제 디렉토리라고 생각하면 된다.
- 임시 저장소 :
git add
명령어로 파일을 스테이징하면 보내지는 곳이다.
- .git directory :
git commit
명령어로 커밋하면 임시 저장소의 스냅샷을 저장하는 곳이다.
원격 저장소는 보통 Github을 사용하며 협업을 위해 로컬 저장소의 내용을 올리는 공개된 장소이다. git push
명령어로 커밋된 내용을 업로드한다.
일반적으로 Git을 사용하는 흐름은 다음과 같다.
git pull
명령어로 원격 저장소에서 갱신된 내용을 로컬 저장소에 반영한다
- 작업 디렉토리에서 파일을 편집한다
- 편집을 마치면
git add
명령어로 커밋 대상이 될 파일들을 스테이징 한다
git commit
명령어로 스테이지에 올라간 파일들을 커밋한다
git push
명령어로 로컬 저장소의 내용을 원격 저장소에 반영한다
대표적이고 자주 쓰이는 Git 명령어는 다음과 같다.
# 현재 디렉토리가 working directory임을 선언하기
## 이 명령어를 실행하면 .git 폴더가 생긴다
$ git init
# 현재 디렉토리에 원격 레포지토리를 수동으로 연결하기
$ git remote add [원격 레포지토리 이름] [원격 레포지토리 주소(URL)]
# 원격 레포지토리를 로컬에 그대로 복사하기
$ git clone [원격 레포지토리 주소(URL)]
# 현재 Git 관련 상태 출력하기
$ git status
# 원격 레포지토리의 최신 내용을 로컬에 적용하기
$ git pull
# 파일을 staging area로 옮기기
$ git add [파일명]
# 파일명 대신 . 을 사용하면 현재 디렉토리(하위를 포함해서) 전체를 staging한다
$ git add .
# 커밋하기
$ git commit -m "커밋메시지"
# 푸시하기
$ git push [원격 레포지토리 이름] [브랜치 이름]
# push 경로 저장하기
## 아래와 같이 u 옵션을 준다면 git push 명령어 만으로도
## 설정한 원격 레포지토리와 브랜치로 자동으로 push를 해준다
$ git push -u [원격 레포지토리 이름] [브랜치 이름]
# 지금까지의 커밋 히스토리를 보려면
$ git log
# git branch 생성
$ git branch [브랜치명]
# branch 생성과 동시에 이동 (많이 사용)
$ git checkout -b [브랜치명]
# branch 이동
$ git switch [브랜치명]
Git과 협업
Git Flow
Git에서 협업을 수행하는 전략 중 대표적인 예시는 Git Flow가 있다. 대부분의 프로젝트에서 사용하는 방법으로 꼭 알아두어야 한다.
Untitled
feature
, develop
, release
, hotfix
, main(master)
의 5가지 브랜치로 작업을 수행하며, 기능 구현, 배포, 버그 수정 등 다양한 상황에 따라 브랜치를 새로 만들고 병합하는 과정을 연속하여 협업을 진행하게 된다. 자세한 브랜치 별 설명은 다음과 같다.
- main branch : 배포의 용도로만 사용하는 브랜치이다.
- develop branch : 개발 과정의 중심에 있는 브랜치이다. feature와 release branch는 이 develop branch로부터 checkout된다.
- feature branch : 기능을 개발하는 브랜치이다. 각 기능 별로 branch가 세분화 될 수 있으며 기능 구현이 끝나면 develop branch로 merge된다.
- release branch : main branch로 넘어가기 전 배포 확인을 하는 브랜치이다. 버그 수정과 QA 단계가 여기에서 일어난다. 배포 확인이 끝나면 main branch로 버전 태그를 붙여서 merge된다. 물론 develop branch로도 merge되어 업데이트가 적용된다.
- hotfix branch : 예기치 못한 오류가 발생했을 때 사용하는 브랜치이다. main branch로부터 checkout하여 빠르게 수정을 거친 뒤 main branch로 merge된다. 그리고 다른 branch로도 merge되어 각 branch에 수정사항을 적용해야 한다.
fetch와 merge
서로 다른 브랜치를 병합하기 위해서는 merge를 해줘야 한다. 이때 git fetch
와 git merge
명령어가 사용된다. 아래는 상세한 과정이다.
- 다른 브랜치의 수정사항들이 반영되어야 할 브랜치로 이동한다. (
git switch
사용)
git fetch
명령어를 이용해 원격 저장소의 최신 변동사항이 있는지 확인한다.
- 현재 브랜치에 변동사항이 있다면 merge 전
git pull
을 이용해 반영해준다.
git merge [브랜치명]
으로 merge한다.
git reset
커밋을 취소하거나 삭제하는 방법으로, 아래와 같은 여러 옵션들이 있다.
--soft
: repository에서 statging area로 커밋 이력을 되돌려 놓는다.
--mixed
: (기본값) repository에서 working directory로 커밋을 되돌려 놓는다.
--hard
: 모든 변경 이력을 삭제시켜 되돌려 놓는다. 이 과정은 취소할 수 없다.
git stash
working directory와 staging area의 내용들을 임시 공간에 보관하여 비우는 방법이다. 아래와 같은 상황일 때 사용한다.
-
작업 도중 branch가 잘못되었다는 것을 뒤늦게 알았을 때
: 모든 변경사항들을 복붙해서 하나하나 옮길 필요 없이, git stash
명령어로 모든 변경사항들을 임시로 저장하고 git switch
로 브랜치를 알맞게 옮긴 다음 git stash pop
으로 손쉽게 이동시킬 수 있다.
-
원격 레포지토리의 변동사항을 적용하지 않고 커밋했을 때
: git reset
으로 올린 커밋을 취소하고 working directory로 불러와 git stash
를 실행한다. 그리고 git pull
로 변동사항을 반영하고 git stash pop
을 이용한다. 다만 원격 레포지토리의 변동사항과 stash에 존재하는 변동사항이 conflict를 일으킬 수 있다는 것을 생각해 두자.
Github 활용
.gitignore
.gitignore로 특정 디렉토리나 파일을 git이 관리하는 영역에서 제외시킬 수 있다.
Markdown
Github의 README.md와 블로그 등에서 많이 사용되는 마크업 언어이다.
Issue
Github Issues는 작업 계획, 토론 및 추적을 위해 만들 수 있는 항목이다. 다음과 같은 상황일 때 사용한다.
- 마일스톤 생성을 통한 프로젝트 진행 상황 관리
- Issue를 통한 Branch 생성으로 해당 branch의 목적을 분명히 하기
- 문제 상황 발생 시 PR이나 커밋에 연결하여 문제 상황 및 해결과정 공유
Pull Request
PR은 merge에 대한 요청이다. 그냥 git merge
명령어로 merge할 수도 있지만 PR을 통하여 다른 이들에게 병합을 공유하고 의견을 받을 수 있다는 점이 차별화된다.
PR은 Github에서 열 수 있다.
코드 리뷰
PR에서 코멘트를 남기는 방법은 다음과 같다.
- PR 페이지에서 코멘트 남기기
- PR 내의 코드에 대한 코멘트 남기기 (single comment)
- commit 페이지 또는 files changed 페이지에서 특정 코드 line에 커서를 올리면 나타나는 플러스 버튼을 클릭하고 Add single comment 버튼을 누르면 리뷰를 할 수 있다.
- 각각의 코멘트에 대한 알림이 당사자에게 전달된다.
- PR 내의 코드에 대한 코멘트 남기기 (start a review)
- commit 페이지 또는 files changed 페이지에서 특정 코드 line에 커서를 올리면 나타나는 플러스 버튼을 클릭하고 Start a review 버튼을 누르면 리뷰를 할 수 있다.
- Start a review 버튼을 누르면 리뷰가 바로 전달되지 않고 pending 상태에 놓이게 되며, 여러개의 리뷰를 등록하고 Finish your review 버튼으로 한번에 리뷰를 보낼 수 있다.
- Finish your review에는 다음과 같은 옵션들이 있다.
- Comment : 단순한 코멘트 업로드
- Approve : 문제 없이 merge해도 괜찮다는 표현을 뜻함
- Request chagnes : merge 전 수정이 필요하다는 표현을 뜻함
(응 안돼 돌아가)
후기
Git은 아무리 많이 사용해도 쉽게 익숙해지지 않고 어려운 개념인 것 같다. 특히 branch가 갈라지면 동시에 내 머리도 갈라지는 듯한 느낌을 받았다. 다만 이번 세션으로 모호했던 내용들을 다시 정리할 수 있게 되어 도움이 많이 되었던 것 같다.
그리고 Github의 코드 리뷰 기능은 오늘 처음으로 알게 된 방법이었는데, 별도의 메신저 없이도 코드에 대한 여러 의견들을 보기 쉽게 전달할 수 있는 유용한 기능이라는 생각이 들었다. 아마 협업을 시작하게 되면 정말 알차게 사용할 수 있는 기능이지 않을까라는 기대가 된다.