-
Git 활용을 위한 정리Git & Github 2020. 8. 31. 08:15반응형
1. 저장소(repository) 만들기
git init
현재 경로의 directory에 local 저장소를 추가하는 초기화 작업을 진행한다. 저장소 초기화가 완료되면 현재 경로 안에 .git directory가 생성된다.
.git directory는 형상관리에 필요한 file들이 들어있으므로 삭제하면 안 된다.
git clone [복제할 git의 URL 또는 SSH]
현재 directory를 복제할 git의 저장소로 만든다.
git clone [복제할 git의 URL 또는 SSH] [복제본이 저장될 directory]
복제본이 저장될 directory를 복제할 git의 저장소로 만든다.
2. Version 만들기
2.1. version을 만들기에 앞서 local repository의 소유자 정보를 입력해둔다.
git config --global user.name ["사용자 이름"]
local repository의 소유자명을 지정한다. 저장소당 한 번만 진행하면 된다.
git config --global user.email ["email"]
local repository 소유자의 email을 지정한다. 저장소당 한 번만 진행하면 된다.
2.2. 변경 내용을 staging area에 올리기 / staging area에 올라간 변경내용 취소하기 / staging area에 올라간 내용으로 version 만들기
git add [file명]
저장소에 임의의 file을 추가하면 git에 의해 관리되는 않는 untracked 상태로 추가된다.
working directory에 새로운 file이 추가되거나 기존 file의 내용이 변경되면 저장소의 내용을 변경하기 위해 변경내용을 staging area로 올려줘야 한다. stating area로 올리기 위해 add를 사용한다.
위의 명령을 실행하면 지정된 file을 staging area로 올린다. file명 대신 . 또는 -A 옵션을 사용하면 현재 directory의 모든 untracked 및 modified 상태의 객체를 staging area로 올린다.
git reset .
staging area에 올라간 모든 내용을 취소한다. 특정 file만 지정해서 취소할 수도 있다.
git commit
staging area에 있는 변화 내용을 바탕으로 version을 만든다.
위의 명령을 실행하고 commit 메시지를 작성하면 version이 생성된다.
-m 옵션을 사용하여 terminal에서 직접 commit 메시지를 작성할 수도 있다.
-a 옵션을 사용하면 아직 staging area에 올라가지 않은 modified 상태의 객체를 staging area에 올리는 작업과 동시에 commit을 진행한다.
※옵션은 git commit -am 과 같이 조합해서 사용할 수도 있다.
※commit 메시지를 수정하기 위해서는 -amend 옵션을 사용한다. (e.g) git commit -amend "Changed message here"
★commit 메시지 변경과 version 되돌리기, branch 병합 등의 작업은 remote repository에 저장하기 전 즉, 공유되기 전에 완료해야 한다. 일단 한 번이라도 remote repository에 push한 commit은 건드리지 않는 것이 정신건강에 이롭다. push는 신중하게 하자.
3. Version의 확인과 되돌리기
git log
commit된 version들의 내역을 확인한다.
-P 옵션을 사용하면 version 간의 차이를 확인할 수 있다.
---로 시작하는 내용: 이전 version의 file
---로 시작하고 /dev/null 경로가 지정된 경우: 현재 version에서 새롭게 추가된 file
+++로 시작하는 내용: 현재 version의 file
git log [commit ID]
commit ID 의 내역만 보여준다.
git diff [commit ID 1] ... [commit ID 2]
두 commit의 차이점을 보여준다.
-는 기존 내용
+는 현재 내용
※git diff는 file 수정 후부터 변경 내역을 보여준다.
git reset --hard [commit ID]
commit ID로 version을 되돌리면서 --hard 옵션으로 내용까지 되돌린다.
git reset --hard HEAD~[숫자]
숫자로 지정한 만큼 떨어진 이전 version으로 되돌리면서 --hard 옵션으로 내용까지 되돌린다.
git reset --hard ORIG_HEAD
reset하기 전 원래 version으로 되돌린다.
git revert [commit ID]
commit ID까지의 version을 취소하고 새로운 version을 만든다.
commit 이력은 그대로 유지된다.
★version을 되돌리기 전에 실수를 만회하기 위해 .git directory를 포함하여 별도의 경로에 백업하는 것이 좋다.
★원격 저장소에 연결되어 있는 경우 pull해온 version 부터 push하기 전 version에 대해서만 되돌리기를 진행해야 한다.
4. Branch
Branch는 언제 사용할까? 예를 들어 고객처 A와 B는 동일한 기능의 service를 사용하고 있었지만 사정이 있어 B에만 특별한 기능을 추가하는 상태가 된다고 생각해보자. 이런 경우 source code를 완전히 분기하여 별도의 version으로 관리해야 할 필요가 있다. 시간이 지나 B에 적용한 기능을 A도 적용해야 할 필요가 생겨 두 버전 간 기능 차이가 더 이상 존재하지 않게 되었을 때 분기된 것을 하나로 합쳐서 관리할 수도 있어야 하는데 이런 것을 가능하도록 해주는 것이 branch이다.
git branch
현재 branch를 확인한다. *가 붙어 있는 것이 현재 branch이다.
git branch [branch]
현재 checkout 중인 branch와 동일한 상태의 새로운 branch를 지정한 branch 이름으로 생성한다.
git branch -d [branch]
지정한 branch를 삭제한다. (지정한 branch가 현재 checkout한 branch인 경우 다른 branch로 checkout한 뒤에 삭제 가능)
git checkout [branch]
지정한 branch로 checkout 한다.
git checkout -b [branch]
branch를 생성함과 동시에 생성한 branch로 checkout 한다
※git log --branches --decorate --graph --oneline 을 실행하면 terminal에서도 branch의 상태를 visual하게 확인할 수 있다.
※git log [branch 1] ... [branch 2] 를 실행하면 branch 1에는 없고 branch 2에만 있는 항목을 보여준다. -P 옵션을 같이 사용하면 변경 이력도 확인 가능하다.
git merge [branch]
지정한 branch를 현재 checkout 중인 branch로 병합한다. branch의 분기 내역은 그대로 남는다.
git branch -d [branch]
지정한 branch를 삭제한다. 병합 작업 완료 후 더 이상 관리할 필요가 없는 branch를 깔끔하게 정리할 때 사용한다.
git rebase [branch]
지정한 branch와 현재 checkout 중인 branch를 병합하면서 두 branch의 공통 base를 지정한 branch로 변경한다. (두 갈래의 branch를 하나의 branch로 만드는 것)
master와 feature branch가 있다고 할 때, master를 기준으로 병합하고 feature branch를 정리하는 작업 순서는 다음과 같다.
git checkout feature
git rebase master
git checkout master
git rebase feature
git branch -d feature
git rebase --abort
rebase를 취소한다. rebase 작업 중 conflict가 발생했다면 --abort 옵션을 사용하여 작업 전 상태로 되돌릴 수 있다.
5. 하던 작업 미뤄두기 with stash
현재 하던 작업을 잠시 중단하고 긴급하게 처리해야 하는 작업이 발생할 경우, commit을 더럽히지 않고 기존에 하던 작업을 숨겨서 미뤄둘 수 있다. 긴급한 작업이 처리된 이후에는 하던 작업을 복구해서 마저 진행하면 된다.
git stash save
작업 중인 내용을 저장하고 현재 branch를 초기화한다.
git stash apply
숨겨뒀던 작업 내용을 복구한다.
※stash save를 할 때마다 stash list에 추가된다. stash apply로 복구하는 작업 내용은 0번 인덱스에 해당하는 가장 최신의 stash가 된다.
git stash list
stash 목록을 확인한다.
git stash drop
최신 stash를 삭제한다.
git stash pop
git stash apply와 git stash drop을 동시에 진행한다. stash 목록을 깔끔하게 정리하기 위해 apply, drop을 따로 쓰기보다 이 명령어를 사용하는 것이 좋겠다.
6. Conflict의 해결
git은 여러 branch에서 각각의 동일한 file을 수정하고 병합하더라도 각 file에서 동일한 line을 동시에 수정한 것이 아니라면 통합된 내용의 commit을 생성한다.
동일한 line을 수정하고 병합하는 경우 conflict가 발생하게 된다. confict의 처리 순서는 다음과 같다.
① git status로 conflict가 발생한 file을 확인한다.
② conflict 발생한 file을 열어보면 병합하려고 했던 두 branch 간에 conflict가 발생한 부분을 확인할 수 있다.
<<<<<<< HEAD 부터 ======= 까지의 내용이 현재 branch의 내용
======== 부터 >>>>>>> [branch name] 까지의 내용이 다른 branch의 내용
③ confilct가 발생한 file의 내용 중 현재 branch(HEAD)의 내용은 다른 곳에 복사해둔다.
④ file의 내용을 다른 branch의 내용과 동일하게 수정하여 맞춰줌으로써 더 이상 conflict가 발생하지 않도록 한다.
⑤ 수정된 내용을 commit 하고 병합을 진행한다.
⑥ 병합 완료 후 복사해 뒀던 내용을 적용한다.
git cherry-pick [commit ID]
지속적인 conflict 발생 시 master에 대한 임시 branch를 만들고 commit별로 cherry-pick을 진행한다.
Cherry Pick은 실제 커밋을 가져오는게 아니라 해당커밋의 변경된 내용을 가져와서 새로운 commit을 만드는것이기 때문에 나중에 커밋이 중복될수 있다는 것에 주의한다.
7. GitHub (remote repository와 local repository를 연결하기)
GitHub은 Git 저장소를 호스팅 해주는 서비스이다. GitHub에 존재하는 저장소를 remote 저장소라 하며 작업하고 있는 컴퓨터에 있는 저장소를 local 저장소라고 한다. 이 두 저장소를 연결하여 여러 작업자들 간에 원활한 협업이 가능하도록 해준다.
GitHub을 사용하기 위해서는 먼저 https://github.com/ 에 회원 가입을 진행한다.
회원 가입이 완료되면 https://github.com/new 로 접속하여 저장소를 생성한다. 저장소 생성 시 저장소의 고유한 URL 또는 SSH를 확인할 수 있다.
git remote add [remote repository name] [repository URL]
repository URL에 해당하는 remote 저장소를 remote repository name이라는 이름으로 local 저장소에 연결한다.
아래 예와 같이 실행하면 github.com/camel-master/SortingAlgorithms.git라는 원격 저장소를 origin이라는 이름으로 하여 로컬 저장소와 연결한다.
(e.g) git remote add origin github.com/camel-master/SortingAlgorithms.git
git remote
현재 연결된 remote 저장소를 확인한다. -V 옵션을 붙이면 좀 더 상세한 정보를 확인할 수 있다.
git remote remove [remote repository name]
local 저장소와 연결된 remote 저장소 정보를 삭제한다.
8. Remote repository와 local repository의 동기화
위의 7번 내용대로 원격 저장소와 로컬 저장소를 연결한 경우 다음과 같이 pull 명령을 통해 두 저장소를 동기화 할 수 있다.
git pull [remote 저장소 이름] [branch]
현재 checkout 되어있는 local repository branch의 내용을 remote 저장소의 branch의 내용으로 update한다.
git push -u [remote 저장소 이름] [branch]
remote 저장소의 branch에 현재 checkout 되어있는 local repository branch의 내용을 적용한다.
-u는 up stream을 설정하는 옵션이다. push한 branch를 up stream에 추가하여 매개변수 없는 git pull 명령어와 그 밖의 다른 명령어 실행 시 별도로 branch를 지정하지 않아도 되도록 해준다.
★작업 전에 pull 하고 작업 후에 push 하는 습관이 중요하다.
9. SSH 통신을 사용한 GitHub Login 생략
Secure SHell을 통해 공개키를 소유한 곳에 별도의 인증절차 없이 연결할 수 있다.
① termianl창에서 다음 명령어를 실행하여 SSH 통신을 위한 private key와 public key를 생성한다.
ssh-keygen
특별한 입력값 없이 enter 3회 입력하여 key를 생성한다.
cd ~/.ssh 를 실행하여 생성된 key가 있는 곳으로 이동한다.
private key는 local에 public key는 원격지에 각각 두고 사용한다.
② GitHub에 public key 등록
a. cat id_rsa.pub 를 실행해 public key의 내용을 확인 후 복사한다.
b. https://github.com/settings/keys 로 접속하여 new SSH key 버튼을 클릭한다.
c. title을 작성하고 복사했던 public key를 key 항목에 붙여 넣은 후 Add SSH key 버튼을 클릭한다.
이제 SSH 주소를 사용하여 GitHub 연동이 가능하다.
(e.g) git clone [SSH address]