Git이란? (2)
- 코드 버전 관리를 할 수 있는 프로그램입니다.
- GitHub를 통해 협업을 가능하게 해줍니다.
Git의 역사에 대해 설명해주세요. (5(10))
- 리누스 토발즈가 리눅스를 만든 이후에 BitKeeper라고 하는 툴로 리눅스의 각 버전들을 관리하고 있었습니다.
- BitKeeper가 유료화된 후 리누스 토발즈는 본인이 직접 버전 관리 프로그램인 Git을 만들었습니다.
- Git은 당시에 아래와 같은 목표를 갖고 설계 및 제작되었습니다.
- 빠른 속도
- 단순한 디자인
- 비선형적 개발 지원
- 완전 분산형 시스템
- 리눅스와 같은 거대한 프로젝트도 속도 저하의 문제없이 관리할 수 있는 시스템
- Git은 버전 관리(version control), 협업(cooperation)에 필요한 여러 요소들이 고려되었기 때문에, 사용성이 굉장히 좋은 프로그램이 될 수 있었습니다.
- Git의 뜻
- "git" can mean anything, depending on your mood
- 유닉스 커맨드에서 사용되는 명령어 이름을 제외한 랜덤한 알파벳 3글자의 조합
- 멍청하고 단순한(이런 특성을 지닌 아무 단어로 해석되어도 좋다는 의미)
- global information tracker의 약자
- goddamn idiotic truckload of shit이라는 욕설의 약자
GitHub란? (1)
- Git으로 관리하는 프로젝트를 올려둘 수 있는 원격 저장소를 제공해주는 사이트입니다.
Repository란? (2)
- 프로젝트 디렉토리 내의 .git 디렉토리입니다.
- 프로젝트의 변경 사항들(commit)이 저장되어 있습니다.
Commit이란? (2)
- 프로젝트 디렉토리의 모습을 하나의 버전으로 남기는 동작과 결과물입니다.
- 커밋하는 당시의 프로젝트 디렉토리의 모습이 스냅샷처럼 레포지토리에 저장됩니다.
Repository를 만드는 법은? (1)
git init PATH
명령어로 비어있는 레포지토리(.git 파일)을 생성합니다.
Commit하는 방법은? (3(7))
- 처음으로 커밋을 하기 전에 사용자의 이름과 이메일 주소를 설정해야 합니다.
- `git config user.name "user_name"
- `git config user.email "user_email"
- 커밋 하기 전에 working directory 상의 변경 내용을 staging area에 추가해야 합니다.
- `git add path1 path2 ...
-A
옵션을 사용하면 최상위 디렉토리에서git add .
를 한 것처럼 어디에 위치하든 항상 모든 변경 내용을 add합니다.-p
옵션을 사용하면 모든 변경 내용을 확인하면서 add할 수 있습니다.git status
로 staging area의 상태를 볼 수 있습니다.
- `git commit -m "commit message"
Git의 3가지 작업 영역은? (3)
- working directory: 작업을 하는 프로젝트 디렉토리입니다.
- staging area: git add를 한 파일들이 존재하는 영역으로 커밋을 하게되면 staging area에 있는 파일들만 커밋에 반영됩니다.
- repository: 커밋들이 저장되는 영역입니다.
Git이 보는 파일의 4가지 상태는? (2(3))
- Untracked: 한 번도 staged된 적 없는 상태
- Tracked: staged된 적 있는 상태
- Unmodified: 최신 커밋의 모습과 비교했을 때 수정 사항이 없는 상태
- Modified: 최신 커밋의 모습과 비교했을 때 수정 사항이 있는 상태
- Staged: 파일의 내용이 수정되고나서 staging area에 올라와있는 상태
git add를 취소하는 방법은? (1)
git reset path1 path2 ...
명령어로 stging area에서 파일을 제거합니다.
Local repository와 remote repository를 연결하는 방법은? (5(2(3)))
- 초기 설정
git remote add origin github_url
git push -u origin branch_name
-u
=--set-upstream
tracking connection 형성- local repository의 branch만 입력해도 remote repository에 같은 이름의 branch로 push됩니다.
- tracking connection이 없으면 `git push origin <LOCAL_BRANCH>:<REMOTE_BRANCH> 형태로 push해야 합니다.
git push
로컬 레포지토리의 변경 사항을 리모트 레포지토리에 반영합니다.git pull
리모트 레포지토리의 변경 사항을 로컬 레포지토리에 반영합니다.- push와 pull은 작업 단위가 브랜치입니다.
- 자신과 collaborator만 push할 수 있습니다.
다른 프로젝트를 가져오는 방법은? (1)
git clone URL
명령어로 리모트 레포지토리를 다운로드합니다.
Github license란? (2)
오픈 소스 프로젝트의 역사에 대해 설명해주세요. (5(3))
- 오픈 소스 프로젝트(open source project)란 소스 코드가 공개되어 있는 프로젝트입니다.
- 1983년 리차드 스톨만(Richard Stallman)이라고 하는 MIT의 연구원이 자유 소프트웨어 운동을 시작했습니다.
- 리차드 스톨만은 자유 소프트웨어 재단(Free Software Foundation)이라는 걸 세우고 이러한 운동을 조직화 했습니다.
- 자유 소프트웨어 제단의 철학
- 소프트웨어는 소스 코드가 공개되어야 한다.
- 소프트웨어는 누구나 코드를 자유롭게 가져다가 사용할 수 있어야 한다.
- 소프트웨어는 원래의 코드를 자신이 원하는 대로 수정할 수 있어야 한다.
- 자유 소프트웨어를 의미가 명확한 오픈 소스 소프트웨어(open source software)라고도 합니다.
오픈 소스 소프트웨어에는 어떤 것이 있나요? (7+)
- numpy
- Linux
- MySQL Server
- WordPress
- React Native
- Vue.js
- Tensorflow
오픈 소스 프로젝트의 장단점은? (4,2)
- 장점
- 무료로 사용할 수 있습니다.
- 여러 개발자들이 참여하기 때문에 코드의 신뢰도가 상대적으로 높습니다.
- 오픈 소스 프로젝트에 참여 중인 다른 개발자들에게 질문을 할 수 있습니다.
- 어떤 프로그램을 개발할 때 특정 분야에서 사실상 표준처럼 사용되는 오픈 소스 프로그램을 많이 활용할수록 전체 개발 속도를 단축시킬 수 있습니다.
- 단점
- 참여자 수가 많지 않거나 참여자의 실력이 좋지 않으면 소스 코드의 신뢰성을 보장하기 어렵습니다.
- 해당 오픈 소스를 사용해서 문제가 생겼을 때 보상을 해주거나, 책임을 질 주체가 없습니다.
오픈 소스 라이센스란? (1)
Commit history를 보는 방법은? (2(2))
git log [-n]
명령어로 커밋 히스토리를 [n개] 출력할 수 있습니다--pretty=oneline
옵션으로 커밋 하나당 한 줄 씩 출력할 수 있습니다.
git show coomit_id
명령어로 해당 커밋을 확인할 수 있습니다.- commit_id의 앞부분 4자리 이상만 입력해도 됩니다.
최신 커밋을 수정하는 방법은? (1)
git commit --amend
명령어로 최신 커밋을 수정할 수 있습니다.
커밋 메시지 작성 가이드라인에 대해 설명해주세요. (9(9))
- 커밋 타입(commit type)
feat
: 새로운 기능 구현fix
: 버그 수정docs
: documentation 변경style
의미에 영향을 주지 않는, 코드 스타일에 관련된 변경 사항(포맷, 공백, 빼먹은 세미콜론, 함수 이름 변경, 줄간격, 파일 이름, 의미없는 주석 삭제)refactor
버그를 수정하지 않고 기능을 추가하지 않는 코드 변경chore
패키지 매니저 설정, 코드 수정 없는 설정 변경 등
- 커밋 메시지의 제목과 상세 설명 사이에는 한 줄을 비워두세요
- 커밋 메시지의 제목 뒤에 온점(.)을 붙이지 마세요
- 커밋 메시지의 제목의 첫 번째 알파벳은 대문자로 작성하세요
- 커밋 메시지의 제목은 명령조로 작성하세요
- 커밋 메시지의 제목은 영문 기준 50자 이내로 작성하세요
- 커밋 메시지의 본문은 영문 기준 72자마다 줄을 바꿔주세요
- 커밋의 상세 내용에는 이런 걸 적으면 좋습니다
- 왜 커밋을 했는지
- 어떤 문제가 있었고
- 적용한 해결책이 어떤 효과를 가지는지
- 다른 사람들이 자신의 코드를 바로 이해할 수 있다고 가정하지 말고 최대한 친절하게 작성하세요
커밋 가이드라인에 대해 설명해주세요. (2)
- 하나의 커밋에는 하나의 수정사항, 하나의 이슈를 해결한 내용만 남기도록 하세요
- 현재 프로젝트 디렉토리의 상태가 그 내부의 전체 코드를 실행했을 때 에러가 발생하지 않는 상태인 경우에만 커밋을 하도록 하세요
두 커밋 간의 차이를 보는 방법은? (1(4))
git diff
--staged
: 커밋된 파일과 add된 파일 비교[commit_id1] [commit_id2]
: 커밋 간의 비교HEAD HEAD^
: HEAD와 그 전의 커밋 비교[branch1] [branch2]
: branch 간의 비교
HEAD란? (3)
- Working directory를 구성하는 브랜치(커밋)을 가리키는 포인터입니다.
HEAD^
: HEAD가 가리키는 커밋의 바로 이전 커밋입니다.HEAD~n
: HEAD가 가리키는 커밋의 n단계 전의 커밋입니다.
이전 커밋으로 git reset하는 방법은? (1(4))
git reset --option commit_id
명령어로 HEAD가 해당 커밋을 가리키게 합니다.--hard
: working directory와 staging area 모두 변경합니다.--mixed
: working directory만 변경합니다.--soft
working directory와 staging area 모두 변경하지 않습니다.git reflog
명령어로 커밋 히스토리에서 사라진 커밋 id를 확인하고 다시 reset하여 복구할 수 있습니다.
커밋에 tag를 다는 방법은? (3)
git tag tag_name commit_id
명령어로 커밋에 태그를 달 수 있습니다.git tag
명령어로 프로젝트 디렉토리 내의 모든 태그를 조회할 수 있습니다.git tag -d tag_name
명령어로 태그를 삭제할 수 있습니다.
브랜치란? (1)
- 브랜치(branch): git에서 분기되는 코드 관리의 흐름입니다.
브랜치 명령어에 대해 설명해주세요. (10)
git branch
: 모든 브랜치를 조회합니다.git branch branch_name
: 현재 커밋에 브랜치를 생성합니다.git branch -d branch_name
: 브랜치를 삭제합니다.git switch branch_name
: HEAD가 가리키는 브랜치를 변경합니다. (권장)git switch -c branch_name
: 현재 커밋에 브랜치를 생성하고 HEAD가 가리키게 합니다. (권장)git switch branch_name commit_id
: 해당 커밋에 브랜치를 생성합니다.git checkout branch_name
: HEAD가 가리키는 브랜치를 변경합니다.git checkout -b branch_name
: 현재 커밋에 브랜치를 생성하고 HEAD가 가리키게 합니다.git restore file
: 워킹 디렉토리에서 수정된 파일을 복원합니다.git restore --staged file
파일을 staging area에서 제거합니다.
브랜치를 merge하는 방법은? (2(2))
git merge branch_name
: 베이스 커밋부터 대상 브랜치까지의 커밋 히스토리를 하나로 합친 내용으로 현재 위치인 브랜치에 커밋합니다.- 베이스 커밋으로부터 HEAD가 가리키는 브랜치에 파일 변화가 있고, merge하려는 브랜치에도 같은 파일에 다른 변화가 있다면 conflict가 발생합니다.
- conflict가 발생한 파일들을 수정하고 커밋을 하면 해결됩니다.
git merge --abort
merge를 취소할 수도 있습니다.
HEAD와 브랜치의 관계에 대해 설명해주세요. (3(1))
- HEAD: 브랜치의 포인터입니다.
git checkout commit_id
명령어로 HEAD가 커밋을 직접 가리키는 detached HEAD로 만들 수 있습니다.
- 브랜치: 커밋의 포인터입니다.
git reset commit_id
명령어로 HEAD가 가리키는 브랜치가 다른 특정 커밋을 가리키게할 수 있습니다.
merge의 종류에 대해 설명해주세요. (2(2))
Fast-forward merge
: 베이스 커밋과 현재 브랜치의 커밋이 동일할 경우 빨리감기 되는 것처럼 현재 브랜치가 대상 브랜치의 커밋을 가리키게 되고 새로운 커밋을 만들지 않는 merge입니다.3-way merge
- 베이스 커밋의 내용과 비교했을 때 달라진 부분이 있는 것이 우선시 됩니다.
- 두 브랜치에서 둘 다 변화가 일어났을 때에는 conflict를 발생시켜 사용자가 스스로 선택하게 합니다.
push 전에 remote repository에 변화가 생겨 에러가 발생할 경우 어떻게 하나요? (1)
git pull
명령어로 merge를 하고 conflict가 일어난 파일들을 수정하고, 커밋하고, push하면 됩니다.
remote repository에 있는 브랜치의 내용을 local repository에 merge하지 않고 가져오는 방법은? (2)
git fetch
git diff local_branch remote_branch
명령어로 변경점을 비교하며 가져올 수 있습니다.
파일의 커밋 히스토리를 작성자와 함께 출력하는 방법은? (1)
git blame PATH/FILE
커밋을 취소하는 방법은? (1(3(2)))
git revert commit_id
- revert 후에 push하면 리모트 레포지토리에 push한 커밋을 취소할 수 있습니다.
- 로컬 환경에서는 reset으로 커밋을 취소해도 되지만 최신 커밋이 아니기 때문에 push할 수 없습니다.
commit_id1 ... commit_idN
형태로 argument를 주면 여러 커밋을 취소할 수 있습니다.- commit_id1 이후 커밋부터 commit_idN 커밋까지 취소됩니다.
- commit_id1에 해당하는 커밋은 취소되지 않습니다.
현재 브랜치의 베이스를 다른 브랜치로 지정하는 방법은? (2)
git reabse commit_id
git rebase --continue
명령어로 conflict를 해결한 후 rebase를 계속 진행할 수 있습니다.
rebase가 merge와 다른 점은? (3)
- 새로운 커밋을 만들지 않습니다.
- 커밋의 히스토리가 단순화됩니다.
- 두 브랜치를 합쳤다는 정보가 커밋 히스토리에 남지 않습니다.
git stash란? (8)
git stash
: 최근 커밋 이후로 작업했던 내용을 모두 스택에 옮기고 워킹 디렉토리를 최근 커밋의 상태로 초기화 합니다.git stash list
: 스태시 스택을 살펴봅니다.git stash apply stash@{n}
: 워킹 디렉토리에 스태시를 적용합니다.git stash drop stash@{n}
: 스태시를 삭제합니다.git stash pop stash@{n}
: 워킹 디렉토리에 스태시를 적용한 후 삭제합니다.- 스태시의 아이디를 argument로 주지 않으면 가장 최근의 스태시를 argument로 전달합니다.
- 어떤 브랜치에서 하던 작업을 아직 커밋하지 않았는데 다른 브랜치로 가야하는 상황에서 사용합니다.
- 잘못된 ㅡㅂ랜치에서 작업하고 있었을 때 사용합니다.
git cherry-pick이란? (2)
git cherry-pick commit_id
: 원하는 작업이 들어있는 커밋들만 가져와서 현재 브랜치에 추가합니다.- 다른 브랜치에 있는 커밋을 선택적으로 내 브랜치에 적용시킬 때 사용합니다.
커밋을 합치는 방법은? (1)
- 이전 커밋으로 soft/mixed reset 후에 커밋을 하면 하나의 커밋에 여러 커밋 내용을 담을 수 있습니다.
.gitignore란? (2)
- git이 무시할 파일 목록입니다.
- 워킹 디렉토리에서 버전 관리를 할 필요가 없거나 리모트 레포지토리에 공개할 수 없는 파일이나 폴더가 있다면 .gitignore 파일에 그 파일이나 폴더 이름을 추가하면 됩니다.
Branch merge 방법들에 대해 설명해주세요. (3)
git merge branch_name
- 일반적으로 많이 사용하는 merge 방법입니다.
- 커밋 이력을 모두 남길 때 사용합니다.
-ff
옵션(fast-forward)이 기본으로 설정되어 있습니다.- Github의
Merge pull request
는git merge --no-ff
옵션으로 베이스 커밋이 최신 브랜치의 커밋이어도 커밋을 남기도록 강제합니다.
git merge -squash branch_name
- 분기했던 branch에 있던 커밋 내용들을 하나로 합쳐 새로운 커밋을 만듭니다.
- 지저분한 커밋 히스토리들을 하나로 합쳐서 기능상 의미있는 하나의 커밋만 남길 때 사용합니다.
- Rebase & Merge
- 분기했던 브랜치의 커밋을 최신 베이스 커밋으로 설정하고, merge하는 방법입니다.
- 결과적으로는
git merge -ff
와 같은 형태가 됩니다. - rebase를 하면 커밋들의 베이스가 변경되어 커밋 해시도 변경될 수 있습니다. 이런 경우
git push -f
(force push)를 해야할 경우도 있습니다. - merge 커밋을 남길 필요가 없는 경우 사용합니다.
- 커밋 그래프가 하나의 라인으로 그려져 가독성에 좋습니다.