git-branch 이해하기

|

패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
이 포스팅에서는 ‘branch’에 대해 설명합니다.


Branch?

일반적으로 운영환경은 프로그램에 의해 돌아가는 서비스라고 하는데, 즉 실제 유저가 사용하고 있는 프로그램 상태를 의미한다.

그 운영환경에 사용되는 소스코드들이 존재하는데, 우리는 해당 소스코드를 마음대로 고쳐쓸 수는 없다. 왜냐하면 아직 수정된 코드에 버그가 있는지 확인하지도 않은 상태에서 운영환겨에 그대로 적용이 된다면, 실제 사용자가 사용할 때 바로 에러가 발생하게 되니까!

따라서 우리는 운영코드는 그대로 두고, 소스코드를 통째로 따와 그 곳에서 개발을 하고 실험을 한 뒤, 더이상 안정화가 되었다고 생각이 들었을 때, 변경사항을 운영코드에 올리도록 한다.

그런데 사실, 어떤 프로젝트를 개발한다고 했을때, 여러명의 개발자들이 자신만의 독자적인 개발을 진행하는데, 단 하나의 저장소만을 사용한다고 하면 너무 번거롭기 때문에 개발자들이 나눠서 개발을 하다가 나중에 합치는 활동을 하는데

그 과정이 마치 여러 갈래로 나뉘는 것처럼 보여 그것을 branch브랜치라고 한다.

이러한 branchgitcommit 사이를 가볍게 이동할 수 있는 어떤 포인터같은 것으로 브랜치는 특정 커밋을 가리키는 역할만 한다.

이러한 git에서는 master라는 브랜치 하나를 기본적으로 만드는데, 이 같이 master브랜치를 가지고 있는 이유는 이 브랜치가 가리키는 어떤 스냅샷, 즉 시점에 맞게 working directory를 보여주기 때문이다.

1. branch 만들기

git branch testing
# testing은 branch의 이름이다.

이때 HEAD는 master와 testing 을 가리키고 있고 그 의미는 즉슨, 같은 commit을 가리키고 있음을 뜻한다.

HEAD는 지금 작업중인 branch가 무엇인지를 알려준다. 이 헤드 포인터는 지금 작업하고 있는 local branch를 의미한다. 즉 zsh에서 master라고 표시되어 있는 이유는 지금 HEAD가 어디에 위치하고 있는지를 바로 보여주는 것이다.

1-1. 브랜치 위치 확인하기

git branch -v

이떄 git branch명령은 새로운 브랜치를 만들기는 하지만, HEAD를 옮기지는 않는다.

1-2. 브랜치 이동하기

git checkout testing

이는 master에 있던 브랜치를 testing로 옮긴다.

cd ~/
mkdir branch
cd branch
git init

git status
(no commit yet)

echo README > README
echo test.rb > test.rb
echo LICENSE > LICENSE

git add README test.rb LICENSE
git commit -m 'The initial commit of my project'

echo 'change!!!' > test.rb
Git add test.rb
git commit -m 'made a change!'

git log --oneline

testingmaster가 향하는 위치가 다름을 파악할 수 있다.

여기서 잠깐 HEAD, tag, branch는 모두 커밋을 가리키는 기능은 전부 있다.

우선, tag는 딱 한개의 commit만을 가지는 것이고, HEAD는 워킹디렉토리가 어떤 스냅샷을 보여줄거냐를 중점으로 둔다. 근데 branch는 작업을 나눠서 하고 싶을 때 브랜치는 가리키는 커밋으로 가서 작업을 하는 것이다. 즉 남기는 커밋마다 브랜치는 이동이 가능하다.

우리가 어떤 커밋을 만드냐에 따라 브랜치는 그 커밋을 계속 따라간다.

master는 운영되고 있는 코드라고 하고, 새로운 코드를 만들고 싶어서 testing branch를 만들어 거기서 작업을 하면 브랜치는 계속 갈려 나아가는데 이 작업에 만약 branch가 아닌 tag를 붙여서 작업을 한다는 것은 아예 의미가 없다.

태그는 태그에 헤드를 가져다대는것이 그 자체가 불가능하다고 생각하면 된다. 물론 가능은 한데, 다음 작업을 할때 같이 이동을 한다는 것 자체가 없다.

git 버전관리 (VCS)

|

패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
이 포스팅에서는 버전관리(VCS)에 대해 알아보며, 로컬 버전 관리(RCS)와 중앙 집중식 버전관리(CVCS), 분산 버전 관리 (DVCS)에 대해 설명합니다.


버전관리란?

버전관리시스템 (VCS, version control system)은 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템을 의미한다.

즉, VCS를 사용하면 각 파일을 이전 상태로 되돌릴 수 있고, 프로젝트를 통째로 이전 상태로 되돌릴 수 있으며, 시간에 따라 수정내용을 비교할 수 있다. 더 나아가 누가 문제를 일으켰는지 추적이 가능하고 누가, 언제, 어떻게 만들어낸 이슈인지도 알 수 있다.

로컬 버전 관리 시스템

RCS(Revision control system)는 기본적으로 Patch set을 관리한다.

Patch set은 파일에서 변경되는 부분으로 이 Patch set은 특별한 형식의 파일을 저장한다. 그리고 일련의 Patch set을 적용해 모든 파일을 특정 시점으로 되돌릴 수 있다.

중앙 집중식 버전 관리 시스템

CVCS(Central VCS)는 프로젝트를 진행하는 중 다른 개발자와 함께 작업하는 경우 생기는 문제를 해결하기 위해 개발됐다. CVCSRCS에 비해 장점이 많다. 모두 누가 무엇을 하고 있는 지 알 수 있으며, 관리자는 누가 무엇을 할 지 꼼꼼하게 관리할 수 있다.

그러나 가장 큰 결점이 있다.

가장 대표적인 것은 중앙 서버에 발생한 문제다. 만약 서버가 한시간동안 다운되면 그동안 아무도 다른 사람과 협업할 수 없고 사람들이 하는 일을 백업할 방법도 없다. 그리고 중앙 데이터 베이스가 잇는 하드디스크에 문제가 생기면 프로젝트의 모든 히스토리를 잃는 다.

물론 사람마다 하나씩 가진 스냅샷은 괜찮다.

분산 버전 관리 시스템

DVCS(Distributed VCS)는 단순히 파일의 마지막 스냅샷을 checkout하지 않는다.

그냥 저장소 전부를 복제한다.

서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있고 클라이언트 중 아무거나 골라도 서버를 복원할 수 있다. 모든 checkout은 모든 데이터를 가진 진정한 백업이다.

게다가 대부분의 DVCS환경에서는 리모트 저장소가 존재한다.

그래서 사람들은 동시에 다양한 그룹과 다양한 방법으로 협업할 수 있다.

다음 포스팅에서는 git과 관련된 용어 정리를 할 것이다.

git 사용방법 - commit, log, diff, amend, remove, move, reset, checkout

|

패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
이 포스팅에서는 git 사용방법에 대해 설명합니다.


1. setup

git.gitconfig파일에 전역 환경설정 내용을 저장하고 있다.

이 파일은 사용자의 홈 디렉토리에 있으며 사용자와 비밀번호 혹은 소스코 글자색상등을 수정할 수 있다.

1-1. 사용자설정 (User Configuration)

# git에서 사용될 사용자 설정하기
# 사용자 이름으로 설정하면 된다.

git config --global user.name "Park jihye"

# 이메일 주소도 사용자 본인의 것으로 설정하면 된다.
git config --global user.email "~@gmail.com"

# 그리고 우리는 에디터를 vim으로 설정한다.
git config --global core.editor vim

git의 설정사항을 확인하기 위해서는

git config --list

2. git 시작하기

이렇게 사용자 설정을 마치고 나면 git을 시작할 수 있다.

2-1. 내용 생성하기

버전관리를 받고싶은 컨텐츠를 생성

# 홈 디렉토리로 이동
cd ~/

# 저장소 폴더 생성
mkdir git

# 저장소 폴더로 이동
cd git

# 저장소 폴더에 새로운 폴더 만들기
mkdir basic

# 혹은
touch basic
# 이를 통해서 cd가 아닌 바로 해당 폴더로 이동을 할 수 있다.

# 파일 생성하기
touch test01
touch test02
touch test03
touch test04

# 파일 내 내용 추가하기
echo 'hello!' > test01
# hello 라는 문자가 test01 파일에 추가된다.

cat test01
# 저장된 파일내 작성된 글을 보여준다.

2-2. 저장소 생성하고 커밋하기

모든 git저장소는 .git폴더에 저장되어 잇으며 .git폴더는 사용자가 생성한 git폴더안에 있다. .git폴더는 저장소의 환경설정 정보와 저장소의 완벽한 히스토리 정보를 담고있다.

# git 저장소 생성하기
git init

# 모든 파일 저장소로 추가
git add -A

# 파일 하나만 추가하고 싶다면
git add test01

# git 저장소로 커밋하기 (첫번째 리비전 만들기)
git commit -m 'Initial commit'

# 혹은 vim을 이용해서 커밋메시지를 작성해도 된다.
# 다음에 vim에 대해서도 설명하겠다.

#로그 파일 보기
git log

2-3. diff 명령으로 차이점 확인하기

모든 파일에 변경을 가한 뒤, 차이가 생긴 부분들을 한눈에 보고 이를 저장소로 커밋한다.

# 파일 변경하기
echo "hello" > test02
echo "my name is" > test03
echo "Jihye" > test04

# 변경 사항들을 diff명령으로 확인하기
git diff

# 이때 diff명령은 staged 상태가 아닌 파일들만을 보여준다.
# 만약 staged 상태의 파일을 확인하고 싶다면
git diff --staged

2-4. Status, Diff 와 커밋 log

다음 명령들은 현재 상태(status)와 커밋 리스트를 보기 위한 것이다.

# 현재 저장소의 상태를 확인하기
git status

# 상태를 확인한경우 해당 파일의 색이 붉은 색으로 뜬다면
# modified 상태의 파일이기에 git add를 통해 staged 상태로 바꾸어줘야 한다.
# 만약 파일의 색이 초록색으로 뜬다면
# 해당 파일은 정상적으로 git add 되어 staged 상태가 된 것이다.

git status -u
# git status가 단순히 폴더의 상태만을 보여주는 거라면
# git status -u는 폴더 내 구체적인 파일들의 상태를 다 보여준다.

# 마지막 커밋한 내용과의 차이점을 확인하기
git diff

# 커밋한 히스토리 확인하기
git log

# 이때 git log -p는 그동안 내가 남긴 모든 기록을 다 보여준다.
# 즉 git log는 수정한 결과물에 대한 기록만을 보여준다면
# git log -p는 수정한 모든 사항을 다 로그기록으로 남겨 보여준다.

2-5. 커밋 메시지 수정하기

위 예제에서 커밋 메시지가 틀린경우 –amend 파라미터를 이용해 마지막 커밋 메시지를 바꿀 수 있다.

git commit --amend -m "now correct!"

단 이미 지나가버린 커밋에 대해서는 그 부분만 수정은 불가능하다.

만약 이미 한참전에 지나가버린 커밋 메시지를 수정하고 싶다면, 본인이 수정하고 싶은 커밋메시지 이후의 기록을 다른곳에 기록해 놓은 뒤 원하는 부분의 커밋메시지를 수정한 뒤 다시 이어 작성해야 한다.

그러니 반드시 커밋 메시지를 작성할 때 주의하도록 하자!

# 혹은 이전에 만들어 놓은 커밋 메시지에 빠뜨린 파일이 있었다면
# 우선 해당 파일을 git add ~ 하고

git commit --amend

2-6. 파일 삭제하기

rm teat01

2-7. 파일 이동하기

#test01 파일을 test02로 변경(이동)
mv test02 test03

2-8. 파일을 빼내오는 방법

git reset HEAD test02

이는 현재 모든 파일의 상태가 git add를 통해서 staged상태인데,

test02파일을 staged상태에서 modified상태로 변환해주는 것이다.

2-9. 전 단계로 돌아가기

git checkout -- test03

git diff를 통해 확인한 test03 수정사항을 수정하기 전 단계로 돌아가고 싶을 때 사용하는 것이다.

단, checkout의 명령은 조심해야한다

왜냐하면 checkout은 한번 사용하면 다시는 돌아갈 수 없기 때문이다. checkout을 사용한다는 것은 파일을 수정하기 전 단계로 다시 덮어쓴다는 의미이다. 따라서 이후의 수정된 내용은 다 사라지기 때문에, 수정한 내용이 정말 마음에 안들었을 경우에만 사용하도록 한다.

2-10. tag 만들기

git tag -a v1.0 -m 'v1.0이라고 한다'

더 나아가 이미 만들어 놓은 파일에 태그를 붙이고 싶은 경우

git log --oneline
# 이를 통해 얻은 로그번호를 복사하여

git tag -a v0.9 -m 'commit message!'
# 하면 된다

참고로 git log를 좀 더 자세히 보고 싶다면 (우리는 이후에 브랜치를 사용할 것이니까)

git log --oneling --all --graph

git이란 무엇인가?

|

패스트캠퍼스 웹 프로그래밍 수업을 듣고 중요한 내용을 정리했습니다.
개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
이 포스팅에서는 git에 대해 알아보며, git에서 사용하는 주요 용어에 대해서 설명합니다.


Git?

git은 분산형 버전 관리 시스템(DVCS, Distributed version control system)이며 C언어로 구현되었다.

이전 포스팅에서 공부한 바로, 버전 관리 시스템은 사용자가 어떤 파일 집합에 대한 히스토리를 생성하고 관리할 수 있도록 도우며 특정 다른 상태(어느 시점)으로 복귀(revert)할 수 있는 기능을 가지고 있다.

이때 파일 집합은 주로 소스코드들이다.

분산 버전 관리 시스템에서 모든 사용자는 완벽한 복사본을 가지고 있으며(소스코드에 대한 히스토리를 포함) 버전 관리 명령어들을 각 사용자의 로컬에서 실행할 수 있다. 이때 DVCS는 중앙 저장소 사용을 항상 요구하지 않는 장점을 갖는다.

주요용어 정리

Repository - 저장소

저장소는 히스토리, 시간/태그(tag)/분기(Branch)에 따라 다른 버전들을 가지고 있다.

git에서 저장소를 다른곳으로 복사하더라도 다시 완벽한 저장소가 되고, 작업하고 있는 복사본으로 수정본들을 얼마든지 검색할 수 있다.

  • remote repository git으로 관리하던 것을 이전까지는 local에서만 했다면 이제는 누구든지 볼 수 있는 서버 공간에서 사용하는 것

Branch & Tag - 분기와 태그

git 저장서는 모든 분기들과 태그들을 가지고 있다. 분기들 중 하나는 master라고 불리는 기본 분기이다.

사용자는 작업에 필요한 어떤 한 버전의 분기를 이 기본분기로 체크아웃(Checkout)한다. 이것을 작업카피 (Working Copy)라고 한다.

Commit - 커밋

어떤 기록의 단위, 스냅샷, 이러한 스냅샷을 이동할 수 있는 단위

소스 수정사항들은 저장소로 커밋할 수 있다.

이것은 지난 시간까지 추적된 것에 대한 새로운 리비전(Revision)을 만드는 것이다. 각 커밋은 저자와 커밋한 내용(어떻게 수정했는지, 누가 커밋했는지)을 저장한다.

즉, 내가 작업을 하면서 기능상의 의미가 생길때, 기능상의 의미있는 변화가 생길때 주로 남긴다.

Revision - 리비전

소스코드의 버전을 가리킨다.

gitSHA1 ids로 리비전을 구분한다. SHA1 ids는 160비트로 긴 편이고 16지수로 표현된다. 가장 최신버전은 HEAD로 불리는 주소로 표현되며 이전 버전은 HEAD~1으로 계속 그런 방식으로 버전이름을 가리킬 수 있다.

Snapshot - 스냅샷

파일들의 변경사항을 저장하는 순간.

gitcommit하거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여긴다.

파일이 달라지지 않았으면 git은 성능을 위해서 파일을 새로 저장하지 않는다. 단지 이전 상태의 파일에 대한 링크만 저장한다. git은 데이터를 스냅샷의 스트림처럼 취급한다.

Stream - 스트림

흐름 데이터 세트 간에서 데이터의 전송이 실행되고 있는 것으로, 문자 형식의 데이터 항목이 연속한 열로 되어 있는 것이다.

Configuration

배열, 배치, 환경상태

Initialize

초기 내용을 설정하는 것

Pointer - 포인터

다른 객체(=단위 1개)를 가리키기 위해 존재하는 자료형

이 안에 든 자료는 문자, 숫자도 아무것도 아니고 그냥 ‘나는 어떤 커밋을 가리키고 있어’라는 의미를 가진다.

vim 사용방법

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


vim사용법에 대해서 알아본다.

Install

macOS

brew install vim

### https://github.com/Fastcampus-WPS-8th/Tips/blob/master/vim.md