깃(git)
깃(git), 짧은 소개
- git은 오픈소스 분산 버전 관리 시스템이다.[1]
- git은 소스 코드의 이력을 관리한다.
- 이력 관리란 코드가 변하는 과정을 저장하는 것으로 생각할 수 있다.
- 소스에서 이력 관리가 중요한 것은 개발하는 과정에서 잘 되던 것도 안 되는 수도 있기 때문에 서로 비교하고, 잘못되었다고 느끼면 예전 소스로 되돌아갈 수 있어야 하기 때문이다.
- git은 여러 사람이 협력해서 개발할 수 있도록 도와준다.
- 만약 여러 사람이 함께 프로그램을 짠다면 프로그래머 A가 수정한 부분을 프로그래머 B가 수정할 수도 있고, 프로그래머 B가 바꾸면 안 된다고 생각한 부분을 프로그래머 A가 바꿀 수도 있다.
- 누가, 언제, 무엇을, 왜 수정했는지를 명확히 할 필요가 있다.
설치
- Ubuntu 등 데비안 계열 :
sudo apt install git-all - Fedora :
sudo dnf install git-all - 참고 : https://git-scm.com/book/ko/v2/시작하기-Git-설치
주요 명령어
git init .: 초기화git add -A ./git commit: 커밋 준비/커밋git status: 현재 상태git log: 이력(커밋내용)git diff: 차이 확인git checkout: 이전 화일 내용 확인git config --global user.name "..."/git config --local user.name "...": git id 설정(global/local)git config --list: git 설정 확인git config credential.helper store: git user.name, password 저장, 참고git blame: 현재 소스의 최종 작성자 확인
일반적인 작업 순서
- (선택사항) 해당 폴더에 대해 id 설정(모든 폴더에 대해 id 설정은
local->global로 수정한다.)
git config --local user.name <...>
- 작업을 할 폴더(디렉토리)로 가서 초기화한다.
git init .
- 작업을 한다(화일이 생성된다).
- 작업 내용을 모두 커밋한다(이력 관리를 위해 저장한다).
git add -A . # <-> git rm git commit -m "blah-blah"
- 작업,
add,commit을 반복한다. - 이력을 확인하는 방법들
git log: 커밋 로그git blame: 현재 소스의 최종 작성자 확인git checkout: 이전 화일 내용 확인git status: 현재 상태 확인. 마지막 커밋 이후 수정된 사항 등.
- 마지막 커밋을 복원하기(때때로 필요하다.)
git reset --hard HEAD git clean -fd # 이력관리를 하지 않는 파일은 모두 지운다. 지운 후 휴지통에서 복구할 수 없다. git clean -fdx # 이력관리 하지 않는 파일과 .gitignore에서 지정된 화일을 모두 지운다.
- 대용량의 화일에 대해 이력을 작성하고 관리하며 부담이 커진다. 실수로 이력 관리에 포함된 화일을 지우려면(하지만 로컬 화일은 보존하려면)
git rm --cached filename.ext gir rm --cached -r directory
git log origin/master..HEAD git diff origin/master..HEAD
git diff origin/master..HEAD --name-only
- HEAD의 의미 : HEAD는 현재 브랜치를 가리키는 포인터이며, 브랜치는 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킨다. 지금의 HEAD가 가리키는 커밋은 바로 다음 커밋의 부모가 된다. 단순하게 생각하면 HEAD는 현재 브랜치 마지막 커밋의 스냅샷이다.
충돌 처리
git push가 실패할 경우, git pull을 실행한다. git pull도 충돌이 발생할 경우
- 충돌이 일어나면 다음과 같은 메세지가 출력된다.
Auto-merging <filename.txt>
CONFLICT (content): Merge conflict in <filename.txt>
Automatic merge failed; fix conflicts and then commit the result.
- 충돌이 일어난 화일을 수정한다.
- 다음을 실행한다.
git add git commit git pull
git pull에서 발생할 수 있는 다른 문제
- 다음의 메세지 발생할 때,
error: unable to resolve reference refs/remotes/origin/...
- 다음을 실행한다.
git gc --prune=now git remote prune origin
git merge에서 충돌이 발생할 경우
git pull의 충돌과 동일하게 처리한다.git pull=git fetch+git mergegit fetch를 하면git checkout FETCH_HEAD로 체크아웃할 수 있다.
git rebase에서 충돌이 발생할 경우
- 충돌을 해결 한 후
git add git rebase --continue
git rebase를 취소할 경우:git rebase --abort
브랜치 관리
새로운 브랜치 만들기
git checkout -b <BRANCH_NAME>
원격 저장소(remote repository) origin 에 새로운 이름으로 PUSH하기
git push -u origin <BRANCH_NAME>
원격 저장소의 브랜치 불러오기
git checkout --track origin/<BRANCH_NAME>
원격 저장소 관련
git remote git remote -v git remote add <name> <url> git remote rm <name> git remote rename <oldname> <newname>
원격 저장소 관련 2
R Studio에서 New Project를 한 후,
github에서 새로운 repository 생성 한 후,
git remote add origin <ProjectFolder>로 원격 저장소를 연결하면,
R Studio의 Pull/Push 버튼을 누를 수 없다.
이때에는 shell에서
git push -u origin master를 해 준다.
여기서 -u는 --set-upstream의 약자.
commit 하지 않은 내용을 다른 브랜치로 옮기기
git checkout -b <branchname>
두 브랜치에 동일한 내용 commit 하기
git checkout <branchA> git commit -m "commit message" git checkout <branchB> git cherry-pick <branchA>
다른 사용자와 공동 작업하기
다른 사용자 초대하기(https://help.github.com/articles/inviting-collaborators-to-a-personal-repository/)
- 사용자이름(username)을 확인한다.
- Github의 저장소 메인 페이지로 간다.
- Settings(설정)을 클릭한다.
- 왼쪽 사이드바에서 Collaborators(공동작업자)를 클릭한다.
- 공동작업자의 사용자이름(username)을 적는다.
- 드롭다운 메뉴에서 사용자이름을 선택한다.
- Add collaborator를 클릭한다.
Authentication 관련
- Git push requires username and password
- Changing a remote’s URL
- Connecting to GitHub with SSH
- 일반적인 사항 :
fatal: repository 'https://github.com/.../.git/' not found의 한 원인- RStudio의 Tools > Global Options > Git/SVN에서 SSH RSA Key: 부분을 주목한다.
- SSH RSA Key의 화일 이름을 복사한 후 뒤에 “.pub”을 붙인 화일 이름을 기억한다.(없다면 linux에서
ssh-keygen) - cmd 또는 git bash에서 “clip < ~/.ssh/id_rsa.pub”을 한다. 이때 ~/.ssh/id_rsa.pub 대신 위의 화일 이름을 쓴다. (화일 내용이 클립보드에 복사된다.)
- git 싸이트로 들어가서 use setting/SSH and GPG keys/New(Add) SSH key/Key 에 붙여넣기한다.
- [Add SSH key]를 누른다.
SSH Key 생성
ssh-keygen -t rsa -C "email_id@email.com" cat /.../...pub # public key 복사
그 밖의 참고 사항
lazygit() : add, commit, push를 한 번에 끝내고 싶을 때
lazygit()
function lazygit() {
git add .
git commit -a -m "$1"
git push
}
삭제된 화일을 commit history에서 찾기
#by filepath and filename git log -- filepaht/filename #by filename git log --diff-filter=D --sumary | grep filename
브랜치에서 특정한 화일만 체크아웃하기
만약 그 파일들에 대한 변경사항이 commit으로 되어 있다면,
git checkout <<branch1>> git cherry-pick <commit-with-changes-to-file.py>
그렇지 않다면…
git checkout <<branch2>> git diff <base-commit-before-changes-to-file.py> -- file.py > my.patch git checkout <<branch1>> git apply my.patch
그 밖에
- Stage(
git add) 하지 않은 수정사항 원상 복구하기
git checkout -- .
git stash save --keep-index --include-untracked
- 특정한 파일에 대해 Commit하지 않은 수정사항 원상 복구하기
git checkout <<HASH>> -- file1/to/restore /file2/to/restore
- 마지막 commit에서 수정된 사항 확인하기
git diff HEAD^..HEAD git log --name-status HEAD^..HEAD
참고 자료
- Version control with RStudio and Github
- Fun with keeping local changes around
- How to undo anything with Git
- Be a git pro in just one blog
- Merge와 Rebase
- Merge와 Rebase는 최종 결과물은 같지만 커밋 히스토리가 다르다.
- Merge는 두 브랜치의 최종 결과만을 가지고 합치고, Rebase는 변경사항을 순서대로 적용하면서 히스토리가 선형적이 된다.
Leave a comment