현재 git, github 작업을 하고 있지만 사용하는 것만 사용해서 추가로 알면 좋을 것 같아, 강의를 듣기 시작했다. 해당 페이지에는 추가로 알게된 명령어 등을 적을 예정이다.
<commit>
git diff
최근 commit , 현재 파일 차이점 보여줌.
별로임, 버그도 있음 (엔터키도 수정으로 인정)
git difftool
vim 에디터가 떠서 시각적으로 비교 가능
git difftool <commit 아이디1> <commit 아이디2>
특정 커밋이랑 비교 가능
commit id = git log 시에 나오는 코드 7자리
그런데 요즘은 difftool은 잘 안씀, vs code 추가 부가기능도 잘 되어 때문에,,, 예를 들어 (git gragh)
복사본의 개념 (예비 작업할 때 사용)
만약 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 <브랜치 이름>
: 병합하지 않은 브랜치 삭제
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 switch main
-> git merge <new branch>
❓rebase 사용하는 이유 : 브랜치가 많을 때 모두 3wm시 로그가 복잡해짐
간단하고 짧은 브랜치들은 rebase 사용하여 깔끔하게 만듬
❗️rebase 단점: conflict 많이 남.
3) squash and merge
3wm처럼 선으로 이어주지 않고 새 브랜치에 있던 변경 사항들이 main브랜치로 텔레포트 함. 이러면 git log 확인시 merge 완료된 브랜치의 commit은 출력되지 않음. log 깔끔해짐
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 <커밋아이디> : 리셋인데 변동사항 지우지 말고 스테이징 해놓음
repository : git이 파일을 저장해주는 장소
로컬저장소를 원격저장소에 백업할 때 github 사용
git push -u <원격저장소주소> <올릴브랜치이름>
git remote add <변수명> <원격저장소주소> : 주소가 변수명에 담김
git push -u <변수명> main : git push 할 때 -u는 주소 기억하라는 뜻. 한번 쓰면 나중에 git push만 하면 됨.
협업할 때 사용 (공동작업 시에 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 날 수 있음.
Pull Request : merge 요청
main ➡️ develop (복사본) ➡️ feature ➡️ develop (복사본) ➡️ release(마지막 테스트) ➡️ main ➡️(오류 발생시) (feature/)hotfix
안정적으로 버전별 배포 가능 / 참고만 하기
잠깐 잘라서 보관, 만약 보관된 코드 조회하고 싶으면 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만 사용했었는데, 경우에 따라 방법을 달리해서 사용해야할 것 같다.