깃(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 merge
git 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