Git

Judy·2022년 4월 7일
0

iOS

목록 보기
1/28

야곰 커리어 스타터를 시작하기 전 사전 학습할 내용 중 <Git 사용법>이 있어 미리 정리해두기로 했다.

GitHub를 사용해오긴 했지만 그저 백업용 서버 저장소 정도로만 사용했다.

물론 최근에는 개인 프로젝트만 했어서 협업의 이점을 느낄 수 없긴 했지만 단순히 commit, push만 하며 git이 주는 유연함을 경험해보지 못했다.

정확히는 몰라서 못썼다...😂

혹시나 코드가 날라갈까봐 이것 저것 시도해보지 못하고 정직하게만 사용했다.

게다가 터미널이 아닌 xcode에서 지원하는 방식으로만 사용해서 익숙해지기 위해 미리 공부한 내용을 정리해둔다!





VCS

버전 관리 시스템(Version Control System)으로 파일의 변화를 기록해두었다가 특정 시점의 버전을 다시 꺼내쓸 수 있도록 하는 서비스다.

장점

  • 변경 이력을 공유 가능
  • 타인이 작업한 내용을 쉽게 병합
  • 과거 상태로 쉽게 되돌릴 수 있음
  • 여러 분기(Branch)로 병렬 관리 가능

터미널 명령어

  • pwd
    print working directory - 현재 작업중인 디렉터리의 경로를 보여줌

  • ls
    list - 현재 위치에 있는 파일과 폴더 목록을 보여줌
    ex) ls -a : 여기 있는거 숨김파일까지 모두 보여줘

  • cd 디렉터리_이름/
    change directory - 입력한 디렉터리로 이동함
    cd . : 현재 폴더
    cd .. : 현재 폴더의 상위 폴더
    cd ~ : 사용자의 홈으로 이동
    ex) cd ~/Desktop/ : 바탕화면으로 이동

  • mkdir
    새로운 디렉터리(폴더) 생성

  • touch
    새로운 파일 생성
    ex) touch a.txt

  • rm
    파일 삭제하기
    rm -f : 확인 여부를 묻지 말고 삭제
    rm -r : 폴더 안에 있는 파일도 모두 삭제
    rm -rf : 묻지말고 모두 지워라

  • rmdir
    폴더 삭제하기(내부에 파일이 없을 때만 가능)

  • mv
    mv [이동할 파일] [이동할 폴더] : 파일의 위치를 이동시킴
    mv [변경할 파일 이름] [변경할 이름] : 파일의 이름 변경

  • clear
    터미널에 있는 모든 명령을 지움


Git

git은 버전 관리 시스템 중 하나로 심플하지만 강력한 기능을 갖고 있어 광범위하게 쓰이고 있다.


git 초기화 및 설정

1. git으로 관리할 폴더를 만들어 줌

mkdir {폴더이름}

2. git 초기화 하기

git init
이 디렉터리를 git으로 추적할거라는 의미로 git이라는 디렉터리가 생김

3. git 환경설정

git config —global user.name {이름} - 사용자 이름 설정
git config —global user.email {깃허브메일} - 사용자 메일 설정
초기에 한 번만 해줘면 다시 설정할 필요 없음

4. 파일 추적 준비

git add {파일 이름}

5. 변경 이력 남기기

git commit -m "커밋 메시지"


원격 저장소와 연결

1. GitHub에 Repository(원격 저장소)를 생성함

2. main 브랜치를 만들고 Repository와 연결

git branch -M main
git remote add origin {깃허브 Repository 주소}

3. Repository에 변경 이력 올리기

git push -u origin main
+ (비밀번호 입력)

저장소에 있는 파일 받아오기

git clone {저장소주소} - 이후에는 pull로 받아오면 됨

git의 명령어와 기능

  • git status - 현재 변경사항들 보기
  • git log - 커밋 정보 보기(누가, 몇시에, 커밋번호,,)
  • touch .gitignore
    IDE 파일과 같이 저장소에 변경이력을 남길 필요가 없는 파일은 gitignore 파일로 관리 가능
    gitignore에 파일을 기록하면 헤당 파일들은 stage에 올라가지 않음
  • git diff {커밋번호} - 해당 커밋에 어떤 변화가 있었는지 보여줌

branch

  • git branch : branch 목록을 보여줌
  • git branch {브랜치이름} : branch를 생성
  • git branch -d {브랜치이름} : branch 삭제
    (merge하지 않은 commit이 있는 경우 -D로 강제 삭제)
  • git branch -f {이동할 브랜치} {이동할 위치} : branch 위치를 강제로 이동시킴
  • git branch -m {변경할 브랜치이름} {변경할 이름} : branch의 이름 변경
    (-M은 동일한 이름의 branch가 있어도 덮어씀)

checkout

  • git checkout {전환할 브랜치이름} : branch 전환
  • git checkout -b {브랜치이름} : branch를 생성하면서 전환
  • git checkout {기준 커밋(브랜치)}~숫자 : 현재 HEAD를 기준으로부터 숫자만큼 위로 이동 (^는 한커밋 위)

tag

  • git tag {태그내용} {커밋} : 특정 커밋에 태그를 달아줌 (이정표)
    커밋을 지정해주지 않으면 HEAD에 붙음
    태그를 이용해 checkout 가능
  • git describe {커밋이나 브랜치} : 가장 가까운 태그와의 거리를 알려줌
    커밋을 쓰지 않으면 현재 체크아웃된 곳을 기준으로 함(HEAD)
    <가까운 부모 태크>_<부모와 몇 커밋 멀리있는지>_g<커밋의 해시>

commit 복사

  • git cherry-pick {C1 C2... 복사할 commit들} : 현재 위치에 커밋들을 복사해서 이어줌
  • git rebase -i {이어붙일 위치의 commit} : 편집기를 통해 커밋들을 복사하고, 순서를 바꿀 수 있음

reset vs revert

git reset {되돌릴커밋위치}

  • 해당 커밋이 아예 없던 것처럼 상태를 되돌림
  • 히스토리를 바꾸기 때문에 다른 사람이 쓰는 리모트 브랜치에는 불가능(로컬 브랜치에서만 가능)
  • git reset HEAD^

git revert {되돌릴커밋}

  • 이전의 내용으로 새로 커밋하는 효과
  • push 가능
  • git revert HEAD

rebase vs merge

git merge {브랜치이름}

  • 현재 작업중인 브랜치에 '브랜치이름'의 브랜치를 가져와 병합
  • 커밋을 합쳐서 새로운 커밋을 만들어 한 브랜치로 만들어 줌 = 합치기
  • 장점 : 모든 커밋 이력을 보존함
  • 단점 : 불필요한 새로운 커밋이 생김
  • git checkout feature git merge main
  • git checkout main git merge feature
    같은 커밋라인이면 브랜치 포인터만 이동

git rebase 합칠브랜치

  • 커밋을 복사해서 붙여 브랜치를 한줄로 이어줌 = 복사 붙여 잇기
  • 장점 : 커밋트리가 한 줄로 되기 때문에 보기 깔끔함
  • 단점 : 커밋트리의 히스토리가 수정됨(실제 커밋 순서와 다르게 될 수도 있음)
  • git reabse {브랜치1} {브랜치2} : 브랜치1에 브랜치2를 복사해서 이어붙임
  • git checkout feature git rebase main
  • git rebase feature

원격

  • git clone : 원격 저장소를 만들어 줌
  • git fetch : 다운로드 단계
    = 로컬에 반영되지 않는 커밋들을 다운로드 하고 원격 브랜치가 가르키는 곳을 변경(실제 로컬에 반영되지는 않으므로 로컬은 변화없음)
  • git fetch + git merge = git pull : git fetch로 내려받은 커밋들을 main 브랜치와 병합
  • git push : 변경이력들(커밋)을 원격저장소에 업로드
    내 작업을 원격 브랜치의 최신 상태를 기반으로 해야 push 가능
    (내 작업이 뒤처져있으면 push 안 됨)
    -> fetch + rebase(merge) + push 해야 함
    = git pull (—rebase) + git push
  • git branch -b {브랜치이름} origin/main -> main이 아닌 원격 저장소를 추적하는 브랜치를 만들어 줌
    이미 만들어진 브랜치면 git branch -u origin/main {브랜치이름}
  • git push {origin=저장소} {main=브랜치이름} : 푸쉬해야할 브랜치와 저장소를 명시해줄 수 있음
  • git push {origin=저장소} {올릴 브랜치}:{붙일 목적지 브랜치}
    목적지 브랜치가 없는 이름이면 새로 만들어 줌
    fetch 역시 push와 같은 인자를 둘 수 있음
  • git push origin :{브랜치} : 해당 브랜치를 없애버림(로컬, 원격 모두)
  • git fetch origin :{브랜치} : 로컬에 새 브랜치를 만들어 줌





[ 참고자료 ]

Learn Git Branching
Git Recipe

profile
iOS Developer

0개의 댓글