[Git] 개념 및 명령어 정리

Yoon Uk·2022년 8월 10일
0

Git

목록 보기
1/4
post-thumbnail

Notion에 정리해 놨던 Git 관련 내용을 더 편하게 보기 위해 블로그에 정리했다.
(오른쪽 제목 태그를 통해 더 쉽게 찾아볼 수 있다.)

간단한 Git 개념

  • HEAD: 현재 위치를 나타낸다.

1. Git으로 버전 관리

1) git init

git init
  • 버전을 관리하고 싶은 폴더에서 위의 명령어를 터미널에 입력한다.
  • 로컬 Repository를 생성한다.
  • Git 저장소를 만드는 것이다.

2) git add, commit

  • staging area : commit을 하기 전에 commit 할 파일들을 골라놓는 곳이다.
  • repository : commit 된 파일의 버전들을 모아놓는 곳이다.

git add

git add 파일명
  • 파일의 현재 상태를 기록해둔다.
  • stating area로 파일을 staging 한다.
git add 파일1 파일2
  • 파일이 여러 개 있을 때 동시에 staging을 할 수 있다.
git add .
  • 현재 작업 폴더에 있는 모든 파일들을 staging 한다.

git commit

git commit -m ‘메모’
  • 파일의 현재 상태를 간단한 메모와 함께 기록한다.
  • 버전을 생성하는 것이다.

git add + git commit

git commit -am '커밋 메시지'
  • stagingcommit 과정을 한 번에 처리한다.
  • 단, 이 방법은 한 번이라도 commit한 적이 있는 파일을 다시 commit 할 때만 사용 가능하다.

git add 를 사용하는 이유

  • 이미지와 같은 파일을 굳이 버전을 기록 할 필요가 없다.
    • 이 때 git add로 버전 관리가 필요한 파일만 staging 하여 추려내고
    • 추려낸 파일만 git commit을 하여 기록한다.

2) git status

git status
  • 현재 staging 해 놓은 파일들과 어떤 파일들이 수정이 돼 있는지 알 수 있다.
  • 깃의 상태를 확인하는 명령어이다.

3) git log

git log --all --oneline

git log --all --oneline
  • 내가 commit 한 내역을 보고 싶을 때 사용한다.
git log --all --oneline --graph
  • 내가 commit 한 내역을 그래프로 그려준다.
  • branch와 commit 내역을 한 눈에 그래프로 보고 싶을 때 사용한다.
  • HEAD : 내 현재 위치
  • 입력 후 q키로 종료할 수 있다.
git log --stat
  • commit에 관련된 파일을 확인할 수 있다.

4) git restore

git restore --staged 파일명

git restore --staged 파일명
  • staging 된 파일을 취소하고 싶을 때 사용한다.

5) git diff

git diff

git diff
  • commit 전에 파일의 차이점을 확인할 때 사용한다.
    • 현재 파일 vs 최근 파일 commit 차이점 확인
  • 줄 바꿈(엔터키)도 차이점으로 인식한다.
  • 터미널 특성 상 보는데 어려움이 있을 수 있다.
  • j / k 로 스크롤 바 조작을 할 수 있고 q 로 종료한다.

git difftool 커밋아이디

git difftool 커밋아이디
  • 현재 파일 vs 특정 commit 비교 할 수 있다.
    • 커밋아이디는 두 개 까지 입력 가능하다.
  • 위의 명령어를 입력하면 [ y / n ] 선택창이 뜨는데 여기서 y를 선택한다.
  • h / j / k / l 키로 방향을 조정할 수 있고 :q / :qa 로 종료할 수 있다.

6) 되돌아가는 기능

git restore 파일명

git restore 파일명
  • 파일 하나가 잘못되었을 경우 사용한다.
  • 최근 commit 된 상태로 현재 파일의 수정내역을 되돌릴 수 있다.
git restore --source 커밋아이디 파일명
  • 입력한 파일이 특정 커밋 아이디 시점으로 복구된다.
git restore --staged 파일명
  • 복구와는 상관 없지만 이러면 특정 파일을 staging 취소할 수 있다.

git revert 커밋아이디

git revert 커밋아이디
  • 해당 커밋아이디에서 일어난 일만 취소해준다.
  • revert 명령어를 쓰면 특정 커밋에서 있던 일을 지워버릴 수 있다.
  • 커밋메시지만 수정하고 닫으면 된다.
  • revert 할 때 동시에 여러개의 commit id를 입력할 수 있다.
  • 그냥 최근에 했던 commit 1개만 revert 하고 싶으면 git revert HEAD 하면 편리하다.
  • merge 명령으로 인해 새로 만들어진 commit도 revert 가능하다.
    • 그러면 merge가 취소된다.

git reset --hard 커밋아이디

  • 협업 할 때는 거의 사용하지 않는다.
git reset --hard 커밋아이디
  • 커밋이 생성되었던 때로 시간을 되돌려준다.
  • 작업 폴더 내의 파일도 그 때로 돌아간다.
  • 프로젝트가 망하거나 짧은 거리를 돌아갈 때 쓴다.
  • untracked 파일들(git add 해놓지 않은 파일들)은 사라지지 않고 유지된다.
  • git clean 명령어를 찾아서 쓰면 untracked 파일들도 다 지울 수 있다.
  • git reset --hard 커밋아이디
    • 커밋아이디 파일만 사라진다.
  • git reset --soft 커밋아이디
    • 커밋아이디 파일은 staging area에 남아있다.
    • 이제 commit 하거나 그럴 수 있다.
  • git reset --mixed 커밋아이디
    • 커밋아이디 파일이 staging 되지 않은 상태가 된다.
    • 이제 git add 하고 commit 하거나 그럴 수 있다.

7) branch

git branch 브랜치이름

git branch 브랜치이름
  • 프로젝트의 복사본을 만들어서 그 곳에 먼저 개발해 볼 때 사용한다.
  • branch : 프로젝트의 복사본

git switch 브랜치이름

git switch 브랜치이름
  • 브랜치이름 인 branch로 이동한다.
  • 다시 main branch로 되돌아가고 싶으면 git switch main 하면 된다.
  • 어떤 브랜치에 와 있는지 모르겠으면 git status를 입력하면 된다.

git branch -M 바꿀이름

git branch -M 바꿀이름
  • 현재 위치한 branch의 이름을 바꿀이름으로 바꾼다.

branch 삭제 방법

git branch -d 브랜치이름
  1. 병합이 완료된 브랜치를 삭제 시에는 이것만 해도 된다.
git branch -D 브랜치이름
  1. 병합하지 않은 브랜치를 삭제 시에는 이것을 해야 한다.
  • 브랜치를 merge 하고 나면 브랜치가 자동으로 삭제되지 않는다.
  • 둘 중 하나를 사용하면 필요없는 브랜치를 삭제할 수 있다.

git merge 브랜치명

git merge 브랜치명
  • branch를 합칠 때 사용한다.
    1. git switch main 입력하여 main 브랜치로 이동
    2. git merge 브랜치명 main branch브랜치명 branch를 합침

merge conflict

  • merge 할 때 두 브랜치에서 같은 파일, 같은 줄을 수정 했을 경우
    1. 위와 같은 merge conflict 가 발생한다.
    2. 이러한 경우 에디터로 해당 파일을 열어보면 충돌사항이 적혀있다.
    3. 위에서 둘 중 어떤 코드를 적용할 지 고르면 되는데 쓸데없는 코드는 다 지우고 원하는 코드만 남기면 된다.
    4. 어떤 코드를 남길 지 결정했으면
    5. git add 파일명 , git commit -m ‘메시지’ 를 입력하여 새로운 commit을 생성해주면 브랜치 합치기가 끝난다.

다양한 merge 방법

3-way merge

  • 브랜치에 각각 신규 commit이 1회 이상 있는 경우 merge 명령을 내리면 두 브랜치의 코드를 합쳐서 새로운 commit을 자동으로 생성해준다.

fast-forward merge

  • 가끔 새로운 브랜치에만 commit이 있고 기준이 되는 브랜치에는 신규 commit이 없는 경우가 있다.
  • 이 경우 merge 하게 되면 “fast-forward merge 되었습니다” 라고 알려준다.
  • 딱히 합칠 것이 없어서 그냥 신규브랜치보고 “너는 그냥 main 브랜치다” 라고 알려주는 것이다.
  • 따라서 ‘기준이 되는 브랜치에 신규 commit이 없으면’ 자동으로 fast-forward merge가 발동된다.
  • 이렇게 되는 것이 싫다면 git merge --no--ff 브랜치명 으로 해서 강제로 3-way merge 할 수도 있다.

rebase and merge

  • 브랜치의 시작점을 다른 commit으로 옮겨주는 행위이다.
    1. rebase를 이용해서 신규브랜치의 시작점을 main 브랜치 최근 commit으로 옮긴 다음
    2. fast-forward merge 하는 것이다.
  • 이런 식으로 브랜치를 합칠 수 있다.
    1. 새로운 브랜치로 먼저 이동해서
      → 그냥 합칠 때(git merge 브랜치명) 랑 반대(이 땐 main 브랜치로 먼저 가서 함)
    2. git rebase main 하면 된다.
    3. 그럼 브랜치가 main 브랜치 끝으로 이동하는데 그걸 fast-forward merge 하면 된다.
  • 아래의 둘 중 하나를 차례로 입력하면 rebase가 끝난다.
    • git switch 새로운 브랜치, git rebase main
    • git switch main, git merge 새로운브랜치
  • rebase & merge를 쉽게 비유하자면 강제 fast-forward merge이다.
  • 브랜치끼리 차이가 너무 많다면 rebase 하면 충돌이 많이 발생할 수 있는데 해결하기 힘들다.

squash and merge

  • 사용하는 이유
    • 3-way merge만 하게 되면 git log 출력 시 보기에 힘들다.
  • squash and merge 를 사용하면
    • 새 브랜치에 있던 코드 변경 사항들이 main 브랜치로 텔레포트한다.
    • → 브랜치에 있던 자잘한 commit 들이 보이지 않게 된다.
  • 사용 방법
    • git switch main
    • git merge --squash 브랜치명
      • --squash 옵션을 추가한다.
    • git commit -m '메세지'
    • 위의 명령어를 순서대로 입력하면 브랜치에서 만들어 놓은 많은 commit을 다 합쳐서 하나의 commit으로 main 브랜치에 생성해준다.

2. Github 사용하기

  • Repository
    • Git이 파일 버전을 저장해두는 장소를 repository라고 한다.
    • 내 컴퓨터(로컬)에서 만들어 둔 저장소를 백업해둘 수 있다.

1) 로컬 branch 이름을 원격 branch 이름과 맞추기

git branch -M main
  • github.com 에서 기본 브랜치 이름을 master가 아니라 main으로 사용하라고 강요한다.
  • 그래서 로컬 작업폴더에 있는 기본 브랜치 이름도 main으로 변경해준다.

2) git push

git push -u 원격저장소주소 올릴로컬브랜치명

git push -u 원격저장소주소 main 
  • 로컬저장소의 main 브랜치를 원격저장소에 올리라는 뜻이다.(다른 브랜치로 올릴 수 도 있다)
  • -u : 방금 입력한 주소를 기억해두라는 뜻 이다.
    • 다음부터는 주소를 길게 입력 하지 않고 git push만 입력해도 된다.
  • 원격 repository 주소 : https:// ~ .git
    • 위의 형식으로된 주소를 못 찾겠으면 주소창에 있는 주소를 그대로 복사해와서 .git만 뒤에 붙이면 된다.

git remote add 변수명 https:~.git

git remote add origin https:~.git
  • origin 이라는 변수에 원격저장소주소를 저장해서 쓸 수 있다.
  • git push -u origin main 이렇게 푸쉬할 수 있다.
  • -u 를 붙여서 push를 1 번 했으면 git push 만 입력해도 알아서 잘 된다.

git remote -v

git remote -v
  • 설정한 변수 목록을 살펴보고 싶을 때 사용한다.

3) git push

git push 원격저장소주소

  • 모든 로컬 저장소 브랜치를 원격 저장소로 백업하는 명령어이다.

git push 가 되지 않는 경우

  • 원격 저장소와 로컬 저장소에 있는 내용이 다르다면 로컬저장소에서 git push가 안된다.
  • 코드가 꼬이기 때문에 미리 예방해주는 것이다.
  • 이 때 git pull 하여 원격 저장소 내용을 가져온 뒤 한다.

4) git clone

git clone (https://)원격저장소주소
  • 원격저장소에 있던 내용을 그대로 내려받아서 시작한다.
  • 참고로 필요할 땐 특정 브랜치 1개만 clone 해 올 수 있다.

5) .gitignore

  • .gitignore 파일을 하나 만들면 저장소에 올리지 않을 파일들을 쉽게 명시가능하다.
  • 여기 명시한 파일들은 git add . 해도 스테이징이 되지 않는다.

6) git pull

git pull 원격저장소주소
  • 원격저장소에 있던 모든 브랜치 내용을 가져와서 로컬저장소에 합치라는 뜻이다.
  • 이렇게 해주면 로컬이 최신상태가 되기 때문에 이제 git push 가 가능하다.
    • 변동사항이 생겼다면 git pull 하고 나서 git push 하면 된다.
  • git pull 원격저장소주소 브랜치명 입력하면 특정 브랜치만 가져올 수 있다.
  • origin 이라는 변수명을 등록해 놨으면 당연히 사용 가능하다.
  • 예전에 -u 했었으면 git pull , git push 까지만 입력해도 잘 된다.
  • 참고로 git pull 명령어는 git fetch + git merge 축약어이다.
    • git fetch : 원격저장소에 있는 commit 중에 로컬에 없는 신규 commit 을 가져오라는 뜻
    • git merge : 그걸 merge 하라는 뜻

7) Pull request

  • 팀으로 개발을 하는 경우 merge 하기 전에 토론하거나 검토하거나 하는 경우가 많다.
  • 쉬운 말로 merge request 이다.

create a merge commit

  • 새로운 merge commit을 하나 생성해주는 3-way merge를 실행
    • main 브랜치 조회 시 합쳐진 브랜치의 commit 내역도 전부 나온다.
    • 터미널에 git log --oneline --graph를 해보면 합쳐진 브랜치도 그림으로 나온다.
    • 그래서 commit 내역이 많으면 복잡하고 더러워보일 수 있다.

squash and merge

  • 합쳐질 브랜치의 commit 내역을 하나로 합쳐서 main 브랜치에 신규 commit을 생성해준다.
  • git log --oneline --graph를 해보면 합쳐진 브랜치는 안 나온다.
  • commit 을 하나로 합쳐서 main 브랜치로 순간이동 시켜주는 행위라 깔끔해 보인다.

rebase and merge

  • 합쳐질 브랜치를 main 브랜치 최신 commit으로 rebase 하고나서 fast-forward merge와 비슷한 것을 해준다.
  • 결과는 squash and merge와 비슷한데 합쳐질 브랜치의 commit 내역이 전부 보존된다.
  • git log --oneline --graph를 해보면 합쳐진 브랜치는 나오지 않는다

3. 참고 유튜브 및 블로그

참고 유튜브 및 블로그

0개의 댓글