TIL_Git/Github 파헤치기

이고운·2022년 10월 11일
0

현재 git, github 작업을 하고 있지만 사용하는 것만 사용해서 추가로 알면 좋을 것 같아, 강의를 듣기 시작했다. 해당 페이지에는 추가로 알게된 명령어 등을 적을 예정이다.

1. git 개념 (버전관리 프로그램)

1. git diff / difftool / difftool <commit>

git diff 최근 commit , 현재 파일 차이점 보여줌.
별로임, 버그도 있음 (엔터키도 수정으로 인정)
git difftool vim 에디터가 떠서 시각적으로 비교 가능
git difftool <commit 아이디1> <commit 아이디2> 특정 커밋이랑 비교 가능
commit id = git log 시에 나오는 코드 7자리
그런데 요즘은 difftool은 잘 안씀, vs code 추가 부가기능도 잘 되어 때문에,,, 예를 들어 (git gragh)

2. git branch

복사본의 개념 (예비 작업할 때 사용)
만약 branch에서의 작업이 맘에 든다 메인에 합치고 싶다하면 merge로 합침
일단 기준이 되는 main branch로 이동하고 merge 해주면 됨
이 때 main과 branch가 각 다른 파일을 작업한 거면 상관 없음.
그런데 같은 파일에 똑같은 줄을 수정한 경우에는 conflict가 남.
직접 해결해줘야함.
테스트 삼아 다른 브랜치에서 같은 파일 같은 줄을 수정함
그리고 main에서 git merge <branch> 로 머지 시도
그러면 아래와 같이 conflict가 남

➡️ 해결 방법 :
원하는 코드 남기고 git add . -> git commit
아니면 vscode위에 accept 어쩌구 버튼 누르면 됨.

✂️브랜치 삭제
git branch -d <브랜치 이름> : 병합이 완료된 브랜치 삭제
git branch -D <브랜치 이름> : 병합하지 않은 브랜치 삭제

3. git merge

1) git merge : 각 다른 브랜치에서 작업한 것을 합침

📒3-way-merge : 각 브랜치에 각각 신규 커밋이 1회 이상 있는 경우
merge시 두 브랜치를 합쳐서 새로운 commit을 생성해 주는 것.

📗fast-forward merge : 새로운 브랜치에만 커밋이 있고 기존이 되는 브랜치에는 신규 커밋이 없는 경우 merge를 할때 방식
(딱히 합칠 게 업서서 그냥 신규 브랜치한테 니가 이제 main브랜치라고 하는 것)
따라서 기준이 되는 브랜치에 신규 커밋이 없으면 자동으로 ffm로 발동
싫으면 git merge --no--ff로 강제 3wm하면 됨.

2) rebase and merge
이 때 rebase하고 나서 merge 도 가능함.
** rebase : 브랜치의 시작점을 다른 커밋으로 옮겨주는 행위
rebase를 이용해서 시작점을 main에 최근 commit으로 옮긴 다음
ffm할 수 있음.
때문에 rebase and merge 하고 싶으면

  • 새로운 브랜치로 이동 git switch <new branch>
  • git rebase main git rebase main
  • 브랜치가 main브랜치 끝으로 이동하면 ffm 하면 됨. git switch main-> git merge <new branch>

❓rebase 사용하는 이유 : 브랜치가 많을 때 모두 3wm시 로그가 복잡해짐
간단하고 짧은 브랜치들은 rebase 사용하여 깔끔하게 만듬
❗️rebase 단점: conflict 많이 남.

3) squash and merge
3wm처럼 선으로 이어주지 않고 새 브랜치에 있던 변경 사항들이 main브랜치로 텔레포트 함. 이러면 git log 확인시 merge 완료된 브랜치의 commit은 출력되지 않음. log 깔끔해짐

  • git switch main
  • git merge --squash <브랜치명>
  • git commit -m

4. git revert/reset/restore

1) git restore <파일명> : 해당 파일을 최근 커밋으로 돌아감
git restore --source <커밋아이디> <파일명> : 해당 커밋으로 돌아감
git restore --staged <파일명> : staging 취소

2) git revert <커밋아이디> : 특정 커밋에서 일어난 작업 취소
위에 코드 입력하면 에디터가 뜸. 이때 커밋메세지 수정하면 됨
커밋아이디는 여러개 입력(취소) 가능
최근 커밋 취소하려면 git revert HEAD 입력하면 됨

3) git reset
git reset --hard <커밋아이디> : 커밋이 생성된 시기로 되돌려줌
❗️ 협업 시에는 사용 금지 : 다른 사람들도 영향을 받기 때문에
개인적으로 사용할 때도 많이 사용하는 기능은 아님. 비교적 짧은 거리 되돌아 갈 때 정도만 괜찮음.

git reset --soft <커밋아이디> : 리셋인데 변동사항 지우지 말고 스테이징 해놓음

2.github 사용법

1) git push

repository : git이 파일을 저장해주는 장소
로컬저장소를 원격저장소에 백업할 때 github 사용

git push -u <원격저장소주소> <올릴브랜치이름>

git remote add <변수명> <원격저장소주소> : 주소가 변수명에 담김
git push -u <변수명> main : git push 할 때 -u는 주소 기억하라는 뜻. 한번 쓰면 나중에 git push만 하면 됨.

2) git clone/pull

협업할 때 사용 (공동작업 시에 collaborators에 깃헙아이디 등록해놔야
git push 가능함.)

git clone <원격저장소 주소> : 소스코드 다운 받기

남이 먼저 push를 하면 내가 바로 push 못함. 하게 되면
error: failed to push some refs to 주소~ 이렇게 나옴
원격 저장소에 새로운게 생기면 git push 못함.
이때는 git pull을 해야함.
git pull <원격저장소주소> <브랜치명> : 원격저장소 -> 로컬저장소

원격저장소 최신내용이 로컬저장소에 있으면 git push 가능
❗️git pull은 git fetch + git merge임
(git fetch : 원격저장소 신규 commit 가져오기)
때문에 pull 했을 때 conflict 날 수 있음.

3) git PR

Pull Request : merge 요청

  • conflict 나는 경우 : 수정하고 merge 가능

4) git Flow

main ➡️ develop (복사본) ➡️ feature ➡️ develop (복사본) ➡️ release(마지막 테스트) ➡️ main ➡️(오류 발생시) (feature/)hotfix

안정적으로 버전별 배포 가능 / 참고만 하기

  • trunk-based : 메인브랜치 하나만 관리 (feature하나 정도만)
    테스트를 많이 자주해야함. 그러나 소스코드 하나만 관리 가능

5) git stash

잠깐 잘라서 보관, 만약 보관된 코드 조회하고 싶으면 git stash list
최근 commit과의 차이점을 전부 보관해줌.
staging 안해놓은 새로운 파일은 stash안될 수 있음.
메모 적고 싶으면 git stash save '메모'
코드 다시 불러오려면 git stash pop 그러나 이때 최근 것부터 불러옴
그런데 굳이 stash 할 상황이 많지는 않음(주석처리 정도)
git stash drop 번호 : stash 1개 삭제
git stash clear : stash 전부 삭제

이렇게 git/git hub 개념에 대해 좀 더 자세하게 배워봤다.
기존에 프로젝트 하면서 썼던 개념이 많았지만 정확하게 어떤 기능인지 모르고
무지성으로 이때는 이거써야지라는 식으로 사용했었다.
특히 merge할 때 거의 merge만 사용했었는데, 경우에 따라 방법을 달리해서 사용해야할 것 같다.

profile
자 이제 시작이야~ 내 꿈을~ 내 꿈을 위한 여행~~🌈

0개의 댓글