git 관련 정리

cho·2023년 7월 1일
0
$git version
$git config --global user.name "<name>"
$git config --global user.email "<email>"
$git config --list -> git config 내용확인

$git init ".git"이라는 숨김 디렉토리가 생성됨 (스테이지와 저장소가 .git 디렉터리)

작업 트리스테이지저장소
- 파일 수정, 저장 등의 작업을 하는 디렉터리버전을 만들 파일이 대기하는 곳- 스테이지에 있는 대기파일을 버전으로 만들어 저장하는 곳
-작업 디렉터리(working directory)라고도 함- '스테이징 영역'이라고도 함- '리포지토리'라고도 함
-우리 눈에 보이는 디렉터리가 바로 작업 트리- 눈에 보이지 않음- 눈에 보이지 않음

git을 통하여 버전을 관리하는 과정

  1. 작업 트리에서 파일을 수정하고 저장
  2. 버전을 만들고 싶으면 스테이지에 넣음
  3. 스테이지에 있던 파일을 저장소에 버전으로 저장

$git status 저장소의 상태를 확인함
$git log 지금까지의 저장소의 상태를 확인함

옵션내용
-nn개의 히스토리만 출력
-p각 commit의 diff 결과를 출력
-p -2최근 2개의 diff 결과를 출력`
--all모든 히스토리를 보여줌
--onelinelog의 내용을 한 줄로 간략하게 보여줌
--branches모든 branch에 대한 log 내용을 보여줌
--graph간략한 그래프 형태로 표시해줌
<branch#1>..<branch#2>두 브랜치의 차이를 보여줌
--reverse오래된 log부터 확인

$git add main.py main.py를 스테이지에 추가
$git add* 모든 파일을 staged 상태로 만든다

$git commit -m "message" $git commit -am "message"-> add와 commit을 동시에 수행함

  • 버전을 만드는 행위 "커밋"
  • 커밋할 경우에 메시지("message"내용)를 함께 기록

$git diff

  • 현재 working directory의 마지막 commit과의 차이점을 비교
  • $git diff <commit#1> <commit#2> : 두 commit의 차이점을 비교

$ git checkout <commit>

  • 해당 버전으로 파일 되돌릴 수 있음
  • $git log --all을 통하여 이후 버전 확인 가능

gitignore

  • 설정된 파일들에 대하여 git track하지 않도록 설정하는 역할
  • 원격저장소(github)와 연동할 때 많이 활용함

git branch

  • 필요한 이유
    1. 여러가지의 코드 버전이 생겨날 때
    2. 지금 버전의 내용을 기억하고 다른 버전으로 코드를 작성할 때
  • master : 깃에서 자동을 만드는 기본 브랜치
  • 분기(branch) : master 브랜치에서 새 브랜치를 만듦
  • 병합(merge) : 새 브랜치에 있던 파일을 master 브랜치에 합침

(HEAD -> master)의 의미
1. master 브랜치가 가장 최신 커밋을 가리킴
2. HEAD가 master 브랜치를 가리킴
3. HEAD는 여러 브랜치 중에서 현재 작업중인 브랜치를 가리킴

$git branch <branch name> 브랜치 생성
$git checkout <branchname> 브랜치 이동 HEAD가 가리키는게 바뀜
$git checkout -b <branch name> = $ git branch <branch name> + $ git checkout <branch name>

브랜치 병합하기

  • master 브랜치로 체크아웃
  • $git merge <branch name> 자동병합 or 충돌
    • 자동 병합
      다른 파일 수정, 같은 파일이라도 다른 위치 수정, $git branch -d <branch name> 해당 브랜치 삭제하면 끝
    • 충돌 발생
      충돌 문서를 직접 수정하여 충돌을 해결해야 함, 수정했으면 해결한 파일을 스테이지에 올리고 커밋, $git branch -d <branch name>

브랜치 강제 삭제법

$git branch -D <branch name>

git cycle

  • Untracked : git에서 파일을 추적하지 않는 상태
  • Unmodified : git에서 파일을 추적중, 수정된 내용 없음
  • modified : git에서 파일을 추적중, 수정된 내용 있음
  • staged : git에서 commit에 적용된 파일의 상태

git 복귀(되돌리기)

  • 코드를 예전 버전으로 되돌림
  • checkout (복귀라고 보기에는 애매함) : HEAD가 가리키는 커밋을 변경함
  • reset($git reset --soft 형태) : 기록된 커밋을 취소하는 형태 soft/mixed/hard 옵션 존재 default는 mixed
  • revert : 기록한 커밋을 남겨두고 취소에 대한 새로운 커밋을 생성

reset 옵션

commit 순서에 따른 되돌리기 정도
1. 파일 수정 (edit files)
2. 수정된 파일 add ($git add*)
3. add된 파일들을 commit ($git commit -m "message")

옵션내용git cycle되돌리기 정도
soft변경 이력은 모두 삭제하지만 변경 내용은 남아있음stage 상태3 변경
mixed변경 이력은 모두 삭제하지만 변경 내용은 남아있음modified 상태2,3 변경
hard변경 이력은 모두 삭제하고, 변경 내용도 삭제이전 커밋의 unmodified 상태1,2,3

원격 저장소(github)와 연결되어 있을 경우

  • reset -> commit -> push -> 여러 error 발생이 가능
  • --force 옵션을 통해서 강제로 overwrite가 가능
  • 혼자만 사용하는 경우에는 크게 문제가 없지만 협업하는 공간에서는 많은 문제들이 발생 가능하니 reset을 자제하자

git revert

특정 커밋을 취소하는 커밋 생성함, 원격 저장소(github)를 활용할 경우에는 reset보다는 revert를 활용하자

$ git revert HEAD

  • 지금 HEAD의 커밋을 취소하는 커밋을 생성함
  • --no-edit : 커밋 메시지 작성 X

$ git revert <commit#1> ... <commit#2>

  • <commit#1>에서 ...와 <commit#2>까지를 취소하는 커밋을 생성함
  • --no-edit : commit 메시지 작성 X

git checkout

$ git checkout <file> : 특정 <file>의 수정사항을 커밋상태로 되돌림
$ git checkout . : 모든 파일의 수정사항을 커밋상태로 되돌림
$ git checkout <commit ID> : HEAD가 가리키는 <commit>을 변경, 사용자의 시점이 이동한다고 볼 수 있음, 어느 파일도 삭제X, $git log --all로 확인이 가능

git reflog

  • git의 모든 이력을 다 볼 수 있는 reflog
  • $git reset --hard <commit>도 복구가 가능함
  • 삭제한 branch 또한 복구가 가능함
  • 거의 모든 상황에서 복구가 가능하지만, 항상 가능한 것은 아님

gitignore

  • 설정한 파일들에 대해서 git track하지 않도록 설정하는 역할
  • #은 주석의 역할
  • main.py : main.py 파일을 무시함
  • *.py : 확장자가 py인 파일을 무시함
  • /*.py : 현재 디렉토리 중에서 확장자가 py 파일을 무시함
  • !main.py : main.py를 무시하지 않음
  • /dir : 현재 디렉토리에 있는 dir 폴더에 있는 파일들을 무시함
  • dir/ : 전체에서 모든 dir 폴더명에 있는 파일들을 무시함
  • dir/*.py : dir 폴더에 있는 확장자 py 파일을 무시함
  • dir/*.{png, jpg} : dir 폴더에 있는 png, jpg 파일을 무시함

git rebase

$git rebase <commit>

  • 브랜치를 합치는 방법중 하나, 커밋의 트리 구조를 재배열함.
  • 코드의 분기점을 변경하여 커밋의 진행사항을 좀 더 쉽게 파악함.
  • master 브랜치를 제외하고 모든 브랜치는 base가 존재한다.

git stash

  • 수정 중인 파일 감추기 및 되돌리기 (파일을 수정했지만 커밋하지 않은 상태)
  • $ git stash or $ git stash save : 작업 디렉토리에서 수정한 파일들을 저장
  • $git stash pop : stash 목록에서 가장 최근 항목으로 되돌리고 stash 목록에서 삭제
    $ git stash apply <stash 이름> + $ git stash drop <stash 이름>과 유사
  • $ git stash list : stash한 여러 목록들을 확인

git 원격 저장소

$git remote -v : 현재 연결된 원격 저장소를 보여줌, 안 나오면 연결된 원격 저장소가 없는 것
$git remote add origin <경로> : "경로"를 원격 저장소 경로로 설정
$git push origin master : origin = 원격저장소(remote)의 주소, master = 현재의 브랜치, $git push --set-upstream origin master를 1번 옵션으로 넣어주면 그 이후에는 $git push만 입력이 가능하다

여러 개의 원격 저장소 활용이 가능하다.

ssh를 통한 git 원격 저장소

git의 저장소를 다른 컴퓨터에 저장함
1. ssh를 통하여 원격 저장소에 접속함
2. 원하는 디렉토리에 git 원격 저장소를 생성함 ($git init --bare)
3. 원격 컴퓨터의 ip 주소와 git 원격 저장소의 절대경로 확인
4. 로컬 컴퓨터에서 원격 컴퓨터를 연결함 ($ git remote add origin ssh://<계정>@<IP 주소>/<절대경로>/
5. $ git push --set-upstream origin master
6. 원격 컴퓨터에서 $git log --oneline로 확인함

github

로컬 컴퓨터에서 git 프로젝트를 clone 해보자
$ git clone <github 레포지토리 주소> <디렉토리 이름> 디렉토리 이름은 생략 가능

main.py 파일을 작성하고 push하는 과정
$ echo “hello world!” >> main.py
$ git add main.py
$ git commit -m “add main.py file”
$ git push origin master

ssh key를 활용한 연결

  • 로컬 저장소에서 $ ssh-keygen 입력
  • $ ls -al /home/<계정>/.ssh/ 본인의 계정명에 맞게 입력하고 id_rsa(private key) , id_rsa.pub(public key)이 생성됐는지 확인
  • github 홈페이지 Settings -> SSH and GPG keys -> New SSH key 클릭 -> public key 복사한 내용 붙여넣기

git hub와의 연동 내용

  • push 명령어 : 로컬 저장소 -> 원격 저장소(깃허브)
  • pull 명령어 : 원격 저장소(깃허브) -> 로컬 저장소
    로컬 저장소의 내용이 원격 저장소의 내용과 일치하게 됨
  • fetch 명령어 : 원격 저장소(깃허브) -> 로컬 저장소
    • 로컬 저장소의 내용은 로컬 저장소의 최근 커밋을 가리킴
    • 원격 저장소의 최신 커밋 내용만을 가져옴
    • 원래 내용과 수정된 내용을 확인 가능함
    • 확인 후, 병합을 하면 git pull과 같은 상태가 됨

커밋을 여러 번 후에 push해도 모든 커밋이 반영된다

git 병합

  • Fast-Forward 병합
    • 순차적으로 커밋이 진행된 경우
    • 일직선과 같은 그래프를 가질 경우
    • 병합 과정에서 새로운 커밋은 생기지 않음
  • 3-way 병합
    • 브랜치별로 각각 커밋을 진행한 경우
    • 공통 베이스가 되는 커밋이 존재함
    • 병합 과정에서 새로운 커밋이 생성됨

checkout / switch / restore

  • checkout == switch + restore
    • swtich : 특정 branch로 변경함, $git swtich -c <branch name> : 브랜치를 생성하면서 변경 $ git checkout -b <branch name>와 동일함
    • restore : 변경사항을 복구 해주는 기능
      $ git restore . $ git restore <특정 파일 이름> $ git restore --staged <스테이지에 있는 파일 이름>

cherry -pick

다른 브랜치에 있는 특정한 커밋을 가져옴 $ git cherry-pick <commit hash>

git을 통한 협업

  1. 하나의 원격 저장소 레포지토리를 생성
  2. 협업하는 사람이 모두 push를 할 수 있도록 권한을 설정(ssh-keygen를 통해 public key 등록,collaborator 등록 등)
  3. 각각의 사람은 branch를 만들어서 활용
  • 원격 저장소를 총괄하여 관리하는 한 명의 관리자를 설정함 (관리자가 레포지토리 생성, 협업하는 사람들 추가)
  • 최초의 레포지토리에 develop 브랜치를 생성하고, 베이스라인 코드를 만듦
  • 각자 코딩할 역할을 정하고, develop 브랜치를 clone함(새로운 브랜치를 생성하여 본인의 작업을 새로운 브랜치에서 수행함)

관리자의 활동
• $ git clone <레포지토리 주소> <디렉토리 이름>
• $ git checkout -b develop
• $ echo “main” > main.py
$ echo “data loader” > data_loader.py
$ echo “model” > model.py
• $ git add main.py data_loader.py model.py
• $ git commit -m “first baseline version”
• $ git push origin develop

협업자의 활동
$ git clone -b develop <레포지토리 주소> <디렉토리 이름>
$ git branch로 현재의 브랜치명을 확인
$ git checkout -b <새로운 브랜치명>
작업수행
$ git push origin <새로운 브랜치명>

관리자는 협업자가 push한 내용들을 pull하여 여러 branch를 생성함
$git pull origin <브랜치명>
이상이 없는지를 확인하고, 병합(merge) 작업을 수행함
원격 저장소의 더 이상 필요없는 브랜치는 삭제함 $git push origin --delete <삭제할 브랜치명>

README 파일

  • Edit file : README 파일의 내용을 작성하는 곳

  • Preview : 작성된 README 파일을 미리보기 하는 곳

  • 제목(Head) : 텍스트 앞에 # 1~6개 #과 텍스트 사이에는 공백 필요

  • 텍스트 단락 줄 바꾸기 : Enter 두번 이상

  • 가로줄 : -나 *을 3개 이상 입력할 경우 가로줄 삽입

  • 목록 : 숫자 붙여서 작성하면 순서 목록, +,-,* 붙여서 작성하면 순서없는 목록

  • 인용문 : 내용 줄 앞에 > 추가 하나가 아니라 여러 개 넣으면 인덴트된 인용문 추가

  • 소스코드 : 한 줄은 ` 여러줄은 ``` 여러줄은 뒤에 특정 언어를 표시하면 그 언어로 표현이 됨

  • 텍스트 강조 : *기울임체* or _기울임체_ , **굵게** or __굵게__ , ***굵은 기울임체*** or ___굵은 기울임체___

  • 링크 : <링크 주소> [링크 텍스트](링크 주소) [링크 텍스트](링크 주소 "부가 설명")

  • 이미지 : ![image](이미지 파일 경로), <img src="이미지 파일 경로" width="" height="">, 로컬 저장소에 있는 이미지 파일을 드래그&드랍

  • 테이블(표) : |제목|내용| |----|----|----|

git의 pull request

-포킹한 주소 레포지토리 clone하고 커밋, 푸쉬 -> pull request를 만들면 포킹한 원 레포지토리 관리자가 변경 내용을 확인하고 Merge pull request를 할 수 있음

git의 tag

  • 특정 커밋의 해시 값을 가리키는 꼬리표
    • Annotated : 태그 이름 + 정보를 가짐 tag 이름은 유일해야 하며, 같은 이름의 tag를 중복해서 생성 불가능, 생성할 때 메시지를 작성해야함(commit과 유사 $git tag -a v.1.0.0 -m "first version") , $git show <tag명> : tag 정보 상세 보기
    • Lightweight : 태그 이름만을 가짐 -a,-m 옵션이 없음
  • 특정 커밋을 tag 하기 -> `$ git tag - a <tag명>
  • $git checkout <tag명> : 해당 tag로 체크아웃이 가능함
  • $git push origin master : push 명령어 사용 시에 tag 정보는 전송에서 제외됨
  • $git push origin <tag명> : 해당 tag를 원격 저장소에 push함 $ git push origin <원tag명>:<변경할tag명>
  • `$git push --tags origin master : --tags 옵션을 주어서 모든 tag를 원격 저장소에 push함

0개의 댓글