public:computer:git

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revisionBoth sides next revision
public:computer:git [2021/08/22 16:37] alexpublic:computer:git [2022/08/26 15:04] – [Git 사용법 정리] alex
Line 1: Line 1:
 ====== Using git ====== ====== Using git ======
 +
 +
 +^  git 자주 사용하는 명령어 모음  ^^
 +^ 깃 초기화  | git init 경로명  |
 +^ 깃 상태 확인  | git status  |
 +^ 깃 저장소 복제  | git clone 원격저장소URL 새폴더이름  |
 +^ 파일 등록과 커밋  | git add 파일이름 -> git commit -> 에디터에서 커밋 메시지 작성  |
 +^ ::: | git commit -a -> 에디터에서 커밋 메시지 작성  |
 +^ ::: | git commit -am "커밋 메시지"  |
 +^ 로그 확인  | git log  |
 +^ 커밋 비교  | git diff  |
 +^ 원격 저장소 별칭 확인  | git remote  |
 +^ 원격 저장소 별칭과 URL 확인  | git remote -v  |
 +^ 원격 저장소와 연결  | git remote add 원격저장소별칭 원격저장소URL  |
 +^ 원격 서버 삭제  | git remote rm 원격저장소별칭  |
 +^ 커밋 가져오기  | git pull 또는 git fetch  |
 +^ 커밋 전송하기  | git push 원격저장소별칭 브랜치이름  |
 +^ 현재 브랜치 확인  | git branch  |
 +^ 브랜치 생성  | git branch 브랜치이름  |
 +^ 브랜치 이동  | git checkout 브랜치이름  |
 +^ 스태시 저장  | git stash  |
 +^ 스태시 읽기  | git stash pop  |
 +^ 브랜치 병합  | git merge 브랜치이름  |
 +^ 리베이스 병합  | git rebase 브랜치이름  |
 +^ 리셋  | git reset 옵션 커밋ID  |
 +^ 리버트 취소 커밋  | git revert 커밋위치  |
 +^ 태그 관리  | git tag  |
 +^ 태그 전송  | git push 원격저장소별칭 태그이름  |
 +^ 서브모듈로 연결  | git submodule add 원격저장소URL 폴더이름  |
 +
  
 ===== why git? ===== ===== why git? =====
Line 52: Line 82:
   * pull -> 작업 -> commit -> pull -> push   * pull -> 작업 -> commit -> pull -> push
   * 대부분의 git 명령어는 working tree clean 상태에서 작업   * 대부분의 git 명령어는 working tree clean 상태에서 작업
 +  * reset; 저장소를 외부에 공개했거나 공유하고 있다면 주의해서 리셋 사용
 +  * revert; 기존 커밋을 남겨 두고 취소에 대한 새로운 커밋 생성.
 +  * reset vs. revert; 커밋 정보의 삭제 여부. 리셋: 커밋 삭제, 리버트: 취소 커밋 생성
 +  * versioning; major.minor.patch, SemVer(Semantic Versioning)
 +    * RC(Release Candidate), GA(General Availability), M(Milestone)
 +  * tag; 특정 커밋에 태그 부착
 +    * Annotated; 태그 이름 + 정보 포함
 +    * Lightweight; 태그 이름만 포함
 +    * ./git/ref/tags 폴더
  
 <cli prompt="$ " comment="  # "> <cli prompt="$ " comment="  # ">
Line 112: Line 151:
  
 $ git clean  # 워킹디렉토리 안에 추적되지 않는 파일을 모두 삭제, -f 강제, -n 가상으로 처리하고 사용자 확인, -d untracked 상태의 파일만 삭제, -x .gitignore 설정된 파일까지 삭제 $ git clean  # 워킹디렉토리 안에 추적되지 않는 파일을 모두 삭제, -f 강제, -n 가상으로 처리하고 사용자 확인, -d untracked 상태의 파일만 삭제, -x .gitignore 설정된 파일까지 삭제
 +
 +$ git log --oneline  # 로그 한줄씩
 +
 +$ git reset --hard HEAD^^^  # HEAD로부터 세번째로
 +$ git rest 옵션 커밋ID  # 옵션: soft; 스테이지 영역을 포함한 상태로 복원, mixed; 기본값, hard: 실제 파일이 삭제된 이전 상태로 복원
 +
 +$ git reset --soft HEAD~  # 이전 커밋으로 soft 옵션을 사용한 리셋. 파일을 수정하고 add 명령어로 스테이지 영역에 올려 커밋을 실행하기 직전의 단계로 되돌림
 +$ git commit --amend  # 위와 유사함
 +
 +$ git reset --mixed 커밋ID
 +$ git reset 커밋ID  # 위와 같은 명령
 +$ git reset --mixed HEAD~  # 리셋한 후 스티이지 상태까지 복원하지 않음, 커밋하려면 add 명령어를 먼저 실행
 +
 +$ git reset --hard HEAD~  # 사용한 커밋 이후의 모든 내용 삭제, 워킹 디렉토리 내용도 함께 삭제
 +
 +# 스테이지 리셋
 +$ git add 파일이름
 +$ git reset 파일이름
 +$ git reset --mixed HEAD 파일이름  # 파일 이름을 지정하여 리셋하면 해당 파일은 unstage 상태
 +$ git reset 커밋ID 파일이름
 +
 +# 작업취소
 +$ git reset --hard HEAD
 +
 +# 병합 취소
 +$ git reset --merge HEAD~
 +
 +
 +$ git revert HEAD  # 현재 커밋을 리버트, 새로운 리버트 커밋 생성
 +
 +$ git revert 커밋ID
 +$ git revert 커밋ID .. 커밋ID  # 범위 연산자 ..를 사용, 여러 커밋 리버트
 +
 +$ git revert --mainline 숫자 병함커밋ID  # 리버트로 병합 취소
 +
 +$ git tag
 +
 +$ git tag -l  # 또는 --list
 +
 +$ git tag -a 버전  # annotated 태그 생성, 에디터로 작성
 +
 +$ git log --decorate 
 +
 +$ git tag -a 버전 -m "메시지"  # 에디터 안뜸
 +
 +$ git tag -d 태그이름
 +
 +$ git show 태그이름  # 태그의 상제 정보 확인
 +
 +$ git tag 태그이름  # lightweight, 커밋의 체크섬만 가지고 있다
 +
 +$ git tag -a 태그버전 커밋ID  # 특정 커밋ID에 태그 버전 생성
 +
 +$ git checkout 태그버전  # 태그버전으로 체크아웃, 이 경우 추가 커밋 작성 불가
 +$ git checkout -b 브랜치이름 태그이름  # 태그 기준으로 브랜치 생성
 +
 +$ git push 태그이름  # 원격저장소에 태그이름 push
 +$ git push 원격저장소이름 --tags  # 모든 태그를 한꺼번에 원격저장소에 push
 +$ git push --delete 원격저장소이름 태그이름  # 원격저장소의 태그 삭제
 +$ git push 원격저장소이름 로컬태그이름:원격저장소태그이름  # 원격저장소에 로컬과 다른 이름으로 태그 전송
 +
 +
 +
 +
 </cli> </cli>
  
Line 230: Line 333:
   * 하나의 프로젝트 여러 명의 개발자   * 하나의 프로젝트 여러 명의 개발자
     * develop 브랜치에서 각 개발자별로 브랜치 생성후 작업 (보통 기능별로 개발자에게 분배) 혹은 develop에서 기능별 브랜치 생성     * develop 브랜치에서 각 개발자별로 브랜치 생성후 작업 (보통 기능별로 개발자에게 분배) 혹은 develop에서 기능별 브랜치 생성
 +  * git-flow, github-flow, gitlab-flow 가 조금씩 다르다.
  
 ===== submodule ===== ===== submodule =====
 +  * 저장소를 모듈화, 저장소 분리
 +  * 저장소 하나가 다른 깃 저장소를 포함하는 형태
 +  * 메인 저장소 <-> 부 저장소
 +  * 2개 이상인 저장소를 부모/자식 관계로 연결
 +  * 서버 저장소를 서브폴더 형태로 취급
 +  * .gitmodules
 +  * 메인에서 서브저장소 추가 -> .gitmodules 추가 -> 커밋
 +  * 저장소마다 별도로 커밋 수행
 +  * 메인 저장소는 서브모듈의 변경 내용을 모니터링, 서브모듈이 변경되면 메인 커밋
 +
 +<cli prompt="$ " comment="  # ">
 +$ git submodule -help
 +
 +$ git submodule add 원격저장소URL 폴더이름  # 메인저장소에서 작업, 서브저장소 등록
 +$ git add .gitmodules  # .gitmodules 등록
 +$ git commit -m "add submodule"  # 커밋
 +
 +$ git submodule init  # 서브모듈 초기화, 하위 저장소의 내용을 가져오기 위해. 메인저장소에서 실행
 +$ git submodule update  # 서브모듈 업데이터
 +
 +# submodule 사용시, 아래 두 줄은 세트라고 생각하면 됨.
 +$ git pull origin master
 +$ git submodule update
 +</cli>
  
 ===== fork, pull request ===== ===== fork, pull request =====
 +  * PR(Pull Request) @github, MR(Merge Request) @gitlab
   * fork -> clone forked repository -> make branch and move to branch on forked repository -> coding jobs on branch -> push -> pull request   * fork -> clone forked repository -> make branch and move to branch on forked repository -> coding jobs on branch -> push -> pull request
 +
 +===== Etc =====
 +  * refs, reflog
 +  * file annotation; blame, 
 +  * replace; 기존 커밋을 다른 커밋인 것처럼 변경
 +  * garbage collect; 연결고리가 없는 고립된 객체들, 주로 리셋/리베이스 등을 자주할 때 발생
 +  * prune
 +  * rerere(reuse recorded resolution); 어떤 문제로 충돌이 발생할 때 이를 기록
 +
 +<cli prompt="$ " comment="  # ">
 +$ git rev-parse 브랜치이름  # 브랜치이름의 해시값 확인
 +$ git show 해시값
 +
 +$ ls .git/refs -all  # 저장소 refs 파일 목록
 +
 +$ git reflog  # reflog, 시스템에서 정의한 며칠 간의 기록만 보관
 +
 +$ git blame 파일이름  # 누가 코드의 어느 라인을 수정했는지 파악할 때 유용
 +$ git blame -L 시작줄,마지막줄 파일이름. -e: 사용자 이름 대신 이메일 출력, -w: 공백 문자 무시, -M: 같은 파일 내에서 복사나 이동 감지, -C: 다른 파일에서 이동이나 복사된 것을 감지
 +
 +$ git replace 커밋ID1 커밋ID2  # 커밋ID1 -> 커밋ID2 연결
 +
 +$ git gc --auto  
 +
 +$ git prune --dry-run --verbose  # 객체 삭제, --dry-run: 실행하지 않고 작업할 내역만 출력, --verbose: 작업한 결과 출력
 +$ git reflog expire --expire=now  --expire-unreachable-now --all  # reflog 삭제
 +$ git prune --expire now -v  # 객체 삭제 실행
 +
 +$ git remote prune  # 원격 저장소의 브랜치를 병합한 후 삭제, 삭제된 원격 저장소 브랜치는 더이상 참조할 수 없다
 +$ git fetch --prune  # 오래된 브랜치 정리
 +
 +$ git config rerere.enabled true  # rerere 기능 사용, --global 옵션 가능
 +$ git rerere status  # 상태
 +
 +</cli>
  
  
Line 365: Line 529:
 references references
 </cli> </cli>
-pro git 한글판 http://git-scm.com/book/ko/ +  * pro git 한글판 http://git-scm.com/book/ko/ 
-git 간편안내서 http://rogerdudler.github.io/git-guide/index.ko.html +  git 간편안내서 http://rogerdudler.github.io/git-guide/index.ko.html 
  
 +  * [[https://shanepark.tistory.com/214|Sourcetree 에서 잘못된 비밀번호로 저장소 접근 안될때 해결방법]]
 +  * [[https://zi-c.tistory.com/entry/Sourcetree%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-git-merge-commit-conflict-%EC%B6%A9%EB%8F%8C-%ED%95%B4%EA%B2%B0|Sourcetree를 활용한 git merge commit conflict 충돌 해결]]
 +  * [[https://gitabout.com/8|Git commit 되돌리기 명령어 Reset 과 Revert]]
 +  * [[https://github.com/k88hudson/git-flight-rules|Flight rules for Git]]
 +  * [[https://velog.io/@u-nij/Git-Flow-Commit-message-Issue-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0|Git-Flow & Commit message & Issue 이용해서 협업하기]]
  
  • public/computer/git.txt
  • Last modified: 2022/08/26 15:05
  • by alex