HeYStRanGeR
article thumbnail

(마지막 업데이트: 23.05.15)

오소입 수업 중 git 내용 정리하기

학기 끝나면 올리려고 했는데, 그냥 올려야겟따


 

GIT

git 이란? 소스코드를 관리하는 형상관리시스템(분산버전관리시스템) (컴퓨터 파일의 변경사항을 추적하고, 여러 명의 사용자들 간의 해당 파일들의 작업을 조율한다.)

- 소프트웨어 개발에서 소스코드를 관리하는데 주로 사용한다.

- 기하학적 불변 이론을 바탕으로 설계했다. => hashing

- git server, 내 local, ssh server 는 모두 독립적인 공간이다. 수정한 내용을 동기화(?)해주려면 push/pull 해주어야한다. 충돌이 일어나기도 하는데, 이는 해결가능하다 -> 뒷부분에 설명

- git 의 장점: 분산 개발 용이성, 개발자들을 관리할 수 있는 확장성, 신속하고 효율적인 수행 성능, 무결성과 신뢰성 유지

 

 

 

간단하게 git의 과정에 대해 설명하자면 아래와 같다.

git clone을 해서 git server에 있는 것을 ssh 서버로 가져왔다고 가정한다.

ssh 서버에서 해당 레포지토리의 파일을 수정한다. git add 하면 stage에 올라가고, git commit 하면 repository에 올라간다.

해당 commit을 git server로 전송하는 것은 git push, git server 에 있는 것을 다시 가져오는 것은 git pull 이다.

 

 

 

Git branch, stream, fork

git fork 와 git branch 를 사용하는 상황의 차이점은?

- fork: 큰 규모일 때, 독자적인 sw 개발을 위해서, 코드를 아예 다시 짜려고 할 때

- branch: 간단한 버그 수정, 하나의 소프트웨어를 여러 사람이 나눠서 다룰 때

 

 


git 명령어 - setup

- global 옵션을 사용하면, 해당 설정을 다시 하지 않아도 됨.  .gitconfig 파일이 생성되며 그 안에 내용 기록됨.

- global 옵션을 빼면, 해당 레포지토리 안에서 명령어를 입력해야하며, .git/config 파일에 내용이 기록됨.

- 처음 commit을 하면 에러가 발생하고, 아래 명령어를 통해 초기 설정을 해주어야함.

git config --global user.email “이메일주소”
git config --global user.name “사용자이름”
git config --global core.editor vim #vim 으로 에디터 변경
git config --global color.ui auto

 

 

git 명령어 init

git init  #.git 생성 (git 저장소는 .git 이다)
git clone 링크  #git clone을 통해 복사한 레포지토리는 독립적이고 완전함

 

 

git 명령어 stage & snapshot

git status #git 상태 확인

-> 현재 git server 보다 commit 한개가 앞서고 있다는 의미. 즉, commit 이 하나 더 있다는 의미이다.

 

git add 파일명 #stage 에 올리기
git add -f 파일명 #.gitignore 무시하고 staging
git commit 파일명 #커밋메시지 입력 위해서 에디터로 넘어감
git commit -m "메시지" #에디터로 안넘어가고 바로 커밋
git commit -a -m "메시지" #add와 commit을 한번에 해결
git reset 파일명 #git add한것 지우기 (unstage), 변경한 것은 유지
git reset --hard 해쉬값 #해당 해쉬값으로 커밋을 되돌리고 그 이후의 것은 삭제
git diff #working directory와 stage area간의 차이 출력
git diff --staged #stage area와 repository 간의 차이 출력

 

 

git 명령어 branch & merge

git branch #브랜치 나열
git branch 브랜치이름 #새로운 브랜치 생성
git checkout 브랜치이름 #브랜치 바꾸기
git merge 브랜치이름 #해당 브랜치를 현재 브랜치로 합치기

서로 다른 라인을 수정했을 경우에는 merge를 해도 충돌이 일어나지 않고, 자동으로 merge 된다.

 

 

 

git 명령어 inspect & compare

git log #현재 브랜치의 모든 커밋 history 출력
git log branchB..branchA #branchB에 없는 branchA의 내용 출력
git log --follow 파일이름 #해당파일에 대한 커밋 보여줌
git diff branchB..branchA #branchB에 없는 branchA의 변화 출력
git show 해쉬값: 해당 해쉬값에 대한 내용 상세히 보여줌

 

 

git 명령어 tracking path changes

git log #현재 브랜치의 모든 commit history 출력
git log branchB..branchA #branchB에 없는 branchA의 내용을 보여줌
git log --follow 파일명 #해당 파일에 대한 commit 보여줌
git diff branchB..branchA #branchB에 없는 branchA의 변화 출력
git show 해쉬값 #해당 해쉬값에 대한 내용 상세히 보여줌

 

 

git 명령어 tracking path changes

git rm 파일명
git mv 기존경로 새로운경로
git log --stat -M

 

git 명령어 share & update

git remote add 별명 깃주소 #해당 깃주소를 별명으로 git 연결
git fetch 별명 #원격 저장소에 변경사항이 있는지 확인
git merge 별명(또는 브랜치명) #현재 브랜치에 해당 브랜치를 합친다
git push (별명) (브랜치명) #현재 저장소를 해당 별명을 가진 원격저장소의 해당 브랜치에 업로드
git pull #원격저장소에서 변경사항 가져오기
         #3 +++ : 3줄 추가되었다는 의미?
         #빈 디렉토리는 오지 않는다? (0바이트는 안옴)
git push #config에 remote가 있어줘야 git push 가능 → git remote 해주기
git push (별명) (브랜치명) #현재 저장소를 해당 별명을 가진 원격저장소의 해당 브랜치에 업로드

 

git 명령어 rewrite history

git rebase 브랜치명 #merge 처럼 브랜치를 합치는 건데, 가지가 나눠져있지않고 아예 합쳐짐 (여러 branch에서 push 했다면 rebase할 수 없음)
git reset --hard 해쉬값(또는커밋번호) #특정 커밋으로 돌아가고 그 이후의 것은 모두 staging area에서 삭제

 

git 명령어 temporary commits

git stash #변경사항 staging해서 working directory에서 해당 변경 안보이도록함
git stash list #stash 목록 나열
git stash pop #stash 스택 맨 앞의 것으로 작업
git stash drop #stash 스택 맨 앞의 것 제거

 

 

728x90
profile

HeYStRanGeR

@HeYStRanGeR

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!