Q. commit은 작은 변경에 사용하고, push는 큰 변경에 사용하나?
A.
버전 관리를 위해 git을 사용하다보면 자연스럽게 원격저장소를 제공하는 서비스인 github를 함께 사용하게 된다.
이 때 작업 과정을 단계별로 나누어 생각해보면 다음과 같다.
1. 내 컴퓨터(로컬)에서 작업을 하다보면 수정사항이 발생한다.
2. 일정 단위의 작업이 끝나면 해당 작업 내용을 로컬저장소(local repository)에 commit한다.
3. 내가 원하는 모든 작업이 끝날 때 까지 1~2단계를 반복한다.
4. 내가 해야할 모든 작업이 끝났을 때 원격저장소(remote repository)인 github에 push한다.
이와 같은 과정을 거치다보면 작은 변경을 마쳤을 때 commit, 큰 변경을 마쳤을 때 push를 사용하게 된다.
(반드시 그런 것은 아니고 대게 그렇다는 것!)
Q. delta-based와 snapshot 방식의 차이는 무엇일까?
A.
Git의 공식 페이지에 들어가보면 Git과 다른 버전 관리 시스템(VCS)의 차이가 잘 설명되어 있다.
1. 다른 버전 관리 시스템은 delta-based 방식이다.
대부분의 다른 버전 관리 시스템은 변경 사항을 파일 기반의 리스트로 관리한다.
most other systems store information as a list of file-based changes. These other systems (CVS, Subversion, Perforce, Bazaar, and so on) think of the information they store as a set of files and the changes made to each file over time (this is commonly described as delta-basedversion control).
2. Git은 snapshot 방식이다.
Git은 효율성을 위해 변경되지 않은 사항은 파일 대신 링크를 저장하며 변경된 사항은 스냅샷 찍어 참조한다.
Git basically takes a picture of what all your files look like at that moment and stores a reference to that snapshot. To be efficient, if files have not changed, Git doesn’t store the file again, just a link to the previous identical file it has already stored.
https://git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F
Q. 파일이 Tracked 되는 시점은 언제인가?
A.
Git으로 관리되는 파일은 크게 Untracked와 Tracked 두 가지 상태를 가진다. 또 Tracked는 Unmodified(수정되지 않음), Modified(수정됨), Staged(commit 대기 중) 으로 나뉜다. 그래서 총 네 가지 상태(Untracked, Unmodified, Modified, Staged)로 이해해보자.
파일이 처음 생성되었을 때는 (어떤 내용이 입력되어 있더라도) Untracked 상태이다.
새로 생성된 파일을 add하면 Tracked 상태가 된다.(자세하게 Staged 상태)
이때 해당 파일을 수정하게 되면 Modified 상태가 된다.
수정된 파일을 add하면 Staged 상태가 된다.
Staged 상태의 파일들을 commit하게 되면 변경된 내용의 정보를 담은 스냅샷을 저장하고 해당 파일들은 Unmodified 상태가 된다.
따라서 새로 생성된 파일이 처음으로 add 될 때 Tracked 상태가 되며, 해당 파일이 삭제될 때 까지 Tracked 상태(자세하게 Unmodified, Modified, Staged 중 하나)가 유지된다.
https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository
Q. master 브랜치와 main 브랜치의 차이는 무엇인가?
A.
2020년 6월 고(go) 언어에서 인종차별과 관련하여 whitelist/blacklist와 master/slave라는 단어를 사용하지 않기로 하였다.
https://go-review.googlesource.com/c/go/+/236857
이후 2020년 10월 Github에서도 기본 브랜치의 이름을 master에서 main으로 변경하였다.
그러나 Git의 기본 브랜치의 이름은 master이므로 main으로 바꾸어 사용하여야 한다.
git init 시 기본 브랜치의 이름을 main으로 설정하는 명령어는 다음과 같다.
git config --global init.defaultBranch main
확인을 위해 다음과 같은 명령어를 입력해보면
cat ~/.gitconfig
해당 내용이 잘 들어있다.
[init]
dafaultBranch = main
이미 master 브랜치를 사용하고 있었다면 공식 페이지를 참고하자.
https://git-scm.com/book/en/v2/Git-Branching-Branch-Management
Q. add 이후 commit을 해야하는데, 그냥 바로 commit을 하면 왜 안되나?
A.
작업을 하다보면 여러 가지 변경사항이 생긴다. 이 때 변경사항을 한번에 commit 하지 않고 여러 단위로 쪼개어 해야하는 경우가 있다. 예를 들어 a와 b 기능을 만들었을 경우, a와 관련된 파일과 b와 관련된 파일을 따로 commit 해야할 때가 생긴다. 이 때, add로 필요한 파일만 Staged 상태로 만들어 commit하면 문제를 해결할 수 있다.