본문 바로가기

CS 학습 정리

Git의 작동원리와 기본 사용법, rebase 와 merge, fork의 사용이유

728x90

Git 이란?

- 어렵게 생각할 필요 없이 많은 개발자들이 특정한 코드들을 함께 관리하고, 버전관리를 쉽게 할 수 있도록 만든 프로그램이다. 

 

Git 용어 정리

  • add : 작업 디렉토리에서 변경된 파일들을 스테이징 영역에 추가. 커밋의 전 단계라고 보면 된다.
  • commit : 스테이징 영역에 있는 변경 사항을 실제 로컬 저장소에 기록한다.
  • branch : 독립적으로 작업 가능한 브랜치를 생성한다. 예를들어 만약 A기능을 실험하고 싶다면 실험A 브랜치를 만들어 실험할 수 있다.
  • checkout (또는 switch) : A 브랜치에서 B로 이동하여 작업하고 싶을 때 사용한다.
  • push : 위에서 커밋한 내용을 실제 원격 저장소에 내보내기 위해 사용한다.
  • pull : 원격 저장소의 변경 사항을 로컬 저장소로 가져온다. push 전엔 언제나 pull을 받아야함을 기억하자.
  • Repository : 코드의 변경 사항을 기록하고 관리하는 데이터베이스로 저장소라 한다. 저장소는 코드의 모든 역사와 버전을 기록한다.
  • working Tree : 작업 디렉토리. 저장소의 특정 버전을 체크아웃했을 때 그곳을 작업 디렉토리라 한다.

 

Git 기본 명령어

- git clone : 서버 저장소의 데이터를 로컬 컴퓨터로 복사

 

- git checkout : 작업하기 원하는 브랜치로 이동

 

Commit 과 Push 의 차이점

위에서 커밋이 저장되는 것이라 했다. 그러나 커밋만으론 다른 사람들이 내 코드를 볼 수 없고 푸쉬, 즉 원격 저장소로 밀어줘야 가능하다. 그리고 git 에는 local repository 와 remote repository 가 존재한다. 로컬은 내 개인 피씨안에 존재하는 깃 레포지토리이고 다른 하나는 실제 원격 저장소와 연결된 레포지토리이다.

 

Git이 add  -> commit -> push 할 때 내부에서 일어나는 일

1. 작업 디렉토리에서 작업 후 add 하면 staging area에 들어간다. 여기서 staging area 란 커밋 전 임시러 저장하는 공간을 말한다. 작업 디렉토리와 로컬 레포지토리의 중간지점이라 보면 된다.

2. 커밋시 레포지토리에 실제로 코드가 저장된다. 

3. 푸쉬하면 그때서야 원격 저장소에 올라가게 된다.

커밋의 단위와 지점

그래서 커밋을하면 저장되는 건 내 로컬 레포지토리이고 실제로 올려주기 위해 푸쉬를 해주어야하는 것이다.

 

커밋의 단위는 그 지점에서 반드시 버그가 없고 작업을 시작할 수 있는 지점으로 잡는다.

 

만약 로그인을 만든다고할 때 로그인 config를 만들었다면 커밋한다.

 

fix: 고침

feat: 기능 구현

 

git pull rebase , merge 의 차이점

 

협업을 하던 중 내가 올린 코드를 다른 동료가 받아서 작업하였고 그것을 내가 다시 pull 받아야하는 일이 생겼다. 그런데 

 

hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint: 
hint:   git config pull.rebase false  # merge
hint:   git config pull.rebase true   # rebase
hint:   git config pull.ff only       # fast-forward only
hint: 
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.

 

라는 오류가 발생했다. 이것은 내 로컬 브랜치와 풀을 받았을 때 분기가 생겼다는 의미로 이 경우 깃은 어떤 코드를 써야할지 모르기 때문에 사용자에게 병합 방법을 묻고 있다.

 

1. rebase 

- rebase 는 이름 그대로 베이스를 바꾼다는 것을 뜻한다. 브랜치들은 각각의 베이스를 갖고 그 베이스를 시작으로 작업이 진행된다. rebase는 내 근본을 바꾸는 행위이다. 그래서 원격 저장소의 master나 main에서는 하지 않는 것이 좋다.

 

c와 d 브랜치를 merge하지 않고 rebase, 시켰다.

 

원래 D는 B에서 나온 분기였다. 하지만 rebase 함으로서 D는 c의 다음 분기가 되었다.

 

2. merge

 

머지는 모두 알고 있는 방법으로 두 브랜치를 합치는 행위이다. 

 

Fork 의 사용 이유와 Fork 란

"포크(fork) 또는 소프트웨어 개발 포크, 프로젝트 포크(project fork)는 개발자들이 
하나의 소프트웨어 소스 코드를 통째로 복사하여 독립적인 새로운 소프트웨어를 개발하는 것을 말한다. 
오픈 소스 소프트웨어의 경우 소스 코드가 공개되어 있고, 프로젝트에서 소스 코드를 통째로 복사하는 것이 
허용되는 라이선스를 채택한 경우, 원저작자에 의해 재사용을 허가받은 코드이기에 포크를 통한 
새로운 소프트웨어 개발이 가능하다. 레드햇 리눅스(Red Hat Linux)를 포크하여 CentOS가 생겼고, 
데비안(Debian)을 포크하여 우분투(Ubuntu)가 생겼고, MySQL을 포크하여 MariaDB가 생겼다."

 

라고 한다. 포크덕분에 개발자들이 더욱 윤택(?)한 프로그램들을 사용할 수 있게 되었다.

 

즉, 포크는 어떤 프로그램을 원격저장소의 브랜치에 계속 저장하지 않고 개인 저장소에서 작업할 수 있도록 해준다.