git 은 소스코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'입니다. 즉, git을 사용하면 프로젝트를 구현한 소스 코드의 변경 이력을 쉽게 확인할 수 있고, 특정 시점에 저장된 버전과 비교하거나 원하는 시점으로 되돌아갈 수도 있어 프로젝트 파일을 관리하기에 정말 좋은 도구입니다.

이와 같이 파일과 폴더를 관리하면 어떤 폴더가 가장 최근 폴더이고, 두 폴더 사이에 어떤 변화가 있는지 파악하기 힘들어지지 않을까요? 그래서 개발자들은 이러한 불편함을 해결해줄 수 있는 Git을 많이 사용합니다.
프로젝트를 진행하면서 가장 처음 마주한 위기가 바로 Git이었는데, 이 기회에 한번 개념을 차근차근 정리해보려고 합니다.
주로 터미널에서 Git 명령어를 작성하는 CLI 방식으로는 초보자가 사용함에 어려움이 있어, 개념 공부를 하면서 Sourcetree 라는 상용 Git GUI 프로그램을 통해서 git 브랜치들의 변화 추이를 시각적으로 확인하며 실습까지 진행해보려고 합니다.
원격 저장소(Remote Repository)와 로컬 저장소(Local Repository)라는 개념이 있습니다. 말 그대로
Github에서 새로운 Repository를 생성하는 과정은 원격 저장소를 생성하는 것이고, 이렇게 생성된 원격 저장소와 로컬 저장소와 연결을 합니다. 연결 이후에는 로컬 저장소에 있던 파일을 Push 명령어를 통해서 원격 저장소로 파일과 폴더를 업로드합니다. 또는 다른 사람의 원격 저장소를 내 로컬 저장소로 가져올 수도 있습니다.

Github에서 새로운 원격 저장소를 생성하면 보여주는 명령어들이 있습니다. 이 명령어들을 차례대로 입력하게 되면 로컬 저장소와 원격 저장소가 연결이 됩니다. 즉, 이 명령어들은 로컬 저장소의 터미널 또는 Git Bash에서 차례대로 작성하면 됩니다.
echo "# test >> README.md"
-> README.md 라는 파일에 "# test"라는 텍스트를 적고, 저장하는 명령어입니다.
git init
-> 현재 작업 장소를 Git 로컬 저장소로 초기화하는 명령어입니다. 이 명령어를 입력하게 되면 .git 이라는 폴더가 생성되고, Git이 프로젝트의 변경 사항을 추적할 수 있게 됩니다. 또한, Git Repository로 변환이 되었기 때문에 Git 명령어를 사용할 수 있습니다.
git add README.md
-> echo "# test >> README.md" 이 명령어를 사용하게 되면 Untracked 상태인 README.md 파일이 생성되고, git add 명령어를 통해서 Staging Area에 해당 파일을 추가합니다. 로컬 저장소에 작업 이력을 기록할 즉, commit할 대상들이 위치하는 영역인 Staging Area로 작업이 진행된 파일들을 추가합니다.
git commit -m "first commit"
-> git add 명령어를 통해서 Staging Area에 추가된 파일들을 "first commit"이라는 메시지와 함께 로컬 저장소에 작업 이력을 기록합니다.
git branch -M main
-> 현재 브랜치의 이름을 강제로 main으로 변경합니다. -M 옵션을 통해서 기존에 같은 이름의브랜치가 있어도 강제로 덮어씁니다. 기본 브랜치 명으로 master라는 이름도 존재하긴 하지만, 최근 Git에서는 기본 브랜치 이름으로 main을 사용하는 추세입니다.
git remote add origin [ REMOTE_URL ]
-> 해당 옵션을 통해서 로컬 저장소에 원격 저장소를 추가합니다. 여기서 origin은 REMOTE_URL의 별칭으로 origin == REMOTE_URL을 의미합니다.
git push -u origin main
-> git commit 명령어를 통해서 로컬 저장소에 작업 이력을 저장한 내용을 origin(= REMOTE_URL)이라는 원격 저장소의 main 브랜치에 업로드 시켜줍니다. 여기서 -u 옵션은 로컬 저장소의 main 브랜치와 origin 원격 저장소의 main 브랜치를 연결시켜주는 작업으로, 이후에 동일한 로컬 브랜치에서 git push 또는 git pull 명령어를 입력할 때, 주소를 따로 적어주지 않아도 자동으로 main - origin/main으로 연결시켜주는 옵션입니다. 새로 생성된 모든 브랜치에 최초의 Push 명령어를 사용할 대에만 -u를 추가해주면 자동으로 원격 저장소의 브랜치와 연결되어 추적 관계를 형성시켜줍니다.