Git
Git 명령어
Dexlee
2021. 11. 5. 14:12
1. Git show
- 현재 브랜치의 가장 최근 커밋 정보를 확인
- Git show head : HEAD 포인터가 가리키는 커밋 정보를 확인.
- head == @, ~ == ^
- git show head(@)
- head를 보여줌.
- git show @~
- 한 커밋 이전
- git show @~3
- 3커밋이전(숫자에 따라 그 숫자 이전으로 간다)
2. Git branch
- 하나의 작업 공간을 만듦.(그래서 개발자 간에 작업 공간이 충돌 나지 않도록)
- Branch들 확인
- Git branch branch_name : 브랜치 생성
- Git branch -d branch_name : 삭제
- Git branch -r : remote에 있는 브랜치까지 확인
- git checkout -b NIMDA_3ND-pub origin/NIMDA_3ND-pub
- 라고 하면.. 원격 저장소도 바꾸면서 로컬 브랜치도 바꿀 수 있다.
3. Git status
- branch가 어디에 있는지 확인
- Untracked 인지 staged 상태인지 등을 확인
4. Git log [-5]
- 커밋 단위로 history가 쌓임.
- log를 볼 줄 알아야 develop, release, hotfix, branch가 난무할 때 merge 방향이나 순서를 이해할 수 있음
- 위에 있는 것이 최신. - Desc
5. Git add .(혹은 경로와 파일명을 적어줌 그것 하나만 add 하고 싶은 경우)
- Untracked 나 modified 상태의 파일을 staged 상태로 만들어줌.
6. Git commit -am
- -a : add를 같이함.
- 보통 modified 상태에서 이 -a 옵션을 줘서 git add 명령어를 건너뛰는 경우가 많다.
- -m : message를 넣음.
- 실무에서 한 작업(기능, 피처) 단위로 한 커밋 권장.
- 파일을 unmodified 상태로 만듬.
- Git 시스템에 영구적으로 변경을 저장.
- SHA-1 알고리즘을 적용한 해쉬값을 키로 생성.
7. Git checkout branch_name
- 다른 브랜치로 이동
- -b : git checkout -b branch_name : 브랜치를 생성하고 그 브랜치로 이동
- Tips
- 커밋의 hash 값을 알면 시간 여행이 가능하다.(즉, 이전에 커밋해둔 상태 값으로 이동이 가능함)
- Git log로 hash 값을 확인.
- Git checkout hash_value를 입력하면 그 브랜치에서 전에 커밋한 내용으로 접근할 수 있음.
- 그리고 돌아가는 명령어는 git checkout the_branch_name 그 브랜치를 입력하면 최신 상태로 돌아갈 수 있음.
8. Git push origin [remote저장소 이름] [branch_name]
- 로컬 브랜치의 정보를 원격 저장소로 업로드
- Clone 한 리모트 저장소에 쓰기 권한이 있어야 한다.
- 같은 브랜치로 여러 명이 받아서 누군가 push를 했다면 나는 push가 안됨.
- 다른 사람이 작업한 것을 가져와서 합친 후에 (merge or rebase) push 할 수 있음
- Git remote : remote 저장소 이름을 확인 가능. 보통 origin
- -f (혼자 작업할 때만 사용. 굉장히 신중히)
- 내 로컬 브랜치로 원격 브랜치를 덮어 씌운다.
- 내가 혼자 작업하던 feature 브랜치에서만 사용해야 함.
- 누군가 악의적으로 망칠 수도 있으니 보통 마스터에 push 할 수 있는 권한은 주지 않음.
9. Git pull origin [branch_name]
- Clone 한 서버에서 데이터를 가지고 오고 그 데이터를 자동으로 현재 작업하는 코드와 merge(변경된 코드를 합쳐줌)
- 그래서 만약 내가 작업하고 있는 부분이 있다면 git fetch부터 해줘야 한다.**
10. Git fetch
- 서버에서 데이터만 가져오고 자동으로 코드를 합치지는 않음.(merge는 안 함)
- 즉, 변경점은 합쳐지지 않고 있어서 fetch 후 pull도 꼭 해줘야 한다.
11. Git diff
- 파일 변경 내용 보기.
12. Git stash [option] [stash@{num}]
- 모든 옵션에 특정 stash의 값을 가져올 수 있다.
- 작업하던 내용을 스택에 임시 저장
- 브랜치에서 작업을 하다가 다른 브랜치로 변경해야 하는데 커밋은 하고 싶지 않은 경우
- stack처럼 작동한다.
- Stash, pop(stack에 있는 내용을 꺼내옴)의 명령어를 많이 사용
- Git stash list : stash stack 안에 몇 개가 쌓였는지 확인.
- Git stash pop : stack에 있는 내용을 꺼내와 적용함.
- stack안에 있는 내용이 여러 개인 경우, commit을 한 후 다시 가져와야 modified로 적용이 된다.
- 그리고 최종 commit을 해서 push를 하면 된다.
- git stash pop stash@{1}
- 이렇게 각 stash 번호로 특정 값을 가져올 수 있다.
- git stash branch branch_name stash@{0}
- stash에 있는 내용을 새로운 브랜치를 만들어서 거기에 놓는다.
- git stash apply
- 가장 최근에 저장한 stash를 복원한다.
- git stash drop
- 가장 최근에 저장한 stash를 삭제한다.
- https://www.popit.kr/git-stash/
13. Git merge
- 협업의 핵심. 다른 브랜치와 현재 브랜치를 합쳐서 코드를 합침.
- 방식
- Fast forward 방식
- 커밋들이 공통이고 대상 브랜치의 커밋만 증가했을 경우 단순히 HEAD만 옮겨짐
- 다른 분이 먼저 git commit을 했다면, git pull로 그 commit 된 파일을 받고,
- Git merge branch(다른 사람이 commit 한 브랜치)를 통해 head를 옮기는 방법.
- 이때, 나는 commit을 하지 않는다.(그래서 커밋이 공통이라고 말할 수 있는 것)
- 3-way merge 방식
- 두 갈래로 나온 변경들을 합쳐서 새로운 커밋을 만듦.
- 다른 사람이 commit 한 내용을 내가 pull하고 나도 commit을 했을 때, 커밋이 공통이 아니라고 말한다.
- 그래서 Git merge branch(다른 사람이 commit한 브랜치)를 해주면,
- 다른 사람이 commit한 내용 + 내가 commit한 내용이 merge가 되어서 새로운 commit 된 log 한개가 추가되어서 볼 수 있다.
- 그래서 총 3개의 commit된 내용을 확인 가능.
- conflict
- 그런데 이때.. 만약 같은 부분을 modified 했다면,, conflict 가 일어난다. 그래서 이땐, conflict가 난 부분을 vi file_name으로 들어가서 직접 수정을 해줘야 한다.
- 수정 후 modified가 되었으니, 그 부분을 commit 해주면 안정적으로 merge가 일어난다.
- Squash
- 대상 브랜치의 커밋들을 하나의 커밋으로 합쳐서 merge
- Fast forward 방식
14. Git rebase
- 기능은 merge와 같다.(코드를 합친다. 하지만 방법이 약간 다름)
- 내 브랜치의 커밋을 대상 브랜치의 위(다음)로 생성함.
- 깔끔한 로그를 유지할 수 있음
- 주의
- Push 해서 누군가 사용하고 있는 커밋을 rebase 하면 안 된다.
- 왜냐하면 해당 commit을 기반으로 작업을 했을 텐데 그 기반을 바꿔버리므로,
- Push 해서 누군가 사용하고 있는 커밋을 rebase 하면 안 된다.
- 방식
- Fast forward 방식
- merge와 같다.
- 두 브랜치 모두 커밋이 있지만 충돌이 나지 않음(auto merging)
- merge와 방법은 같지만 전에 커밋한 해쉬값이 아닌 새로운 해쉬값을 만들어서 branch(다른 사람이 commit 한 브랜치) 뒤에 생긴다.
- 그래서 총 2개의 commit 된 내용을 확인 가능.
- 두 브랜치 모두 commit이 있고 충돌이 난 경우(conflict)
- Git rebase branch(다른 사람이 commit 한 브랜치)를 쳤을 때, 충돌이 났다면,
- —abort : rebase를 중단
- —skip : 대상 브랜치의 내용으로 적용
- —continue : rebase를 계속 진행.
- 충돌 난 부분으로 들어가서 직접 수정을 한 후
- Add or rm 명령어로 추가 혹은 삭제를 해준 후 rebase —continue를 입력해준다.
- 이때 add edited_file_name(수정된 파일)을 add 해줘야 한다.
- 주의할 점은 rebase는 commit을 해주는 것이 아니라 add를 해주는 것이다.
- 커밋 여러 개 하나의 커밋으로 만들기.
- -i : 대화형 모드
- Git rebase -i HEAD(@로도 표현 가능)-3(보고 싶은 commit log의 개수)
- default가 pick이다. 여기서 pick을 fixup(f)로 합치고 싶은 개수-1개만큼 바꾸어주면 하나의 커밋으로 만들 수 있다.(물론 모든 내용이 merge 된 상태로)
- Fast forward 방식
15. git reset @~ (하나의 커밋만 : commit과 add까지 되돌림 modified)
- 상대를 이전 commit으로 되돌림.
- 옵션에 따라서 커밋 이전 or 어느 단계(staged, modified, unmodified)까지 reset
- git show @~
- 돌아가고 싶은 곳을 확인해봄
- git reset —soft @~
- commit만 되돌린다. : staged
- git reset —mixed @~ (default)
- commit과 add 되돌림 : modified
- git reset —hard @~. (협업에서 사용하지 말 것)
- commit, add, 워킹 디렉터리까지 되돌려서 복구 불가능 (unmodified)
16. git cherry-pick
- 다른 커밋을 가져온다(복사)
- 복사하고 싶은 브랜치에서
- git cherry-pick hash(가져오고 싶은 해쉬값)
- 그 후 같은 값이기 때문에 그 전의 값은 지워줄 것.
- git branch -d branch_name
- 사용 예제
- release 브랜치에서 feature 브랜치로 따서 작업을 해야 하는데, develop 브랜치에서 feature 브랜치로 따서 작업을 했다고 한다면,
- 이런 경우에는 기반 브랜치가 다르기 때문에, 원래에 따려는 release 브랜치로 돌아가서 거기서 feature 브랜치를 만들어서 develop에서 작업하던 feature 브랜치의 해쉬값을 가지고 온다.
17. git remote
- git remote add origin [git-address]
- git remote rm origin
- git remote -v
- remote 확인
- git remote update
- origin에 만들어진 브런치를 내려받는다.