#
Git은 버전 관리 시스템 중 하나
버전=유의미한 변화가 결과물로 나온 것
게임도 여러 개발자가 여러 버전을 프로그래밍함
하나의 버전을 관리하는 과정에서 협업, 되돌리는 과정, 효율적인 백업이 필요함 -> Git
#
working directory 코드작업 공간 =변경이 생기는 공간. 모든 변경사항이 담김, 변경사항 중 일부 파일을 선별해 버전으로 만듦
stage area 버전이 될 후보가 서있는 공간
repository 저장소 =새로 만든 버전과 지금까지의 버전이 저장되는 공간
git<명령어>
$ git add <파일명> 작업공간에서 stage area로 넘어감(=1단계)
$ git commit -m "commit message" 버전으로 만드는 명령어=하나의 버전이 만들어짐(=2단계)
commit message는 사용자정의 메시지 같음. 뭘 수정, 뭘 생성했는지 등을 간략하게 작성함. 다음 버전에서 헷갈리지 않기 위함임.
#
우클릭 후 Git Bash Here 클릭하면 명령어 입력창 뜸
$ git init 버전관리 시작함
실행과 동시에 숨김폴더가 생기는데 안 보일 수도 있음, $ ls -al로 .로 시작하는 숨김파일이 확인됨.
$ git status 상태 알려줌
Untracked files=새로 생겨서 add나 commit 된 적 없는 파일, $ git add 하면 아무 변화 없어 보이지만 status 치면 Changes 확인할 수 있음.
$ git rm --cached <파일명> 이전 단계로 내려감
$ git add . 폴더 안에 있는 모든 변경사항을 stage area로 옮김
첫 commit 할 때 *** Plase tell me who you are. Run 뜨면 "" 안에 띄어쓰기 없이
git config --global user.email "이메일"
git config --global user.name "이름" 입력하면 됨.
$ git log 커밋 내역 확인할 수 있음, commit 이하의 노란색 문자열이 버전을 식별함, 권한과 날짜도 보임.
$ git commit 작성창 나오면서 더 길고 자세한 message 남길 수 있음.
#
원격저장소에 코드 업로드 = push
github에 push하는 과정
- 원격 저장소 생성
- local 저장소에 새 버전 생성
- 새 버전이 만들어진 곳에 $ get remote add origin <url>, $ git push -u origin main 명령어 복붙(=우클릭 후 Paste or Ctrl+Ins)
$ git commit -am "commit message" 동시에 add, commit 함. 단, 한번이라도 commit 했던 대상만 가능함.
중간에 깃허브 로그인 하라는데 비번 잃어버려서 push 시도 여러번 했더니 오류나서 이걸로 해결함.
$ git remote remove origin 기존에 연결돼있는 원격 저장소와의 연결 끊음
$ git remote add origin <새로 연결할 레파지토리 url> 로컬 저장소를 원격 저장솟에 연결함
$ git remote -v
$ git push origin main 소스코드 올림
디폴트화 없이 $ git push 하니 fatal: The current branch main has no upstream branch. 오류남.
#
$ git reset <옵션> working dir, staging area, repository에 올린 거 취소할 수 있음.
--hard HEAD^ 통채로 되돌림 (=커밋 취소후 unstaged 상태로 working directory에서 삭제)
--mixed HEAD^ 커밋 취소 후 unstaged 상태로 working directory에 보존, --mixed 생략 가능
--soft HEAD^ staged 상태로 working directory에 보존
HEAD 가장 최근 버전을 가르킴, HEAD~2 마지막 두 개 커밋, ^ 하나 전으로 되돌림, ^^ 두 개 전으로 되돌림
갓 만든 파일에서 $ git reset --hard HEAD^^하니까 새 파일 삭제되고 이전 파일은 수정 전으로 바뀜.
#
Branch의 필요성
- 직접 코드를 주고 받는 협업의 경우 불필요한 부분까지 코드 병합을 위해 이해해야 함. 비효율적
- 버전 수정/삭제하는 경우 자칫 엄한 코드까지 날릴 수 있음.
과정: 작업 단위로 나눔 > 각자 작업 > 합침
$ git init 으로 버전관리를 시작하면 자동적으로 main branch(=다른 branch들이 뻗어나가는 태초의 branch)가 생성됨. 프롬포트의 (main)이 그 흔적.
단, 한 번이라도 commit 을 해야 branch 생성 가능함.
$ git branch 현재 branch 목록 보기, * master 는 현재 내가 master branch에 속해 있음을 뜻함.
$ git branch <브랜치 이름> 브랜치 생성함
$ git checkout <브랜치 이름> 다른 브랜치로 들어감
와... 폴터에 만든 txt파일을 branch에서만 commit하고 main으로 돌아오니 파일 사라짐 개 신기하다
$ git merge <합치려는 브랜치 이름> 현재 브랜치에 <> 브랜치를 합침, 반영함.
#
$ git diff 변경내역들끼리의 비교 결과를 보여줌
$ git log 하면 보이는 commit 이하 마구잡이 문자열(=commit을 가르키는 commit bash)
$ git diff <비교대상 commit bash> <기준 commit bash> "비교대상에 비해" 기준이 무엇이 달라졌는지 보여줌
$ git diff <비교대상 branch 이름> origin/<기준 branch 이름> 원격 저장소와 로컬 저장소
$ git diff <비교대상 branch 이름> <기준 branch 이름> 브랜치간 비교
$ git diff HEAD HEAD^ 현재 branch의 가장 최근 commit과 이전 commit 비교
$ git diff HEAD 아직 commit하지 않은 현재 작업 중인 내용과 가장 최근 commit 비교
$ git revert <되돌아가고 싶은 commit>
reset = commit을 되돌림 = 이후의 버전들은 삭제됨 = 과거 자체를 바꿈
revert = commit을 되돌림 = 되돌린 버전 이후의 버전들이 모두 유지됨 = 과거를 바꿨다는 새 commit을 만듦
#
원격 저장소 = 외부의 레파지토리
협업은 repository들끼리의 상호작용(조회, 밀어넣기, 갖고 와서 합치기, 일단 갖고만 오기, 복사)임.
Local repository <--------------> Remote repository
$ git remote add origin <url> =내 local repo와 상호작용할 원격저장소를 더할 건데, 원격저장소 주소는 url 이고 단축이름은 origin 으로 해라
$ git remote 내 local repo와 상호작용하는 원격저장소 목록을 조회함
$ git remote -v 단축이름에 URL도 같이 보임
$ git push origin main =내 repo의 main branch를 origin의 main branch로 푸시해라
$ git push -u origin main 두 branch의 상호작용을 디폴트로 설정함, 앞으로 인자 안 써도 됨.
$ git pull origin main =origin을 내 repo의 main branch로 머지해라(=동기화해라)
$ git fetch origin main =origin을 내 repo의 main branch로 가져만 와라
$ git clone <url> url에 있는 원격저장소 내용을 cd에 복사해오기
#
github 협업하기
- 나는 안 변하고 원격이 변한 경우: pull
- 나도 변하고 원격도 변한 경우: pull request, push 권한주기(=collaborator 추가하기)
로컬과 원격이 모두 수정된 상태에서 $ git push 하면 ! [rejected] 뜸. 충돌은 파일에서 수동으로 확인/수정한 후 push 하면 됨. $ git push -f origin master 강제푸시 됨.
<<<< ===== >>>> 가 경계선이고, 윗부분이 내가 작성한 것, 아래부분이 원격에서 수정된 것.
#
큰 플젝에 충돌이 자주 발생하거나 얼굴 맞대는 작업이 불가능한 경우 invite collaborator는 적합하지 않음.
-> full request
협업대상 repository fork하기
fork 해온 곳에서 clone하기(=$ git clone <url>)
branch 만들고 코드 작성하고 push하기
pull request 날리기(=Open a pull request에서 create) 협업대상자는 Merge pull request로 수락함.
pull request 날린 branch 지우기
$ git checkout -b <branch 이름> 브랜치 생성과 이동이 동시에 됨
$ git branch -d <branch 이름> 브랜치 삭제
#
$ git log --all --decorate --graph --oneline 그래프 형식으로 커밋내역 볼 수 있음
--all: all 옵션이 없는 경우 HEAD와 관련 없는 옵션은 표시X
--decorate : 브랜치와 태그 등의 참조를 간결히 표시
--graph : 커밋 옆에 브랜치의 흐름을 그래프로 표시
--oneline : 커밋 메시지를 한줄로 요약해서 표시
* (HEAD -> master) master commit2
* master commit1
| * (branch1) branch commit2
| * branch commit1
|/
* B2
* B1
* B0
* (HEAD -> master) 지금 내가 master branch에 서있다는 뜻임.
branch1과 master의 공통조상는 B2, rebase하려면 master commit2가 base가 돼야 함
$ git checkout branch1
$ git rebase master
참고
'복수전공(소프트웨어공학) > Python, Linux, Git 등' 카테고리의 다른 글
리눅스마스터 2급 공부 (0) | 2021.02.27 |
---|---|
포매팅 (0) | 2021.02.13 |
20-1 리눅스와시스템적사고 (0) | 2021.02.12 |
[유튜브] 마크다운 6분 순삭 정리 - 깃허브 리드미 파일 작성 팁 (0) | 2021.02.08 |
자주 찾는 Git 명령어 (0) | 2021.02.05 |