Search

Git / Github

다음을 기억

1.
git pull
2.
git add .
3.
git commit
4.
git push

1. Git / Github 기본 개념

분산 버전 관리 툴이 Git이다. 그리고 그 Git을 관리해주는 웹 호스팅 서비스가 Github이다.
깃헙은 협업을 위한 필수 툴 중 하나다.
Git : 로컬 저장소(내 컴퓨터) 와 원격 저장소(서버 컴퓨터)로 나뉜다. 내 컴퓨터에서 작성한 프로젝트를 원격 저장소에 저장해두고, 만약 내 컴퓨터의 프로젝트가 손상되거나 다른 컴퓨터에서 코드를 가져오고 싶을 때는 원격 저장소에서 바로 가져올 수 있다. 이때, 코드 뿐만 아니라 코드의 변경 내역까지 모두 가져올 수 있기 때문에 Git이 “버전 관리 도구” 라고 불리는 것이다.
위의 기능을 하는 툴은 Git만 있는 것은 아니고, SVN, CVS 등이 있는데 현재 가장 많이 사용하는 툴이 Git이다.
Github : Git을 클라우드 환경에서 사용할 수 있게 제공하는 공간이 Github다. 단순히 저장소 역할만 하는 것은 아니다. 개발자들 사이에서 거대한 커뮤니티를 형성하고 있다. 자신의 프로젝트는 물론 다른 개발자들의 인기 있는 프로젝트의 코드를 볼 수 있고, 이슈를 제기할 수 있으며, 원한다면 다른 이의 프로젝트를 수정하고 발전시키는데에 참여할 수도 있다. 이를 오픈소스에 기여한다고 한다.

git 초기설정

다운 받은 git의 버전을 확인할 수 있다.
$ git --version
Bash
복사
git을 사용하기 위해 사용자 정보를 설정한다. (이름, 이메일)
$ git config --global user.name "사용자 이름" $ git config --global user.email email@example.com
Bash
복사
작업할 디렉토리 만들고(mkdir) 해당 디렉토리로 이동하기(cd)
$ mkdir 디렉토리 $ cd 디렉토리
Bash
복사
디렉토리 내 파일들 리스트 확인하기
$ ls -al
Python
복사
현 디렉토리를 git 저장소로 만들어서 원하는 디렉토리를 기준으로 버전관리를 진행
$ git init
Bash
복사
git init 을 입력하면 해당 폴더 기준으로 .git(로컬 저장소)가 생성된다. 로컬 저장소에는 버전 정보, 원격 저장소 주소가 저장된다.
단, 하나의 폴더에는 하나의 .git(로컬 저장소)을 가져야 한다. 그렇지 않을 경우 충돌이 발생한다.

추가하고 commit 하기

파일을 생성하고(touch), 추가(add)하고 커밋(commit)하기
$ touch README.md $ git add README.md # README.md 파일을 버전관리에 추가 $ git commit -m "first commit"
Bash
복사

git이 관리할 대상의 파일 등록하기(add)

변경한 파일 목록 중 스테이지에 올리기 원하는 파일만 선택한다. 파일 전체를 올리고 싶은 경우에는 git add 뒤에 . 을 입력한다. (git add .) 이때, 한 칸 띄고 써야한다는 점을 잊지 말자!
→ 파일을 수정하고 바꾼 뒤에도 해당 명령어를 해줘야 한다.
$ git add README.md // 지정한 파일만 올리기 $ git add . // 파일 전체 올리기
Bash
복사
→ add 하고 나면 해당 파일들은 staged 즉, commit 대기 상태가 된다.

버전 만들기 (commit)

$ git commit -m "저장 메세지를 입력하시오"
Bash
복사
→ commit 하고 나면 해당 파일들은 저장소에 저장된다.

수정하고 삭제한 파일들을 자동으로 commit 하고 변경 message 입력하기

주의해야 할 점
한번도 add 를 하지 않은 최초의 파일은 아래와 같이 자동으로 add할 수 없다.
$ git commit -am "저장 메세지를 입력"
Python
복사

상태 확인하기(status, diff, log)

파일 상태 확인하기(status)

$ git status
Bash
복사
→ 파일의 상태에 따라 untracked 와 tracked로 분류된다.
1) untracked(관리 대상이 아님) : 파일 생성 후 git add 하지 않은 상태
2) tracked(관리 대상임) : git이 관리하는 파일
unmodified : 최근의 커밋과 비교했을 때 바뀐 내용이 없는 상태
modified : 최근 커밋과 비교했을 때 바뀐 내용이 있는 상태
staged : 파일이 수정되고 나서 스테이지 공간에 올라와 있는 상태이며, git add 후의 상태

변경된 버전 히스토리 확인하기(log)

$ git log
Python
복사
→ 버전의 히스토리 내역을 확인할 수 있다(누가 바꿨고, 언제 바꿨는지, 메세지는 뭔지 확인 가능)
$ git log -p
Python
복사
→ commit들 사이의 변경 내역(소스 코드)을 확인할 수 있다.

변경사항 확인하기(diff)

$ git diff
Bash
복사
→ 최근 commit한 내용과 현재 폴더의 변경 사항을 확인할 수 있다.
$ git diff commit주소1..commit주소2
Python
복사
→ 특정 commit 들 사이의 변경 내역(소스 코드)을 확인할 수 있다.

Commit 취소하기(reset revert )

1.
reset
특정 커밋(버전) 상태로 돌아가고 싶을 경우,
git log : 돌아가고 싶은 버전의 주소를 확인하고
git reset 돌아가고싶은commit주소 -- hard
Python
복사
reset 한 내용을 다시 reset 하고 싶을 때
git reset --hard ORIG_HEAD
Python
복사
로그 내용에서 특정 commit 사항으로 돌아가고 싶을 때
git reflog # commit 된 로그 주소들을 모두 확인할 수 있다. git reset 특정log주소 --hard
Python
복사
hard 옵션 : git 의 3단계, working directory → index → repository 에서 3단계 모두 이전의 상태로 돌리는 것
git reset --hard
Python
복사
mixed 옵션 : repository, index 단계까지 이전의 상태로 돌리는 것
git reset --mixed
Python
복사
soft 옵션 : repository 단계만 이전의 상태로 돌리는 것
git reset --soft
Python
복사
2.
revert
특정 커밋(버전) 상태로 돌아가면서 새로운 버전을 만들고 싶은 경우

저장소에 무시할 파일 설정하는 방법

무시할 파일(gitignore) 추가 하기

.gitignore

원격저장소에 민감하거나 보일 필요없는 내용 추가하기
push하기 전에 .gitignore 메모장 파일을 로컬저장소에 만든후, 해당 메모장에 제외할 파일을 추가해주면 된다.
→ HOW?
gitignore.io 를 활용!
접속한 후, 본인의 프로젝트에서 사용하는 운영체제, 개발 환경, 기술 스택을 작성한다.

Branch

branch 기본

1.
현재 사용하고 있는 branch 확인하기
$ git branch * master # 기본 branch
Python
복사
2.
새로운 branch 만들기
$ git branch 새로운 branch 이름
Python
복사
3.
사용하고 싶은 branch 로 들어가기
$ git checkout 새로운 branch 이름
Python
복사
 참고로 새로 만든 branch는 기존의 branch 와 같은 상태다
위의 2~3번을 한꺼번에 수행하기
$ git checkout -b 새로운 branch 이름
Python
복사
4.
저장소 있는 모든 branch들의 log 를 보여준다.
$ git log --branches
Python
복사
5.
각 branch의 최신 commit 내용을 알려준다. HEAD 는 현재 체크인 되어 있는 branch를 나타낸다.
$ git log --branches --decorate
Python
복사
6.
각 branch의 최신 commit 내용을 알려주고, 각 branch 의 흐름이 잘 보이게끔 도와주는 옵션
→ branch들이 각자 어떤 흐름에서 나오게 됐는지 쉽게 파악 가능.
→ oneline 옵션은 간결하게 보여준다.
$ git log --branches --decorate --graph [--oneline]
Python
복사
7.
각 branch의 차이가 뭔지 확인하고 싶을 때
$ git log branch1..branch2 # branch1에는 없고 branch2 에는 있는 것들을 보여준다. $ git log branch2..branch1 # branch2에는 없고 branch1 에는 있는 것들을 보여준다.
Python
복사

brach 의 병합

기준이 되는 branch 에서 branch2를 병합하고 싶다면, 즉 branch2의 commit 내용들을 branch에도 적용하고 싶다면 다음과 같이 한다.
# 1. 일단 기준이 되는 branch로 checkout 을 한다. $ git checkout branch # 2. branch 를 기준으로 병합한다. $ git merge branch2 # 3. 병합한 뒤 각 branch들의 log 를 확인해본다. $ git log --branches --decorate --graph --oneline
Python
복사
 주의할 점
branch를 기준으로 branch2의 내용을 병합했기 때문에, branch2는 branch만의 변경사항을 담고 있지 않다. 따라서 둘이 완전히 같게 해주려면 branch2를 기준으로 branch를 다시 병합해주는 과정을 거쳐야 한다.
# 4. branch2를 기준으로 다시 branch를 병합해준다. $ git checkout branch2 $ git merge branch # 5. branch와 branch2가 같은 상태인지 확인해본다. $ git log --branches --decorate --graph --oneline
Python
복사
두 branch 가 병합이 됐다면, 필요없는 branch를 제거해준다.
# 먼저 기준이 되는 branch로 checkout 을 한다. $ git checkout branch # 삭제할 branch를 삭제한다. $ git branch -d branch2
Python
복사

branch 충돌 대처

각기 다른 branch에서 같은 부분(내용)을 수정하고 merge를 하게되면 충돌이 발생한다.
이럴 때는 merge의 기준이 되는 branch 에서 문제가 되는 부분의 내용(기준이 되는 branch에서의 수정 내용과 병합할 branch에서 수정한 부분이 같은 곳)을 수동으로 수정해줘야 한다. 둘 중에 하나만 택 1하거나 아예 내용을 수정하는 식으로!
그 다음 변경된 내용을 add 해주고, commit 해주고, 그다음 다시 병합을 해주면 끝!

Stash

로컬 저장소에 원격 저장소 연결

로컬 저장소에 원격 저장소 연결하기
$ git remote add origin 원격저장소의 경로
Python
복사
연결한 원격 저장소를 지우고 싶을 때
$ git remote remove origin
Python
복사
원격 저장소에 로컬 저장소의 branch 내용 올리기
$ git config --global push.default simple # push 환경 설정 $ git push --set-upstream origin master # 로컬 브랜치 master 과 자동으로 연동시키기
Python
복사

원격 저장소에 있는 외부 소스 가져오기

github 의 외부 소스 코드의 ssh 주소를 복제한 뒤 다음과 같이 진행한다.
# 1. 내가 저장하고 싶은 장소에 복제한 원격 소스 코드를 가져오기 $ git clone '복제한 원격 저장소 주소' '내가 저장하고 싶은 장소 or 현재 디렉토리' # 현재 디렉토리 위치로 복제 $ git clone '복제한 원격 저장소 주소' .
Python
복사
# commit 한 내용들을 거꾸로 나타내기 $ git log --reverse
Python
복사
# commit 주소로 해당 소스 코드 확인해보기 $ git checkout 특정 commit 주소 # branch 가 commit 주소로 바뀐 것을 확인할 수 있다. $ ls -al # 해당 commit 의 소스 코드들을 확인
Python
복사

원격 저장소에 로컬 저장소의 파일 올리기

push
# orgin 이라는 원격 저장소의 master 브랜치에 업로드 $ git push -u origin master # -u 는 한번만 해주면 그 다음부터 안해도 됨.
Python
복사
# 그 다음부터 push 할때는 다음과 같이 $ git push
Python
복사

로컬 저장소에 원격 저장소의 변경 사항 가져오기

pull
# 로컬 저장소와 원격 저장소가 이미 연동되어있을 경우 $ git pull
Python
복사

SSH : 로그인없이 원격 저장소 사용하기

https 와 동일한 접근 방법이나, 로그인이 필요없다.
장점은 원격 저장소에 접근할 때마다 로그인이나 비밀번호를 거치지 않아도 된다는 것!
$ ssh-keygen
PowerShell
복사
현재 홈 디렉토리에 .ssh/id_rsa 파일과 .ssh/id_rsa.pub 파일이 생긴다.

Fetch vs Pull

Fetch 는 원격 저장소에서 필요한 파일들을 다운로드 받기만 한다.
→ 아래의 merge 과정이 꼭 필요하다
git merge '병합하고싶은 원격 저장소의 branch 이름'
PowerShell
복사
pull 은 필요한 파일들을 다운로드하고 병합까지 해준다.
결국, 일반적으로는 pull 을 사용하면 되지만, 병합하기 전에 신중하게 고려해야되는 경우에는 fetch 를 쓰기도 한다.