거북이의 IT 공부

깃(Git) - 깃크라켄(Gitkraken)과 함께 본문

IT 기타

깃(Git) - 깃크라켄(Gitkraken)과 함께

버니빈 2020. 8. 4. 02:29

1. git init - 해당 폴더를 git 명령어를 이용할 수 있는 폴더로 만든다

로컬 폴더를 깃이 관리할 수 있도록 등록한다

(해당 프로젝트에 .git 이라는 폴더가 생성되어 git으로 관리할 수 있게 된다)

 

한마디로 git 저장소(로컬 저장소)가 생성된다고 쉽게 생각해도 된다.

이때 gitkraken의 폴더 안에는 아무것도 없다(우리가 보기에는)
git init만 한 gitkraken의 상태(open a repo로 연 상태) - local에 master가 없다

그런데 새로 만들 폴더를 git 저장소(Repository)로 만드려면, repo를 가르키는 master가 필요하고, 이것은 최초 1회 commit을 통해 생성할 수 있습니다.
그렇기 때문에 파일을 add하고 commit을 함으로써 저장소가 생성이 된 것입니다!

(이 부분은 헷갈릴 수 있는데 그렇게 중요한 개념이 아니므로 패스해도 된다)

 

gitkraken의 흥미로운 점은 start a local repo -> init를 하면 master를 알아서 생성해준다. 즉, 자동적으로 로컬 저장소를 생성한다.
작업폴더로 들어가면 readme가 생성되어 있는 모습 또한 확인할 수 있다.

 

2. git clone - 원격 저장소(웹에 존재하는 저장소)를 지역 저장소에 복제한다

.git 폴더까지 포함해서 소스를 받을 수 있다!!!

깃허브에서 만든 원격 저장소로 시작하고 싶을 때 자주 사용된다(로컬 저장소에 그대로 폴더가 복제된다)

 

3. git remote - 해당 지역 저장소가 원격 저장소에 연결되어 있는지 확인해준다.

git remote add {별칭} {원격 저장소 url} - 해당 지역 저장소를 원격 저장소에 연결해준다.

 

4. git add - 작업 폴더에 있는 파일을 가상의 준비 영역(staging area)에 옮긴다

변경 사항들 중 필요한 사항과 아닌 사항을 구분하면서 차곡차곡 인덱스에 저장한다.

 

*작업폴더 -> 인덱스(staging area) -> 저장소(Head - Repository, 로컬 저장소와 원격 저장소)

출처 - https://rogerdudler.github.io/git-guide/index.ko.html

새로운 파일을 작업폴더에 만들었다

그러면 깃크라켄에서는 아래와 같이 나온다

깃크라켄을 통해 손쉽게 add, commit까지 할 수 있다.
왜 가상의 준비 영역이 필요한지 알 수 있는 사진이다.

위 사진은 test2 파일은 가상 영역에서 삭제하고 싶어서 휴지통 아이콘을 누르니 경고문이 나온다.

reset all를 누르면 test2.txt는 더이상 찾을 수 없게 된다(물론 로컬 컴퓨터에서도!!)

 

이 상태에서 push를 누르면 아래와 같은 에러문이 뜬다

로컬 저장소에 원격 저장소를 등록하지 않아서 생긴 에러문이다
remote에 플러스 아이콘을 누르면 이처럼 원격 저장소를 손쉽게 등록할 수 있다(remote add). 원격 저장소 별명을 origin으로 했다.

로컬 저장소에 원격 저장소(remote repository)가 등록되었다. 그러나 브랜치를 생성한 적은 없다.

이제는 push가 되며 origin(원격 저장소)에 알아서 master 브랜치가 생성된다.

 

 

 

 


여기까지가 기본 세팅이고 추가적으로 브랜치(branch)를 알아보자

 

로컬 저장소에서 branch를 팠다
'youbin' branch를 push한다

 

그러면 저절로 원격 저장소에도 youbin branch가 생성된다.
로컬이 youbin branch에 있는 상태에서 새로운 commit를 했더니 로컬이 master보다 위로 올라간것을 확인할 수 있다.
youbin branch를 push한 상태

 

그렇다면 merge란 어떻게 하는 것일까...??

제일 어려운 부분이라고 나는 생각한다(합병이라는 개념이 와닿지 않는 적이 많다)

merge youbin into master ( 깃크라켄에서 master를 더블클릭하고 youbin을 오른쪽 마우스 클릭한다)

그러면 아래처럼 youbin 브랜치가 master로 병합이 된다

 

 


 

0. git log - 해당 브랜치의 커밋 내역들을 확인한다

 

원격저장소에 있는 내용을 지역저장소로 가져올 때 두가지 방법 -> pull, fetch

pull과 fetch의 가장 큰 차이는 merge를 하냐 하지 않느냐의 차이입니다.

1. git pull - 원격저장소에 있는 소스를 현재 로컬 소스에 병합한다

= git fetch + git merge

 

예를 들어 master <- youbin 상황이라고 한다면

youbin branch에 있는 상황에서 git pull origin master

git pull origin {branch name} - origin에 연동된 원격 저장소에서 특정 브랜치만 pull해온다.

 

특정 브랜치를 pull하는 것 또한 가능하다는 것을 알 수 있다!!! 이제 push하면 마무리.

재밌으닌깐 한번더 도전!!

test에 있는 상황에서 git pull origin youbin
merge youbin into test와 같은 효과를 보인다!!

그렇다면 pull vs merge ??

git merge : local branch와 local branch를 merge(병합)한 commit을 생성한다

git pull : local branch와 remote branch를 merge한 commit을 생성한다

 

git pull은 보통 local/master 브랜치로 remote/master 브랜치를 가져올 때 사용한다

또는 local/my_branch로 remote/my_branch를 가져오는 것도 마찬가지이다

(좀더 자세하게 설명하면, 위와 같이 사용할 경우 merge라기보다는 forward된다)

그런데 이걸 cross하여 사용하면, 즉 local/master 브랜치로 remote/my_branch 브랜치를 가져오면

이 둘이 merge된 commit이 생성된다

 

↓더 자세한 사항은 아래를 참고하자

https://ssaemo.tistory.com/74

 

[git] merge, git pull, branch 팁/노하우

git 커맨드 종류가 다양해서 외우고 이해하기 힘들수도 있는데 그 중 git merge와 git pull는 비슷한 커맨드이다 git merge : local branch와 local branch를 merge(병합)한 commit을 생성한다 git pull : lo..

ssaemo.tistory.com

fetch안하고 pull을 하면 "어차피 나는 커밋내역 뭐 올라와 있는지 확인/알고 있으닌깐 그냥 가져와서 병합해줘" 느낌이다.

 

 

2. git fetch - 단순히 원격 저장소의 내용을 확인만 하고 로컬 데이터와 병합은 하고 싶지 않은 경우

fetch 를 실행하면, 원격 저장소의 최신 이력을 확인할 수 있습니다.

 

이 때 가져온 최신 커밋 이력은 이름 없는 브랜치로 로컬에 가져오게 됩니다.

이 브랜치는 'FETCH_HEAD'의 이름으로 체크아웃 할 수도 있습니다.

Git은 fetch 단계에서 원격 저장소의 변경 사항을 로컬 저장소로 가져오는데 이 때 '원격 추적 브랜치'를 사용하게 된다.

원격 브랜치에 대한 원격 추적 브랜치가 존재하지 않을 경우 원격 추적 브랜치를 만들고 이 원격 추적 브랜치에 변경 사항을 공유 받게 된다.

  • git fetch 명령이 실행되면 원격 저장소로 부터 가져온 모든 브랜치의 헤드를 .git/FETCH_HEAD 파일에 기록하게 된다. 즉, FETCH_HEAD는 원격 저장소로부터 가져온 브랜치의 HEAD를 의미한다.
  • git fetch 이후에만 유효한데, 패치 작업 직후에 가져온 브랜치의 최신 커밋을 참조할 때 유용하다.

(깃크라켄에서는 fetch를 시각적으로 지원해줘서 굳이 fetch를 해주지 않아도 원격 저장소의 최신 커밋들을 확인 할 수 있었다. 우리가 할 필요성이 적다)

 

↓더 자세한 사항은 아래를 참고하자

https://backlog.com/git-tutorial/kr/stepup/stepup3_2.html

 

fetch(가져오기)【원격 저장소】 | 누구나 쉽게 이해할 수 있는 Git 입문~버전 관리를 완벽하게 이��

fetch(가져오기)【원격 저장소】 | 누구나 쉽게 알 수 있는 Git에 입문하신 것을 환영합니다. Git을 사용해 버전 관리를 할 수 있도록 함께 공부해봅시다!

backlog.com

https://mylko72.gitbooks.io/git/content/remote/remote_sync.html

 

리모트 저장소와의 동기화 · Git, 분산버전 관리시스템

 

mylko72.gitbooks.io

 

 

이러한 상태에 있다고 생각하자
git checkout FETCH_HEAD
FETCH_HEAD에 있는 상태에서 커밋을 확인하니 원격 저장소 master의 최신 커밋 확인이 가능했다!!

git에서 HEAD tag는 현재 체크아웃된 커밋을 가리킨다. 즉, 현재 작업중이 커밋

HEAD가 원격 저장소에 있는 것을 확인할 수 있다

 

 

 브랜치에서 다른 브랜치로 합치는 방법으로는 두 가지가 있다 -> merge, rebase

3. git merge - 명령어에 병합할 커밋 이름을 넣어 실행하면, 지정한 커밋 내용이 'HEAD'가 가리키고 있는 브랜치에 넣어집니다.

 

A브랜치에서 B브랜치를 병합한다 (= A로 B를 가져온다. A<-B)

: git merge {B브랜치명}

 

예시에서 본 test 브랜치를 master로 병합하고자 한다.

결과화면

  • fast-forward - 동일 내용이 포함되는 브랜치일 경우 브랜치 이동만으로 병합해서 따로 commit을 생성하지 않는 경우
  • merge commit - 서로 다른 상태의 브랜치를 병합해서 새로운 commit을 만드는 경우

↓더 자세한 사항은 아래를 참고하자

https://yuja-kong.tistory.com/51

 

[Git] branch 병합하기 (merge), fast forward와 merge commit의 차이점

서로 다른 branch 병합하기 (merge) 현재 master, exp 라는 branch가 있을 때, exp를 master에 병합할 경우 master 브랜치로 이동하고 exp를 병합합니다. $ git checkout master $ git merge exp exp 병합 전 ex..

yuja-kong.tistory.com

 

 

4. git rebase -  base를 다시 지정하다라는 의미입니다.

git rebase master (head - youbin) 를 해주면 어떻게 될까?
rebase한 상태에서 push하려고 할때 경고문이 뜨면서 pull하라고 뜬다. 왜일까?

깃크라켄에서 pull을 받으면 'Merge remote-tracking branch 'origin/youbin' into youbin'라고 뜬다.

파란색 점으로 로컬 youbin은 rebase가 되었지만, remote youbin 브랜치가 local youbin에 합병된 느낌이 되었다.

이러한 경우 예쁜 상태가 아니므로 해결 방법은 "force push"이다.

 

(참고)https://milooy.wordpress.com/2015/12/15/git-rebase-push-error/

 

git rebase후 push 에러 해결

개요 내 브랜치에서 메인 브랜치를 찝어서 rebase를 한 뒤 push하면 아래와 같은 에러가 뜰 때가 있다. 뭐 내 브랜치 가리키는게 뒤에 있어서 샬라샬라 같은 문제인듯 하다. 여기서 pull을 받고 push를

milooy.wordpress.com

 

 

이번엔 test 브랜치를 master로 rebase한 코드
그 결과 깔끔하게 rebase된 모습을 확인할 수 있다!!

https://13akstjq.github.io/git/2019/07/24/Git-Rebase.html

 

웹 개발 기술 블로그

웹 개발에 필요한 지식을 기록하는 블로그입니다.

13akstjq.github.io

↑ merge commit, fast-forward, rebase를 그림으로 잘 설명해주었다.

더 알고 싶은 사람은 참고하시길 바랍니다.

 

 

 

 

 

그럼 모두모두 재미있는 깃크라켄의 매력으로 퐁당퐁당 빠져봅시다! 

Comments