<깃허브 시작하기>
깃허브 다운로드 후 작업용 폴더 만들기
작업폴더에서 터미널 열기 (폴더에 shifr+우클릭 또는 우클릭 후 터미널 열기)
git —version
→ 버전이 아무거나 뜨면 깃 설치 성공
<깃 유저 이름세팅>
git config —global [user.email](<http://user.email>) “홍길동@naver.com”
git config —global [user.name](<http://user.name>) “홍길동”
→ 누가 지금 git을 쓰는지 구분하기 위한 아이디 등록
<깃 이용시>
git init
→ 깃 기록 추적
<기본적인 add, commit,staging,graph,diff>
터미널의 경우 (아무튼 난 안씀)
git add 파일명
git commit -m '아무메세지'
→ 파일 현재상태 기록
작업폴더 —git add(뭘 저장할거야)→ staging area(기둘 장소) —git commit(깃 저장하기)—>repository(내 작업폴더)
<그 외에 명령어>
git add 파일명1 파일명2
→ 여러 파일 스테이징 ㄱㄴ
git add .
→ 작업폴더의 파일 싹다 스테이징
git status
→ 상태 확인 (변경 파일, 스테이징 파일 알려줌, 까먹을때 자주입력)
git restore --staged 파일명
→ 스테이징 파일 취소, 파일명 대신 점찍기 가능
git commit -m ‘메세지’
→ 커밋 -m 뒤에 메세지 입력 가능 , 코드에 무슨 기능 추가했는지 적으면
git log --all --oneline
git log --all --oneline --graph
→ 커밋 기록 전체 파악, graph는 그래프로 그려줌
*입력후에 Vim에디터가 켜짐, j,k로 위아래 스크롤, q로 종료
Q. git log 하면 나오는 HEAD는 뭔가요
A. 님 현재위치
- Q. 커밋 빈도수?ex) 웹개발시 회원가입 기능 만들기-입력한 메일이 맞는지 검증하는 기능 만들면 커밋3개 다 만들고 커밋해도 됨 맘대루
- -서버에 전공하는 기능 만들면 커밋
- -회원가입 폼 레이아웃 만들면 커밋
- A. 간단한 기능 하나 추가할 때마다 커밋하면 됨
VSCode 에디터의 경우
+누르면 git add 한거랑 똑같고
체크마크 누르면 git commit한거랑 똑같음
<git diff>
터미널의 경우
VSCode의 경우
git difftool 대신
VSCode 에디터 확장 설치에서 git graph 설치하면 됨 easy
<나뭇가지 branch, merge>
<git branch>
터미널의 경우
git branch 브랜치 이름
→ 프로젝트 사본 생성
git switch 브랜치이름
→ 브랜치로 이동
어떤 브랜치인지 까먹었으면 git status
git log --graph --oneline --all
→브랜치와 커밋 한눈에 그래프로 보기
<git merge>
git switch main
git merge 브랜치명
merge 하고 싶으면
- 메인 브랜치 이동 후
- merge하면 됨
합칠 시 주의사항
메인과 브랜치에서 같은 파일 같은 줄을 수정했을 경우 merge conflict 발생
둘 중 어느 코드 적용할지 고르면 됨
<<<<,>>>>,==== 이런거 지우고 원하는 코드만 남기기
어떤 코드를 남길지 정했으면
git add 파일명
git commit -m ‘메세지’
입력하면 문제해결 및 합치기 완
<협업시 branch>
기능을 하나 추가하고 싶으면
- 브랜치로 사본을 만들어서 개발 조지기
- 테스트 하고 잘 되면 메인 브랜치에 합치기
<별거없음 원리임 3-way merge>
→ 메인과 브랜치를 합쳐서 하나로 만들음
<브랜치 해놓고 의미없는 경우 fast-forward merge>
→ 브랜치를 만들었지만 딱히 메인을 수정하지 않음 그래서 합침, 보통 자동으로 발동됨 싫으면 강제로 git merge —no-off 브랜치명 해서 강제로 3-way merge 할 수 있음
브랜치 삭제
merge해도 브랜치 자동으로 삭제되지 않음
git branch -d 브랜치이름
git branch -D 브랜치이름
→ 둘 중 하나 사용하면 필요없는 브랜치 삭제가능
병합 완료된 브랜치 삭제 -d
병합하지 않은 브랜치 삭제 -D
<강제로 fast-forward하는 rebase>
브랜치의 시작점을 다른 커밋으로 옮기는 행위
- 리베이스를 이용해서 신규브랜치의 시작점을 메인 브랜치 최근 커밋으로 옮긴 다음
- fast-forward merge하는 것
이런 식의 브랜치 합치기도 가능
하는 이유
- 3way 말고 강제로 fast forward 하고 싶을 때
- 나는 코드 고수
- 커밋 내역을 한줄로 계속 이어서 남기고 싶을 때
실제로 하는법
- 새로운 브랜치로 이동
- git rebase main
- 그럼 브랜치가 메인 브랜치 끝으로 이동하는데 fast-forword하면 됨
한줄요약 : 강제 fast-forward
단점 : 브랜치 차이가 너무 많이 나는 경우에 충돌이 많이 발생할 수 있는데 해결하기 귀찮음
<코드 변경사항 텔포(옵션같은거임) squash and merge>
3way처럼 선으로 이어주지 않고 새 브랜치에 있던 코드 변경사항들이 메인 브랜치로 텔포함
이때 로그 출력하면 merge완료된 브랜치의 커밋같은 건 출력되지 않음
git switch main
git merge --squash 브랜치명
git commit -m '메세지'
브랜치에서 만들어놨던 많은 커밋을 다 합쳐서 하나의 커밋으로 메인 브랜치에 생성해줌
결론: 브랜치 100개 만들었는데 일반 merge를 하면 나중에 로그가 매우 복잡해짐 그게 싫으면 스쿼시 하시오 리베이스로 해도 마찬가지 해결
초보때는 스쿼시 할지 말지 고민하지 말고 대충 하시오 나중에 코딩 노예로 취직하면 중요한 브랜치마다 merge마다 방법 가이드라인 있음 없으면 퇴사 ㄱ 아니면 기준 하나 만들어놓으면 좋음
<되돌리기 restore(파일 ctrl+z), revert(커밋 빠꾸), reset(시간)>
<파일 하나 되돌리기 git restore>
파일 하나가 잘못되었을 경우 ctrl + z 여러번 눌러도 되겠지만 수정사항이 너무 많다면 명령어 하나로 처리할 수 있다
git restore 파일명
→ 최근 커밋된 상태로 현재 파일의 수정내역 되돌릴 수 있다.
git restore --source 커밋아이디 파일명
→ 입력한 파일이 특정 커밋아이디 시점으로 복구됨
git restore --stagde 파일명
→ 복구랑 상관없지만,,, 특정 파일을 스테이징 취소
<커밋을 되돌리려면 git revert>
코드를 열심히 짜다가 과거 커밋 하나가 문제를 일으키는 경우
예시로 커밋이 3개 있는데 b파일이 문제가 많아서 b파일을 만든 커밋을 취소하고 싶어짐. 이때 사용하기
실은 없애버리는건 아니고 커밋하나를 취소한 커밋을 생성하는 것
git revert 커밋아이디
→ 커밋아이디에서 일어난 일만 취소해줌 실행하면 에디터가 뜰텐데 맘대로 커밋메세지 수정하고 닫으면 끝
*리버트 명령시 가끔 빔에디터가 뜨는 사람이 있음 커밋 메세지 수정하라는 건데 i 눌러서 글자 수정하고 싶으면 하고 esc 눌러서 나올 수 있음 그리고 :wq 누르면 커밋 메세지가 저장됨 에디터 닫고 나면 b파일만 뿅 삭제
*참고 리버트할때 동시 여러개 커밋아이디 입력 가능 최근에 했던 커밋 한개만 리버트 하고 싶으면 git revert HEAD하면 편리함 *HEAD : 현재위치 마지 명령으로 인해 새로 만들어진 커밋도 리버트 가능 그럼 마지가 취소됨
<그냥 전부 시간을 되돌리고 싶으면 git reset>
리셋 명령어를 사용하면 특정 커밋 시절로 아예 모든걸 되돌릴 수 있다.
git reset --hard 커밋아이디
→ 그 커밋이 생성될때로 시간을 되돌려줌 작업폴더 내 파일도 그 시절로 돌아감
미래의 기억을 모두 잃음
프로젝트 망하거나 짧은 거리를 돌아갈 때 쓰도록함
*참고 여러명이서 협업하는 리포지토리에는 보통 리셋 쓰면 안됨. 갑자기 소스코드 사라지는거니까 untracked 파일들은 (깃 add 안한거) 사라지지 않고 유지됨 git clean 명령어 찾아서 쓰면 untracked 파일도 다 지울 수 있음
<리셋의 옵션>
a,b,c 파일을 만들면서 커밋을 했다고 침
깃 리셋 뒤에 hard,soft,mixed 설정을 넣을 수 있는데
git reset --hard b아이디
→ a, b 남고 c 삭제 (아마 b로 돌아간다는 뜻인듯)
git resset --soft b아이디
→ a,c 파일 남고 b는 스테징 area에 남음. 이제 커밋할 수 있음
git reset --mixed b아이디
→ a,c남고 b 스테징되지 않은 상태, 이제 깃 에드하고 커밋하거나 그럴 수 있음 (소프트의 스테징 전단계인듯)
결론: 리셋하면서 파일을 아예 지워버리는 게 아니라 검토하고 다시 커밋하고 싶으면 소프트나 믹스드 사용해보기 실은 깃 리셋 어쩌구만 하면 믹스드 옵션이 자동으로 발동됨
<저장소 repository>
저장소라는 뜻
<일단 작업폴더에서 깃으로 커밋 몇번 하기>
- 작업폴더를 하나 만든 다음 git init함 (= 로컬 리포지토리 생성법)
- 기본 브랜치 이름 main 설정 (안해도됨) 터미널 열고
git branch -M main
→ 기본 브랜치 이름 변경
- 파일 만들어서 커밋 몇번 하기
<깃허브에서 만든 원격 저장소에 올리기>
로컬저장소 → 원격저장소
작업폴더에서 터미널 켜서
git push -u 원격저장소주소 main
→ 로컬저장소의 메인 브랜치를 원격저장소에 올리라는 뜻. 다른 브랜치도 올릴 수 있음 깃허브 로그인하라고 뜨면 로그인 하면 됨 -u는 방금 입력한 주소 기억해두라는 뜻, 다음부터는 깃푸쉬만 입력해도 잘됨
*참고 깃허브 사이트에서도 파일수정삭제커밋 자유롭게 가능 비공개 돌리기 가능
<원격저장주소 길게 입력하는게 귀찮은경우>
주소를 변수에 저장해서 사용가능
git remote add 변수명 저장소주소
→ 주소를 변수에 저장 이렇게 입력하면 주소가 필요할때마다 오리진이라는 변수명을 쓸 수 있음
*참고 -u는 주소를 기억하라는 뜻이라 이거 붙여서 한번했으면 나중엔 깃푸쉬까지만 해도 알아서 잘됨
*참고 변수목록 살펴보고 싶으면
git remote -v
<원격 저장소에 있던거 그대로 내려받기>
git clone 주소
<저장소에 올리지 않는 파일은 .gitignore>
원격저장소를 효율적으로 쓰고 싶으면 쓸데없는 파일은 커밋해서 올리지 않는게 좋음
깃이그노어 파일을 하나 만들면 저장소에 올리지 않을 파일들 명시 가능
거기에 명시한 파일들을 깃 에드 해도 스테이징이 되지 않아 편리
웹개발을 예로 들면 개인정보들이 들어있는 파일같은 경우
방법은 걍 구글 ㄱ
<협업하기 clone, pull,pull request, 브랜치전략>
<협업하기 clone, pull>
git clone 원격저장소주소
→ 소스코드 다운받기 특정 브랜치 1개만 클론 해올 수 있음
팀원 깃허브 아이디가 있어야하고 아이디를 Collaborators 메뉴에 등록해놔야 협업가능
<팀원이 커밋하려는데 문제가 생김>
다른놈이 만든 파일이 원격저장소에 생기면 깃푸쉬 못함
git pull 원격저장소주소
→ 현재 원격저장소 내용 가져올 수 있음 원격저장소에 있던 모든 브랜치 내용을 가져와서 로컬저장소에 합치라는 뜻 이렇게 해면 최신상태가 되기 때문에 깃 푸쉬 가능함
결론: 변동사항이 생겼다면 git pull 하고 나서 git push 하기
*참고
git pull 원격저장소주소 브랜치명
→ 특정브랜치만 가져오기 가능
origin 이라는 변수명을 등록해놨으면 당연히 사용가능
예전에 -u했었으면 git pull, git push까지만 입력해도 잘 됨
*참고사항 git pull 명령어는 git fetch + git merge 축약어임
git fetch ? → 원격저장소에 있는 커밋중에 로컬에 없는 신규 커밋 가져오라는 뜻
그걸 merge해라라른 뜻
그래서 깃 풀 할때 팀원 2명이서 같은 파일을 건드리고 있을 경우 마지 충돌날 수 있음
충돌은 브랜치 다룰때 처럼 하면 됨 (걍 마음에드는 코드만 남기기)
<협업하기 pull request>
-신기능 만들때 메인 브랜치에 코드 짜다 망치지 말고 다른 브랜치 만들어서 개발하는 것이 안전하고 좋음 -깃허브 원격 저장소에도 브랜치 만들 수 있음 OR 로컬에서 만든 브랜치를 올려도 생성가능
로컬에서 만든 브랜치 원격에 올리기
git push 원격저장소주소 로컬브랜치명
→ 특정 로컬저장소 브랜치를 원격저장소에 올리기
git push 원격저장소주소
→ 모든 로컬저장소 브랜치를 원격저장소에 올리기
보통 특정 브랜치 올리는 일이 잦다.
<pull requst>
브랜치 만들고 메인 브랜치와 합쳐야함 팀끼리 일하는 경우 마지 하기 전에 토론하거나 검토하는 경우가 많음
이거 누르면 누가 내 브랜치 마지해달라는 요청을 할 수 있고 팀원끼리 마지 전에 코드검토 가능
깃허브 웹사이트에서 풀 리퀘스트 열고 싶으면 메뉴에서 pull requset 초록버튼 누르면 됨 그리고 어떤 브랜치를 어디에 합칠것인지 선택하고 하단에서 커밋내역 변경내역 잘 보고 초록 버튼 누르면 풀 리퀘스트가 열림
그럼 메뉴에서 확인 가능한데 토론할 수도 있음 적당히 댓글남기기 가능
잘 된거 같아서 마지 하기로 했다면 여러옵션있는데 택1하기
새로운 마지커밋을 하나 생성해주는 3way마지 실행해줌 -메인 브랜치 조회시 합쳐진 브랜치의 커밋 내역도 전부 나옴 -터미널에서 git log —oneline —graph 해보면 합쳐진 브랜치도 그림으로 나옴 -그래서 커밋내역이 많으면 복잡하고 더러워보일 수 있다.
-합쳐질 브랜치의 커밋 내역을 하나로 합쳐서 메인 브랜치에 신규 커밋을 생성해줌 -git log —oneoline —graph 해보면 합쳐진 브랜치나옴 -커밋을 하나로 합쳐서 메일으로 순간이동 시켜주는 거라 사람들이 깔끔하다고 좋아함
-합쳐질 브랜치를 메인브랜치 최신커밋으로 리베이스하고 나서 fast foward마지 비슷한걸 해줌 -결관느 스쿼시마지랑 비슷한데 커밋내용 전부 보존 -얘도 git log —oneline —graph 해보기
*참고 원격 저장소의 커밋 내역을 과거로 돌릴려면 로컬에서 git reset —hard 이런거 쓰고 git push -f 하면 가능하긴한데 해당 브랜치를 공동작업중인 사람들이 모두 영향받기 때문에 그러지 않는게 좋음 깃허브 사이트에 revert버튼이 있긴 한데 그거 쓰면 예전 코드로 되돌려주는 커밋을 만들어주는 식으로 동작
Q. merge 할때 어떤 방법을 쓰는게 좋은가
기록을 남겨야 하는 중요한 브랜치를 마지 할땐 3way
기록 남길 필요없는 쓸데없는 브랜치를 마지할땐 스쿼시, 리베이스
<브랜치 전략>
→ 안정적인 git flow
→ Trunk-based 전략
<잠깐 보관하기 stash>
git stash
→ 아공관에 고드 보관 스테이징 된것이든 안된것이든 추적중인 파일은 다이동함 새로 만든 파일인데 스테이징 안되었다면 이동 안됨
git stash save "bb코드짰는데 망함"
→ 메모 입력가능
git stash list
→ 스타쉬 여러번 가능, 현재 스타쉬 되어있는 코드 목록 전부 출력해주는 명령어
git stash pop
→ 잠깐 보관했던 코드 불러오기, 스타쉬 여러개 했으면 가장 최근 보관했던 코드부터 먼저 불러옴 현재코드와 겹치면 충돌나는데 알아서 해결
git stash drop 삭제할id
git stash clear
→ 특정 스타쉬 삭제, 밑에껀 모든 스타쉬 삭제 삭제할 아이디는 git stash list 하면 보이는 0,1,2 이런 숫자 넣으면 됨
git stash -p
→ 전체 말고 일부 코드만 깃 스타쉬 하고 싶으면 이거 씀 그럼 파일 훎어주면서 스타쉬 할지 물어보는데 y/n로 대답하면
*참고 주석해도됨 → 대신 커밋 기록에 남아서 기록 더러워짐 주석내용 커밋하기 싫을때 스타쉬쓰샘
팀장이 A부분만 빨리 커 해라 하면 B부분 잠깐 스타쉬 해놓고 커밋하기 브랜치 새로 만들어서 보관해도 됨
친구들을 위해 정리함
'[멋쟁이사자처럼 프론트엔드 TIL]' 카테고리의 다른 글
[멋쟁이사자처럼 프론트앤드 TIL] 깃허브 커밋 및 푸쉬 변경 시 무한로딩 (0) | 2024.07.21 |
---|---|
[멋쟁이사자처럼 프론트앤드 TIL] 내가 계속 보는 리액트 새 프로젝트 생성 (0) | 2024.07.19 |
[멋쟁이사자처럼 프론트앤드 TIL] 깃허브 연결 핵심정리 (0) | 2024.05.13 |
[멋쟁이사자처럼 프론트엔드 TIL] 텍스트 링크, 호버(커서 올리면 색바뀜) (0) | 2024.05.07 |