GIT

W·2024년 1월 17일

Git

목록 보기
1/1

GIT

Ref.

코딩애플

GitIgnore 만들기

[Git] .gitignore 사용법 및 작동하지 않는 경우 (+ .gitignore 템플릿 사이트)

  • vim .gitignore

파일규칙

입력방법

init

  • git init ⇒ 로컬 저장소 생성 : git 쓸 준비

Git Log

포맷형식

git log --pretty=format:"%h - %an, %ar : %s"

변경사항 확인

git log -p

Diff

  • git diff : 바로 전커밋과 비교하여 차이점을 보여준다. vim에디터로..
  • git difftool : diff를 좀더 보기 쉽게 ui가 진화되어있음. h j k l 키로 방향이동하여 확인.
    • option이 있음. : git difftool [커밋 아이디] → 해당 커밋아이디와 비교 가능.

Branch

  • 파일의 복사본을 만들기 위함 → 브랜치 생성시 자동으로 파일도 사본이 떠짐.
  • git branch [브랜치명] ⇒ 브랜치 생성
  • git switch [브랜치명] ⇒ 해당 브랜치로 이동
  • git branch -d [브랜치명] ⇒ merge 완료된 브랜치 삭제
  • git branch -D [브랜치명] ⇒ merge 안한 브랜치 삭제
  • git branch -M [브랜치 작명] ⇒ 브랜치명 변경
  • git branch ⇒ 로컬 브랜치 목록 조회
    • 옵션 : -r (원격 브랜치 목록 조회) -a (모든 브랜치 목록 조회
    • -vv (upstream 목록 조회)
    • 원격 저장소 branch 가져오기git branch -t [원격 저장소의 branch 이름]원격 저장소의 branch를 가져오면서 해당 branch로 이동한다.
  • git fetch --prune : 원격저장소랑 로컬이랑 동기화해서 원격쪽에 없어진거 다 없앰.
  • git switch -c <새로운 브랜치 이름> <원격 브랜치 이름>

HEAD

  • 현재 나의 위치

status

  • git status ⇒ git 상태를 보여줌

add

  • git add . ⇒ 해당 브랜치의 파일들을 모두 스테이징(staging → 커밋전 올려두는 공간) 한다.

log

  • git log ⇒ 로그 기록을 보여준다.
    • 옵션 : --oneline --all --graph ⇒ 그래프형식으로 보여줌 git log —oneline —all —graph

Merge

  • 브랜치끼리 합칠거임.
  • 기준이 되는 브랜치에서 합칠 브랜치명을 입력
  • git merge [합칠 브랜치명]

squash and merge

  • 3-way merge 된 것들은 매우 복잡해보이고 git log를 출력해보았을때 연결된 모든 commit 내역이 다 같이 출력되어서 보기가 어렵다.
  • merge시에 —squash 옵션을 넣어주면 새로운 브랜치에 있던 commit을 연결해주는게 아니라 똑 떼와서 main 브랜치에 붙여준다.( 순간이동하는 느낌 )
  • git merge —squash [merge할 브랜치명] ⇒ 기준 브랜치에 위치해있어야 하겠죠? ㅎㅅㅎ ( 현재위치는 main 이라고 가정 함 )
    • 브랜치에서 만들어놨던 많은 commit을 다 합쳐서 하나의 commit으로 main 브랜치에 생성해준다.

merge시 충돌( conflict ) 날경우

  • 각 브랜치의 같은 파일의 동일한 line을 수정했을 경우.
    • 어떤 수정본을 우선 적용해야할지를 지정해줘야한다.
      • 해결법 : 원하는 코드만 남기고 수정한 후 → git add → git commit 처리 해준다.

다양한 merge 방법 ( 보통 원격으로 PR하거나 로컬로 PULL 받았을 경우 아래 머지방법 중 해당하는 방법으로 실행됨 )

  • 3-way merge (가장 일반적인 방법) → 새로운 커밋을 만들면서 합치지만 서로 머지한 브랜치끼리는 연결이 되어있다. 아래그림의 초록색선 부분. ( 즉 커밋이력이 같이 출력된다 )

  • fast-forward merge → 합치려는 메인브랜치가 브랜치를 분기한 시점에서 더 이상의 추가적은 커밋이력이 없을때 실행됨.

  • squash and merge ( 마치 rebase후 merge를 한꺼번에 해주는 명령어 ) 라고 생각하면 될듯. 차이점은 rebase는 말그대로 base를 바꾸는것이라서 분기되었던 커밋이력을 그대로 가져가지만, squash and merge는 rebase후 3-way merge를 해주는 것이다.

  • rebase 하고 merge (여기서 merge는 fast-forward merge) 이다.


Rebase

  • 사용 이유 : 간단하고 짧은 브랜치들은 이거 쓰면 깔끔해보인다.
  • 단점 : conflict 엔딩… 빈도가 높음.
  • merge랑 반대 ⇒ 기준브랜치가 이동할 브랜치여야함
  • git switch 새로운브랜치
	git rebase main
    git switch main
    git merge 새로운브랜치

Revert, Reset, Restore

  • git restore [파일명] ⇒ 바로 직전 커밋 상태로 되돌아간다.
  • git restore --source [커밋해쉬코드][파일명]⇒ 해당 파일을 해당커밋해쉬코드 시점으로 되돌려준다.
  • git restore --staged [파일명] ⇒ git add(staging)된 파일을 스테이징 취소 쌉가능
    • git restore --staged '파일이름’ . → 쩜 찍으면 모든 파일
  • git revert [커밋해쉬코드] ⇒ 커밋해쉬코드에 해당하는 커밋만을 취소하는 커밋을 만드는 과정임. ( 취소커밋메세지 제대로 입력해줘야 할듯 ) → 추후 이력으로 관리됨.
  • git revert HEAD ⇒ 최신 커밋 취소

과거로 모든걸 되돌리기

  • git reset --hard [커밋해쉬코드]
    • 협업시엔 사용금지
    • 돌아가고 나면 모든 변경사항들이 삭제됨.
  • git reset --soft [커밋해쉬코드]
    • 변경사항 지우지 말고 일단 스테이징 해놓고 리셋하기
  • git reset --mixed [커밋해쉬코드]
    • 변경사항 지우지 말고 일단 unstage 해놓고 리셋하기

Clean

  • git clean ⇒ untracked 파일들을 다 지울 수 있다.
    • untracked 파일들( git add 안해놓은 파일들 )은 git reset을 하더라도 사라지지않고 유지된다. → 이럴때 사용

Repository (저장소)

  • git이 파일을 기록해두는 장소 → .git 폴더

Push

→ 다음에 git push 할때 git push만 써도 동작한다.

원격저장소에 새로운게 생기면 git push 못함.

Pull

  • git pull [원격 저장소명] ⇒ 원격저장소의 최신내용을 끌어옴.
  • git pull [원격 저장소명][브랜치명] ⇒ 특정 브랜치만 최신내용 가져옴.

  • git pull은 git fetch + git merge 임( conflict 발생가능 )
    • git fetch ⇒ 원격저장소 신규 commit 가져오세요.
    • git merge ⇒ 내 브랜치에 merge

Remote

  • git remote remove [원격저장소주소] ⇒ 원격 저장소 연결 끊기

변수 문법

변수 목록 확인

  • git remote -v

Clone

  • git clone [원격저장소 주소] → git init과 중복되면 골치아플듯.

협업 조건

브랜치로 협업하기 (Pull Request)

  • 원격저장소에서 하는 merge(요청)라고 생각하면 될듯

Stash ( 코드 잠깐 보관하기 )

  • git stash

  • git stash list ⇒ 보관한 코드 내역 보기

  • git stash save “메모내용” ⇒ 메모와 함께 보관

  • git stash pop ⇒ 스택구조로서 가장 최근에 보관한것을 불러옴.

  • git stash pop [번호입력 int] ⇒ 해당번호 불러옴

  • git stash drop [번호입력 int] ⇒ 해당번호 stash 삭제

  • git stash clear ⇒ 전부 삭제

  • git stash -p ⇒ 전체 파일말고 일부 코드만 git stash할 경우 → 실행시 파일을 훑으면서 한줄한줄 의견을 물어봄.

  • 최근 commit과의 차이점을 전부 보관해줌

  • staging을 안해놓은 새로운 파일은 stash 안될 수 있음.

  • 터미널에 git stash 입력하면 방금 작성한 bbbb 어쩌구 코드는 잠깐 다른 공간에 보관됩니다.

    (그래서 파일들이 최근 commit 상태로 되돌아갑니다.)

    • staging 된 것이든 안된 것이든 추적중인 파일은 다 이동됩니다.
    • 새로 만든 파일인데 staging 안되었다면 이동안됩니다.

Upstream Tracking

  • Upstream Tracking
    • 업스트림(upstream)은 브랜치 추적을 다르게 표현한 것입니다.
      • 로컬 저장소의 브랜치와 원격 저장소의 브랜치는 업로드할 수 있도록 매칭되어 있습니다. 이러한 매칭을 업스트림 트래킹이라고 합니다.
      • 트래킹 브랜치(업스트림)는 리모트 브랜치와 로컬 브랜치를 연결해 주는 중간 다리 역할을 합니다.
      • git clone 명령어로 로컬 저장소 브랜치에 원격 저장소 브랜치를 복제할 때 저장소에 등록된 트래킹 브랜치들을 자동으로 함께 설정합니다.
        • 하지만 원격 저장소의 모든 브랜치 정보를 한 번에 다 가지고 오지 않습니다.
          • 불필요한 브랜치를 한 번에 다 가져오는 것은 Git의 효율성과 연관하여 현명하지 않기 때문에 이 후에 [git pull] 이용하여 다른 브랜치를 받아 트래킹 브랜치를 활성화하거나 직접 트래킹 브랜치를 지정할 수 있습니다.
  • [git branch -r] : 원격 저장소의 remote 브랜치 목록
  • [git branch -a] : 모든 브랜치 정보
  • [git branch -vv]: 저장소의 트래킹 브랜치 정보
  • [git checkout --track] origin/브랜치이름 : 저장소에 새로운 업스트림 생성
  • origin : 원격저장소 별칭 (clone으로 로컬에 복제한 저장소일 경우 default로 origin)
  • 브랜치이름 : 만약 로컬에 해당 브랜치가 없다면 브랜치를 생성한 후 origin/브랜치이름으로 업스트림을 설정합니다.

    Cache를 사용하여 매번 git 아이디, 패스워드 입력 안하는 방법

    • git config credential.helper store


      해보면서 느낀거

    • xcode에서 소스 수정한후 저장 버튼을 따로 누르지않아도 자동저장이다.

    • 변경사항을 commit을 하지않고 종료하더라도 로컬저장소( 하드디스크 )에는 그대로 변경사항이 저장되어 있다.

    • 새로 만든 파일을 stash할 경우.

      • stash는 말그대로 임시저장이기때문에 어느 브랜치로 swtich하더라도 그 파일은 언제든 쓸 수 있다.
      • 단, 특정 브랜치에서 commit을 할 경우. → 커밋후 다른브랜치로 이동하면 이런식으로 빨간색이되면서 오픈이 안되는 상태가 된다.

  • 새로 만든 파일이 아닌 원래 파일에서의 변경사항을 stash할 경우
  • 변경사항에 해당하는 로직은 화면에서 보여지지않으며 stash pop 을 이용하여 임시저장해놓은 로직을 불러와야만 사용가능 하다.
  • git init을 실행할 경우
  • proj ? 해당 확장자( 프로젝트 확장자 )가 있는 경로에 .git을 생성하게 되면 소스를 수정한게 아닌 정말 사소한 심지어는 git log가 이력으로 추가되는 경우에도 status는 변경사항을 추적해버린다. >> 정말 불편하다. 그래서 실제 소스가 있는 경로에 .git을 생성하는것이 심리적인 안정.!!!

    github ssh 적용 (이것만 따라하면됨 쉬움)

    https://www.lainyzine.com/ko/article/creating-ssh-key-for-github/
profile
타협하는 순간 발전이 없어

0개의 댓글