GIT
Ref.
코딩애플
GitIgnore 만들기
[Git] .gitignore 사용법 및 작동하지 않는 경우 (+ .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
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 add [변수명][변수값]
변수 목록 확인
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/