다른 git 설명 글을 보니까 내 스타일대로 다시 써보고 싶어서 나도 써봄
Git이란?

Git은 파일들이 바뀌었을 때 그 내역을 관리할 수 있는 기능을 제공하는 프로그램이다.
나무위키에 들어가서 대충 관심있는 아무 문서를 하나 열고 오른쪽 위를 보면 '역사'라는 버튼이 있다.
이 버튼을 누르면 이 문서가 누구에 의해서 어떻게 변경되었는지 모든 내역이 나오는데 이거랑 거의 비슷하다.
Git의 기본적인 작업 방식
깃을 통해서 프로그램 코드의 변경사항을 관리를 하는 과정은 다음과 같다.
1. 어떤 기능을 만들기 위해 이런저런 코드 파일들을 수정한다.
2. 수정한 파일들 중 변경 내역을 남길 파일들을 스테이지(stage) 단계에 추가(add)한다.
3. 변경 사항에 대한 설명(커밋 메세지, commit message)을 작성하고 저장(커밋, commit)한다.
협업을 위한 Git의 작업 방식
Git은 여러 사람들과 작업하는걸 지원하는데 변경 내역을 서로 주고 받아서 일치시키는 방식을 사용한다.
실제로 작업을 하게되면 다음과 같이 진행된다.
1. 프로그래머 A가 코드를 수정해서 2,3가지 커밋을 함
2. 프로그래머 A는 이제 수정사항을 다른 프로그래머들에게 공유하기 위해 원격 서버(Remote)에 자신의 변경 내역을 업로드(푸시, Push)함
3. 프로그래머 B는 A의 수정사항을 원격 서버에서 가져옴(풀, Pull)
4. 프로그래머 B가 기존에 작업하던 부분이 A가 작업하는 부분과 겹쳐서(충돌, Conflict) 내려받는 과정 중에 일시중지 됨
5. 프로그래머 B는 겹친 부분에 대한 두 소스코드를 검토하고 더 적절한 코드를 선택하거나 직접 작성하여 해결(Resolve)하고 작업을 계속 함
만약 변경사항이 서로 겹치지지 않는다면 4,5번 과정 없다고 생각하면 되겠다.
Git에서 사용하는 기능 및 용어
저장소(Repository)
git이 파일 변경 사항을 추적, 관리하는 공간을 말한다.
보통은 프로젝트 폴더를 저장소로 지정해서 관리해서 둘의 차이를 알기 어렵지만
용도에 따라서 2개 이상의 프로젝트를 모아놓은 폴더를 저장소로 지정하기도 하기 때문에 엄밀하게 구분할 필요가 있다.
스테이지(Stage)
git은 레포지토리 내의 모든 파일의 변경 사항을 추적 관리한다.
추적 관리되는 파일 중에서 커밋하고 싶은 녀석들만 모아놓은 공간을 스테이지라고 한다.
스테이지에 있는 파일들은 '스테이징 된 파일' 등으로 부른다.
커밋(Commit)
스테이징 된 파일들의 변경 사항을 저장하고 내역을 남기는 걸 말한다.
커밋 하나는 변경된 파일 전체를 저장하는게 아니라 파일에서 실제로 변한 부분만 기록한다.
파일들이 변한 것만으로는 뭘 한건지 알기 어려우니 커밋 메세지라는걸 작성해서 변경사항의 의도를 남긴다.
브랜치(Branch)
커밋 하나는 파일에서 변한 부분만 기록된다는 특징 덕분에 이전 커밋과 이어지는 모양을 띄게 된다.
이를 그래프로 보면 나뭇가지 같다고 하여 브랜치라는 이름을 붙여 사용한다.
개발을 하다보면 기존 코드를 그대로 두거나 혹은 2가지 이상의 다른 형태의 코드를 구현해봐야하는 상황이 필요할 때가 있는데
이때 브랜치를 새로 만들어 커밋 줄기를 나눠서 개발을 이어가는 식으로 사용한다.
처음 git 저장소를 만들게 되면 기본적으로 main 브랜치(구 master)가 생성된다.
병합(Merge)
보통 개발을 하면 main 브랜치에는 버그, 오류가 없이 안정적인 실행 가능한 코드 상태를 보존해두는데
브랜치를 나눠서 개발하다가 버그, 오류 없는 마음에 드는 기능을 완성하면 이를 main에 합치게 된다.
이 과정에서 하는 것을 병합이라고 하고 git을 통해서 어느 정도 자동으로 된다.
충돌(Conflict)
병합을 할 때 코드가 얌전히 그냥 합쳐진다면 참 좋겠지만...
하나의 파일을 분기해서 2개의 브랜치를 만들어서 수정하고 나면
두 브랜치 중 나중에 병합하려는 브랜치는 두 변경 사항 중 어느게 최신인지 모르게 되는 상황이 발생한다.
이러면 병합이 진행되지 않고 어느 쪽 코드를 취할 것인지 묻는데 이를 충돌이라고 한다.
충돌이 나게 되면 3가지 방법 중 하나를 골라서 해결(Resolve)하게 된다.
1. 원래 있던 코드를 쓴다(Mine)
2. 새로 들어오는 코드를 쓴다(Their)
3. 두 코드를 참고해서 직접 재작성한다
원격 저장소(Remote Repository)
엄밀하게 git은 로컬 단계에서 관리가 된다. 만지고 있는 컴퓨터에서만 이 기록이 관리된다는 뜻이다.
별다른 조치 없이 git으로 관리하다가 컴퓨터 포맷하면 프로젝트가 다 날아간다.
이런 끔찍한 일이 발생하지 않기 위해 저장소를 서버에 업로드를 해놓을 필요가 있다.
이 때 서버에 업로드된 저장소를 원격 저장소라고 한다.
푸시(Push)
원격 저장소에 로컬 저장소의 변경 내역을 업로드 하는 것을 말한다.
풀(Pull)
원격 저장소의 변경 내역을 로컬 저장소로 가져오는 것을 말한다.
로컬 저장소의 브랜치는 원격 저장소의 브랜치 정보를 기억하고 있고 풀을 하면 이에 맞춰서 브랜치의 최신화 작업을 한다.
GUI 환경 지원

위 사진을 보면 알다시피 본래 git은 CLI(콘솔 환경) 프로그램이라서 접근성이 끔찍하다.
많은 개발자들이 이를 잘 알고 있기 때문에 GUI 환경으로 만든 프로그램들이 있고 몇가지를 소개한다.

VS Code를 사용하고 있다면 Source Control 메뉴에서 Git 제어를 제공한다.
상당히 메뉴가 잘 되어있는 편이므로 평소엔 이를 쓰면 좋다.

SourceTree 라는 Atlassian이라는 회사에서 제공하는 무료 소프트웨어도 있다.
이 프로그램은 각 브랜치의 흐름을 그래프로 보여주는 기능이 있기 때문에 코드 변경 사항 흐름을 파악하기 좋다.

GitKraken이라는 월단위 구독제 유료 프로그램도 있다.
이 녀석도 꽤 강력한 그래프 기능을 제공하고 커밋 기록을 재정리하는데 있어서도 수준 높은 UI를 제공한다는 장점이 있다.
대학생일 경우 학생 인증을 통해서 무료로 사용해볼 수 있다.
Git의 디테일한 사용방법은 이제 구글에 검색하면 지천에 깔려있기 때문에 필요할때마다 찾아보면서 하면 되겠다.
원격 레포 만들어서 관리하는 방법이랑 Git 브랜치 관리 전략 같은건 별개의 게시물로 작성함