[TIL]내 머릿속의 코드

[TIL:20240227]아는데 모르는 Git(3)

졸린부엉이 2024. 2. 27. 23:46
git의 원리와 상태에 대해 정리해 보았다.
 아는데 모르는 Git(1)
git의 commit, reset 기록 넘나들기
아는데 모르는 Git(2)

 

 

여기서는! 

  • branch
  • merge
  • pull, push
  • 명령어 모음집(코드잇 참고)

 


 

 

 

Commmit을 보니 좀 위험해 보인다. 괜찮아 우리에게 Branch가 있어. 만들어보자  

원본의 코드를 폴더 통째로 복사하여 원본과 상관없이 독립적으로 개발이 가능한 공간을 의미이다.

원본은 살리면서 다른곳에서 내가 난리 부르스를 추고 삭제하고 무슨짓을 해도 원본은 변화가 없다

 

그러면 브런치를 만들고. 그 공간으로 넘어가보자!

$ git branch
브런치 리스트 보기
$ git branch test-branch
'test-branch'라는 이름으로 브런치 생성
$ git checkout test-branch
'test-branch'로 브런치를 바꿈
$ git checkout -b auto-checkout-branch
'auto-checkout-branch '를 만들면서
브런치를 ' auto-checkout-branch ' 바꿔줌


$ git branch -d test-branch
' test-branch' 삭제 시 

브런치가 바뀌는거는
파란색 글씨를 보면 된다.
파란 글씨는 작업을 하기 위해 바꾼 브런치 명이다.

 

 


 

 

[심화과정] HEAD와 Branch와의 관계  

git의 commit, head, reset도 배우고, branch의 checkout도 배웠다
이 두개의 관계가 있다.

1. git의 HEAD  는 체크아웃한 브런치의 최신 커밋을 가르킨다.
예를 들어 master브런치를 HEAD가 가르키고 있었다.
git checkout premium 으로 브런치를 바꿨다.
그러면 HEAD는 premium으로 이동한다!​

코드잇-깃수업이미지[참조]




2. git의 head만이 브랜치에 의한게 아닌 독단으로 이동하여 다른 commit을 가르킬수도 있다.
그런상태를 "Detached HEAD" 상태이다.

이렇게 head만 이동하는 이유는!!!
과거 커밋에서 새로운 브렌치를 만들고 싶을때 이다.

$ git checkout 4b04 // 1. head가 commit의 과거 기록을 직접 가르기게 한다 (4b04번 기록)
$ git branch new-branch // 2. 과거기록을 새로운 브런치에 생성한다


이렇게 head가 가르키는 commit의 기록이  그대로 새로운 브런치가 만들어 지는것이다.
그러면서 직접 commit을 가르키던 head는 새로 만든 'new-branch'를 가르키게 된다.

 

 

 


 

 

 

Branch에서 다 작업했어! 원본에 Merge(병합)하고 , Remote(원격저장소)에 저장.  

전에 쓴글의 이미지를 사용해서 간단히 설명을 하려고 한다.

 

 


원본 파일 브런치는 [메인]  ||  수정할 브런치 이름을 [수정1]이다

1. 버전관리를 할 때 원본파일을 '졸업논문.hwp' 파일을 원본에서, [수정1]이라는 브런치를 생성, 이동한다.
2. [수정1]에서 목차를 수정하고 저장한다.(commit 과정까지)
3. [메인]브런치로 checkout을 한다.
4. 그리고 "git merge 수정1"이라고 명령한다
5. git push로 원격저장소에 저장한다.

 

 

 

 


 

 

 [찾아보기] Merge의 종류  

Merge Commit
Squash Merging
Rebase Merging
Recursive Merge
Fast-forward
등등등...

종류가 있다. 이것은 회사마다 다르기 떄문에 나중에 일을 하게 된다면 그때 좀더 자세히 찾아 볼 예정이다!

 

 

 


 

 

작업 전엔 항상 Pull  ~  아!  Fetch도 있어. 

push를 하게 되면 remote에 내가 작업한 것이 업로드 되어있다.

 

pull은 remote 저장소에서 있는 최신 commit들을 내 local repository(로컬저장소)로 가지고 온다.

그리고 자동으로 merge를 하여 새로운 commit을 만든다.

 

코드잇-깃수업

 

 

fetch는 pull과 같이만, merge만 안한다고 생각하면된다.

 

 

그럼 왜 하는거야?

merge를 하기 전에 remote에 올라온 파일이 문제가 없는지 확인을 하고 싶을때, 

git fetch를 하여 내용만 가지고 와서 확인하고!

문제가 있을시에 수정을 하고, 없으면 merge를 하면 된다.

 

 

 


 

 

 

 명령어 모음집  

코드잇에 정보를 참조하였다!

내가 생각하는 방식으로 조금 분리를 하고, 내용도 좀 수정하였다

 

레포지토리 관리

git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성

git config user.name 'codeit' : 현재 사용자의 아이디를 'codeit'으로 설정(커밋할 때 필요한 정보)

git config user.email 'teacher@codeit.kr' : 현재 사용자의 이메일 주소를 'teacher@codeit.kr'로 설정(커밋할 때 필요한 정보)

git push -u origin 브런치 : 맨 처음 브런치가 리모트에 없을때, 로컬 레포지토리의 브런치가 리모트 레포지토리에 tracking 되도록 설정고 등록해야한다

  • u는 '--set-upstream'약자로

로컬 레포지토리에 있는 master 브랜치가 origin에 있는 master 브랜치를 tracking(추적)하는 걸로 설정

 

git 도움말

git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력

 

파일 및 디렉토리 관리

git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기

git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기

git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기

git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음)

원격 저장소 업로드 및 다운로드

git push : 위의 커맨드를 한번 실행하고 난 후에는 git push라고만 쳐도 로컬 레포지토리의 내용을 리모트 레포지토리에 올릴 수 있다.

git pull : 바로 위의 위에 있는 커맨드를 한번 실행하고 난 후에는 git pull이라고만 쳐도 리모트 레포지토리의 내용을 로컬 레포지토리로 가져온다.

git fetch : 리모트에 먼저 머지된 내용을 확인하고 싶고 싶을 떄 사용한다.pull과 다르게 머지는 자동으로 되지 않기에 확인하며 머지를 따로 해주면 된다.

git clone [프로젝트의 GitHub 상 주소] : GitHub에 있는 프로젝트를 내 컴퓨터로 가져오기

 

Commit 관련

git commit : 에디터가 열리며 작성하기 편하고 많은 글을 쓸때 용이하다

git commit -m "커밋 메시지" : 현재 staging area에 있는 것들 커밋으로 남기기

git commit --amend : 최신 커밋을 다시 수정해서 새로운 커밋으로 만듦

git rebase [브랜치 이름] : A, B 브랜치가 있는 상태에서 지금 HEAD가 A 브랜치를 가리킬 때, git rebase B를 실행하면 A, B 브랜치가 분기하는 시작점이 된 공통 커밋 이후로부터 존재하는 A 브랜치 상의 커밋들이 그대로 B 브랜치의 최신 커밋 이후로 이어붙여짐(git merge와 같은 효과를 가지지만 커밋 히스토리가 한 줄로 깔끔하게 된다는 차이점이 있음)

git revert : 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성

 

Commit history 관련

git log : 커밋 히스토리를 출력

git log --pretty=oneline : --pretty 옵션을 사용하면 커밋 히스토리를 다양한 방식으로 출력할 수 있다. --pretty 옵션에 oneline이라는 값을 주면 커밋 하나당 한 줄씩 출력

git show [커밋 아이디] : 특정 커밋에서 어떤 변경사항이 있었는지 확인

git diff [커밋 A의 아이디][커밋 B의 아이디] : 두 커밋 간의 차이 비교

git blame : 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력

 

Git reset 관련

과거의 커밋으로 git reset을 -hard 바꿨다고 최신의 커밋들이 삭제되는 게 절대 아니고, 기록이 보지 않을뿐 숨겨져있다.

git reflog : HEAD가 그동안 가리고있던 커밋들의 기록을 출력

git reset [옵션][커밋 아이디] : 옵션에 따라 하는 작업이 달라짐(옵션을 생략하면 --mixed 옵션이 적용됨)

  • git reset --soft [커밋 아이디] : HEAD를 특정 커밋으로 이동시키면서 staging area와 working directory는 그대로 유지
  • git reset --mixed [커밋 아이디] : HEAD를 특정 커밋으로 이동시키면서 staging area는 초기화되고 working directory는 그대로 유지
  • git reset --hard [커밋 아이디] : HEAD를 특정 커밋으로 이동시키면서 staging area와 working directory 모두 해당 커밋의 상태로 변경그리고 이때 커밋 아이디 대신 HEAD의 위치를 기준으로 한 표기법(예 : HEAD^, HEAD~3)을 사용해도 됨

브랜치 관리

git branch [새 브랜치 이름] : 새로운 브랜치를 생성

git checkout -b [새 브랜치 이름] : 새로운 브랜치를 생성하고 그 브랜치로 바로 이동

git branch -d [기존 브랜치 이름] : 브랜치 삭제

git checkout [기존 브랜치 이름] : 그 브랜치로 이동

git merge [기존 브랜치 이름] : 현재 브랜치에 다른 브랜치를 머지

git merge --abort : 머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아감

 

Stash 관련

git stash : 현재 작업 내용을 스택 영역에 저장

git stash apply [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용

git stash drop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 스택에서 삭제

git stash pop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용하면서 스택에서 삭제

 

기타

git config alias.[별명][커맨드] : 길이가 긴 커맨드에 별명을 붙여서 이후로는 별명으로도 해당 커맨드를 실행할 수 있게 설정

git tag [태그 이름][커밋 아이디] : 특정 커밋에 태그를 붙임

git log --all --graph : 모든 브랜치의 커밋 히스토리를, 커밋 간의 관계가 잘 드러나도록 그래프 형식으로 출력

 

 

push까지 절차끝났다 틈틈히 배운것과 왜 이런 과정이 일어나야 하는지 정확하모르고, 그냥 순서에 맞게 사용한건데..

다 의미가 있고 어떻게 해야 살리고, 되돌아가고 하는지 알겠다! ㅎㅎㅎ

 

 

 


 

 

 

Last  

......

정신없이 썼다. 하루가 지났다..
내일을 수업들어야지..
오늘은 이만 하면 ... 나쁘지 않아

교육을 듣고, 찾으면서 작성하였는데
git은 참 대단하다

git의 마스터가 되는날까지!!