Git&Github

철웅·2023년 3월 8일
0

git init : 해당 시점부터 git이 파일 생성, 코드 작성하는 등 변동사항을 추적

git add 파일명 : 해당 파일을 staging

  • git add . : 모든 파일을 staging
  • git add 파일명1 파일명2

git status : 지금 변경된 파일, 스테이징된 파일 등을 알려줌

git restore --staged : 스테이징된 파일을 취소

git commit -m '메세지' : 커밋, 변동사항 기록

git log : commit 기록을 한 눈에 확인

  • 여기서 나오는 HEAD는 현재 브랜치이다.
  • --all : 현재 브랜치뿐만 아니라 모든 브랜치의 커밋기록을 보여줌
  • --oneline : 한 줄에 간략하게 출력 (많이 쓴다)
  • --graph : 그래프로 그려준다 (브랜치 여러개 있을 때 가독성 ⬆️)

git diff : commit 하기 이전과 현재 코드가 어떤 차이가 있는지 알려준다.

  • git diff 커밋id : 특정 커밋과 현재 파일을 비교
  • git diff 커밋id1 커밋id2

git difftool : diff와 동일, diff보다 훨씬 보기 편함

  • 커밋id1,2 이런거 당연히 가능

  • 사실 diff, difftool 보다는 VSCode의 Extension을 씁니다.


📌 Branch

git branch 브랜치명 : 프로젝트 사본이 하나 생성 (브랜치 생성)

  • git branch -M main : 기본 브랜치 이름이 main으로 변경

    git switch 브랜치명 : 해당 브랜치로 이동

merge

git merge 브랜치명 : 두개의 branch를 합친다. main에다 합치고 싶으면 main 브랜치로 이동한 상태에서 브랜치명에 합칠 브랜치 입력

  • 만약 conflict가 발생한다면? : 파일 열어서 수정(선택)하고 add, commit 하기

1. 3-way merge

일반적인 merge, merge의 기본 동작 방식이다.

2. fast-forward merge

기준이 되는 브랜치(main/master)에는 신규 커밋이 없는 경우
합칠게 없어서 신규 브랜치에게 main이라고 하는 것

강제로 3-way merge를 하고 싶을 경우 git merge --no-ff 브랜치명 명령어를 사용한다.

3. rebase and merge

rebase는 브랜치의 시작점을 다른 commit으로 옮겨주는 행위!
rebase를 사용해 신규 브랜치의 시작점을 main브랜치 최근 commit으로 옮긴 후 fast-forward-merge하는 방식 (강제 fast-forward)

git switch 새로운브랜치
git rebase main

git switch main
git merge 새로운브랜치

4.squash and merge

모든 브랜치를 3-way merge 할 경우 그래프가 매우 복잡해 보일 수 있음
그럴 때 rebase and merge를 하거나 squash and merge를 하자!

새 브랜치에 있던 코드 변경사항들이 main 브랜치로 이동한다.

git switch main
git merge --squash 브랜치명
git commit -m '메시지'

🤔 어떤 상황에 어떤 merge를 써야 할까?

기록을 남겨야하는 중요한 브랜치를 merge할 땐 3-way merge
기록을 남길 필요없는 쓸데없는 브랜치를 merge할 땐 squash, rebase 쓰는걸 권장한다.


git branch -d 브랜치명 : 병합이 완료된 브랜치삭제
git branch -D 브랜치명 : 병합하지 않은 브랜치삭제


git restore 파일명 : 최근 commit된 상태로 현재 파일의 수정내역을 되돌리기

  • git restore --source 커밋아이디 파일명 : 입력한 파일이 특정 커밋아이디 시점으로 복구

git revert 커밋아이디 : 그 커밋아이디에서 일어난 일만 취소 (그 이후에 했던 파일이나 커밋들은 영향없이 유지된다.)

  • git revert HEAD : 최근 했던 commit 1개만 revert

git reset --hard 커밋아이디 : 그 커밋이 생성될 때로 시간을 되돌려줌

  • --soft : staging area에 남기기
  • 여러명이 협업하는 repository에서는 보통 reset을 쓰면 안된다.
  • untracked(git add 안해놓은)파일들은 사라지지 않고 유지
  • 이거까지 지우려면 git clean 사용


📌 원격저장소 활용 (Git Hub)

로컬저장소에 있는걸 원격저장소에 넣기

git init
git branch -M main
git add .
git commit -m '메시지'
git push -u 원격저장소주소 main

원격저장소 주소가 너무길어서 불편하니까
git remote add origin 원격저장소주소
명령을 사용해서 origin이라는 변수(관습, 다른거 써도됨)에 원격저장소 주소를 할당
후에는
git push -u origin main 으로 사용한다.

사실 -u 옵션이 뒤에 입력한 주소를 기억하는 옵션인데 한번 해놓으면 다음부터는
git push만 입력해도됨 -> 앞으로의 모든 명령어도 동일하다(pull등등..)

git clone

협업을 하기로 했는데 팀원1은 코드가 없는 상태이다.
그렇다면 원격저장소에 들어가서 코드를 clone 해오면 된다.

git clone 원격저장소주소 이렇게 사용한다.

git pull

git clone를 하고 git push 를 하려는데 에러가 뜬다.
그 이유는 clone하고 push하기 전에 다른 사람이 원격저장소에 있는 코드를 수정하거나 파일을 추가한것!
그럴 때는 git pull을 하고 그 다음에 git push를 해주면 된다.
git pull은 원격저장소에 있던 모든 브랜치 내용을 가져와서 로컬저장소에 합치라는 뜻이다. (fetch+merge)

git pull 원격저장소주소 이렇게 사용, 기존에 -u를 사용했었다면 git pull만 써도 됨

원격저장소에 브랜치 만들기

  1. 깃허브에서 main을 클릭해서 새로운 브랜치를 생성한다.
  2. 로컬저장소에서 생성 후 push 한다.
git branch 브랜치명
git switch 브랜치명
git add .
git commit -m '커밋 메시지'
git push 원격저장소주소 로컬브랜치명

pull request

원격저장소에 브랜치를 만들어서 코드를 수정한 후 merge를 하고 싶을 때는 그냥 하는게 아니라 검증과정을 거쳐야한다. 이를 pull request라고 하는데 팀원끼리 merge전에 코드를 검토하는 행위이다.


어떤 브랜치를 어디에 합칠 것인지 선택 후 create pull request 클릭
확인 후 conflict같은거 있으면 수정하고 merge 해주면 끝!
(merge는 3-way merge, rebase and merge, squash and merge 이렇게 세 종류중 선택한다.)


📌 git stash

코드를 수정하다가 맘에 안드는 '부분'이 있어서 그 부분만 잠깐 삭제하고 싶다면 git stash를 사용하면 된다.

git stash : 코드 수정한 부분은 숨겨지고(다른 공간에 보관) 파일들이 최근 commit상태로 돌아간다.

git stash save "aaa 코드 짰는데 망함" : 이렇게 메모도 함께 입력 가능
git stash list : git stash 는 여러번 할 수 있는데, 현재 stash되어 있는 코드 목록을 전부 출력해준다.
git stash pop : 보관했던 코드를 다시 불러온다. 코드가 여러개 있다면 가장 최근에 보관했던 코드부터 먼저 불러온다.
git stash drop 삭제할id : 특정 stash 삭제
git stash clear : 모든 stash 삭제
git stash -p : 전체 말고 일부 코드만 stash 하고 싶을 때 사용 -> 그럼 파일을 훑어주면서 stash 할지 의견을 물어본다.



출처 : https://codingapple.com/course/git-and-github/

0개의 댓글