ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • GIT 명령어
    프로젝트/운영체제 만들기 2023. 6. 1. 15:17

    글의 참고

    - https://git-scm.com/docs

    - https://git-scm.com/book/en/v2

    - https://en.wikipedia.org/wiki/Git


    글의 전제

    - 내가 글을 쓰다가 궁금한 점은 파란색 볼드체로 표현했다.

    - 밑줄로 작성된 글은 좀 더 긴 설명이 필요해서 친 것이다


    글의 내용

    - diff 관련 명령어 

    : git diff --staged : staging area 있는 파일들의 diff 보여준다. 

    : git diff : Working area와 HEAD가 가리키는 소스와의 비교한 내용을 보여준다. 

    : git diff [ branch1 ] [ branch 2 ] : branch1과 branch2의 diff를 보여준다. 주의할 점이 있다. branch 끼리 비교할 때는 서로 가장 최신 커밋을 기준으로 비교한다. 그래서 만약 commit을 하지 않으면 비교가 어렵다.  

     

     

    - config 관려 명령어 

    " git config --list : 현재 유저에 설정된 모든 git config 보여준다.

     

     

    - staged(git add 한 파일) 파일만 출력하기

    " `git diff --name-only --cached` 를 입력하면 staged 에 있는 파일들만 출력한다. 즉, `git add` 명령어를 통해서 추가된 파일들만 보여준다.

     

     

    - reset 관련 명령어 

    : git reset HEAD [ files ] - `git add` 파일들을 modified 상태로 돌린다. 

    : git reset --hard [ 돌아가고 싶은 commit ID ] - 현재 내가 작업한 파일들까지 싹 다 날려버리면서 `돌아가고 싶은 commit ID`의 내용을 가져오는 명령어다. 진짜 겁나 위험한 명렁어임. 

    : git reset --soft [ commit ID ] - 커밋한 파일들을 git add 상태로 돌린다. 

     

    - revert 관련 명령어 

    : git revert --n-edit [ 리버트할 commit id ] :  

     
    : git log의 내용이 위와 같다.

    : `git revert --no-eidt` 을 사용하면 간편하게 커밋 메세지를 입력할 필요없이 바로 해당 revert해준다. 주의점은 로컬 저장소에만 커밋된 것이기 때문에, server에 반드시 push를 해야한다. 


    : revert 커밋 내용을 보면, `git-upstream-test5`라는 파일이 사라진 것을 확인할 수 있다. 

     

     : git revert --no-commit [ 리버트할 commit id ] 

    : `git revert --no-commit`으로는 revert 커밋이 자동으로 생성되지는 않았다. 

    : 대신 `git status` 명령어를 쳐보면, git-upstream-test4` 파일이 삭제된 것을 알 수 있다. 이제 새로 커밋을 하면 된다. 즉, 이 명령어는 커밋 메시지를 새로 쓰고 싶을 때 사용한다. 

     

    : git revert --no-commit [ 리버트할 commit id ] && git commit -m [ message ] && git push [ remote ] [ branch ] - push 내용을 revert한다. 

    " 참고로 git revert 후에는 자신의 로컬에만 적용이 되는 것 같다. 그래서 반드시 revert한 후에는 push를 별도로 해야한다. git push [ … ] [ … ] 를 통해서 서버에 올리면 모두가 revert한 내용을 공유할 수 있다. 협업을 한다면, 커밋 히스토리를 함부로 삭제하면 안된다!!
    " Reference - https://jupiny.com/2019/03/19/revert-commits-in-remote-repository/ 

     

    - remote 관련 명령어 

    : git remote -v : 현재 프로젝트에 저장되어 있는 원격 저장소 목록을 보여준다. 

    : git remote remove [ remote repository ] : 원격 저장소를 삭제한다. 

    : git remote add [ remote repository name ] [ remote repository url ] : 입력한 원격 저장소의 url을 입력한 원격 저장소의 이름과 맵핑시킨다. 맵핑된 원격 저장소의 이름은 나중에 두고두고 자주 쓰인다.

    : git remote rename [ src remote repository ] [ dst remote repository ] : 현재 저장된 원격 저장소의 이름을 바꾼다. 

    : git push [ remote repository ] [ remote branch ] : 원격 저장소의 원격 브랜치에 현재 로컬 저장소에 커밋된 내용을 push한다. 

    : git remote show [ remote repository ] : 해당 명령어로 아래의 기능들을 확인할 수 있다. 

    " 브랜치명을 생략하고 `git push`를 하면 어떤 로컬 브랜치가 어떤 원격 브랜치로 push되는지 보여준다. 아래 첫번째 사진에서 `Local refs configured for 'git push'`를 보자. 저기서 `irq-test pushed to irq-test`, `main pushes to main` … 되있는데, 이게 `git push` 명령어만 쓸 경우, 동일한 이름의 로컬 브랜치와 원격 브랜치를 매칭한다는 것이다. 
    그렇면 A 로컬 브랜치에서 다른 이름의 B 원격 브랜치에 `git push`만 이용해서 push 할 수 있을까? 안된다! `git branch -u`, `git push -u`, `git config --global push.default`를 다 사용해도 위의 내용은 안된다.

    : 첫 번째 사진에서 `fast-forwardable`, `local out of date`, `up to date`는 무슨 내용일까? 이건 두 번째 사진과 함께 봐야한다. 

    " fast-forwardable : 로컬 브랜치가 원격 브랜치보다 앞서 있다. 즉, 로컬 브랜치 irq-test가 원격 브랜치 orgin/irq-test 보다 소스 내용이 앞 서 있다는 뜻이다. 그래서 로컬 브랜치에서 git push를 해서 원격 브랜치 irq-test와 동일한 소스를 만들라는 뜻이다.
     
    " local out of date : 원격 브랜치가 로컬 브랜치보다 앞서 있다. 즉, 로컬 브랜치 main이 원격 브랜치 main 보다 소스 내용이 뒤쳐저 있다는 뜻이다. 그래서 로컬 브랜치에서 git pull을 해서 원격 브랜치 main과 동일한 소스를 만들라는 뜻이다. up to date : 원격 브랜치와 로컬 브랜치의 내용이 동일하다. 즉, master는 로컬 브랜치 master와 원격 브랜치 master가 동일한 소스 상태이므로, 특별히 push 혹 pull을 할 필요가 없다는 뜻이다.

    : `Local brach configured for 'git pull'`은 무슨 내용일까? 

    " 위에 사진을 그대로 해석한다면 `로컬 브랜치 irq-test는 git pull시, 원격 브랜치 origin/main을 merge한다`는 내용이다. 저 내용을 추가하기 위해서는 `git branch -u origin/main irq-test`를 하면 된다.

     

    - push 관련 명령어 

    : git push [ remote repository ] [ local branch ] : 원격 저장소에 동일한 이름의 원격 브랜치에 로컬 브랜치가 커밋한 내용을 push한다. 참고로 git push 명령어에는 remote branch를 입력할 수 있는 인자가 없다. 즉, 로컬 브랜치와 동일한 이름의 원격 브랜치에 자동으로 push한다. 

    : git push -u [ remote repository ] [ local branch ] : `git push`와 `git pull`만 사용해도 가능하게 만들어준다. 단, 조건이 있다. 로컬 브랜치명과 동일한 원격 브랜치에만 푸쉬가 된다. 다르면 안된다. 이게 무슨 말이냐면, A 로컬 브랜치에서 다른 이름의 B 원격 브랜치로 인자 없이 `git push`만 해서 사용할 수 없다는 뜻이다. 

    : git push [ remote repository ] [ local branch ]:[ remote branch ] : 로컬 브랜치와 이름이 다른 원격 브랜치로 push 한다. 

    " `git push yohda A:B` 라고 하면, 원격 저장소 yohda에 로컬 브랜치 A의 커밋 내용을 원격 브랜치 yohda/B에 push 한다는 내용이다.   

     

    - pull 관련 명령어 

    • git pull [ remote pository ] [ remote branch ] : 입력한 원격 저장소의 원격 브랜치의 최신 내역들을 불러온다.
    git pull은 git pull와는 다르게 두 번째 인자에 원격 브랜치를 작성해야 한다. 그래서 현재 HEAD가 바라보는 로컬 브랜치 이름과 원격 브랜치 이름이 달라도 pull이 된다! 

     

    - branch 관련 명령어 

    : git checkout [ branch name ] - branch 전환한다아직 git add 하지 않은 파일뿐만 아니라(working area) git add  파일들도(staging area) 그대로 따라온다. 

    : git branch [ branch ] : 현재 branch를 카피해서 새로운 branch를 생성한다. 

    : git checkout -b [ branch name ] - `git branch`와 동일한 기능 + 현재 브랜치를 생성된 브랜치로 바꾼다.

    • Test라는 branch가 생성된 것을 확인할 수 있다. 이 브랜치는 `irq-test` 브랜치를 카피한다. 

     

    : git branch : 로컬 저장소의 git branch들을 보여준다(원격 저장소의 브랜치들은 보여주지 않는다). 현재 어떤 브랜치가 HEAD가 바라보는 브랜치인지도 알려준다. 

    • 아래의 사진은 `git branch` 명령어로 2개의 브랜치(irq-test, master)를 확인할 수 있다. 그리고 와일드 카드(*)가 체크되어 있는 것은 현재 actived branch를 의미한다. 

     

    : git branch -r : 원격 저장소의 branch들을 보여준다. 

    • 아래의 왼쪽 사진은 github에서 https://github.com/yohda/rpi3-mb-test.git 에 branch가 master밖에 없는 것을 보여주고, 오른쪽 사진은 커맨드 명령어인 `git branch -r`로 원격 저장소가 `origin/master`밖에 없는 것을 보여준다 

    : git branch -d [ local branch ] : 로컬저장소의 branch를 삭제한다. 원격 저장소는 삭제하지 않는다. 

    : git branch -a : 로컬과 원격 브랜치 모두를 보여준다.

    • remote/origin/master는 원격 브랜치를 의미한다.  

    : git push [ remote repository ] --delete [ remote branch ] : 원격 저장소의 원격 브랜치를 삭제한다. 

    : git push [ remote repository ] [ local branch ] : 입력한 원격 저장소에 입력한 원격 브랜치를 생성한다. 

    • `git push origin irq-test`를 통해서 원격 저장소(origin)에 `origin/irq-test`라는 원격 브랜치가 생성된 것을 확인할 수 있다. 
    • 만약, irq-yohda 라고 원격 브랜치를 만들고 싶다면, `git push origin irq-tes:irq-yohda` 라고 하면 된다.  

     

    : git branch -u [ remote repository ]/[remote branch] [ local branch ] : 현재 로컬 브랜치를 원격 저장소의 원격 브랜치에 연결한다. 근데 케이스를 2가지로 나눠질 수 있다.

    • 로컬 브랜치 이름 == 원격 브랜치 이름 : git push 와 git pull 모두 인자 없이 사용 가능. 
    • 로컬 브랜치 이름 != 원격 브랜치 이름 : git pull만 인자 없이 사용 가능. 기본적으로 git은 `git push`시에 로컬 브랜치와 원격 브랜치의 이름을 동일시하게 놓기 때문인 것 같다. 
    • 여기서 위의 명령어를 쳣을 때, 어떤 로컬 브랜치가 어떤 원격 브랜치에 연결됬는지 알 수가 있다. 
    • git remote show [ remote repository ] : 
      • `git branch -u`를 사용하면,  `Local branch configured for 'git pull'`에 추가된다. 해석은 다음과 같다. 
        • irq-test merges with remote main : 로컬 브랜치 irq-test에서 git pull 시, 원격 브랜치 origin/main에서 땡겨온다.    
        • main merges with remote main : 로컬 브랜치 main에서 git pull 시, 원격 브랜치 origin/main에서 땡겨온다.   
        • 가장 중요한 차이는 로컬 브랜치와 원격 브랜치의 이름이 동일한 경우 git push도 인자없이 가능하다는 것이다. 
    • git config --list : 
      • branch.[ local branch name ].remote , branch.[ local branch].merge로 확인이 가능하다. 
      • branch.[ local branch name ].remote : 원격 저장소 이름 
      • branch.[ local branch name ].merge : 원격 브랜치 이름 
    • .git/config : 
      • 위의 `git config --list`와 동일하므로, 생략한다. 

    : git branch –unset-upstream : 현재 HEAD가 가리키는 로컬 브랜치의 원격 추적 브랜치를 모두 제거한다. 그래서 `git config –list`, `.git/config`, `git remote show [ remote repository ]`에서 볼 수 있는 추적 내용이 삭제 된 것을 확인할 수 있다. 

    : git branch –m [ branch ] : 현재 branch을 바꾼다.

    • `test` 브랜치가 `main` 브랜치로 바뀐것을 볼 수 있다. 

     

    - git log 

    - git log --branches : 현재 모든 로컬 및 원격 브랜치들이 어느 커밋을 바라보고 있는지 조회한다. 결과적으로, 원격 서버의 최신으로 커밋된 내용들을 모두 보여준다. `git commit` 혹 `git push` 전에 이 명령어를 확인해서 소스를 최신으로 해야 하는지 등을 알 수 있다. 앞에 origin/* 이라고 붙은 브랜치들은 원격 브랜치이다.

     

     

    - git log --branches –graph : 그래프 형태로 모든 브랜치들을 함께 보여준다.

     

    - git log [ file ] : 입력한 파일이 커밋된 commit 들을 보여준다.  

     

    - git log --oneline -n : 한줄로 요약된 commit id들을 최신순으로 n개 보여준다.  

     

    - git log ${branch} : 해당 branch 의 원격 및 로컬의 모든 git log 를 보여준다.

     

     

     

    - git stash

    - git stash | git stash save : 현재 branch의 working area와 staging area의 파일들을 현재 branch의 stack에 푸쉬한다. git status시, 변경 사항들이 보이지 않게 됨.

     

    - git stash list : 현재 branch에서  git stash한 stack index들을 보여준다. 즉, 얼마나 git stash한 내용들이 있는지 조회. 

     

    - git stash show [ stack index ] : stack index의 저장된 git stash한 내용들을 보여준다. 

     

    - git stash show -p [ stack index ]현재 branch에서 이전에 git stash한 내역들을 자세하게 보여준다. 

     

    : git stash pop : stack에서 현재 작업 디렉토리로 내용을 꺼내 오면서 stack에서 해당 내용을 삭제한다.
    : git stash apply : stack에서 현재 작업 디렉토리로 내용을 꺼내 오면서 stack에서 해당 내용을 삭제하지 않는다. 
    : git stash drop : 현재 branch에서  git stash한 가장 최신 stack 데이터를 지운다.
    : git stash drop [ stack index ] : 현재 branch에서  git stash한 stack index와 맵핑되는 데이터를 지운다.
    : git stash clear : 현재 branch에서  git stash한 stack에 쌓인 데이터들을 모두 삭제한다. 

     

     

     

    - git status 관련 명령어 

    - git status -uno : git status 는 기본적으로 untracked files까지 다 보여준다. 그러나,  `-uno` 옵션을 붙이면, untracked files 들을 보여주지 않는다. `-u`의 u 가 untracked files 의 약자이다. 거기에 no 를 붙이니 untracked files 들은 보여주지 않는다가 된다.

     

    - git status [ file_type ] : 특정 파일 타입들만 보여준다. 예를 들어, `git status *.c` 을 입력하면 *.c 파일만 보여준다.

     

     

    - git status --ignored : 기본적으로 git status 는 .gitignore에 적용되는 파일들은 보여주지 않는다. 그러나 `--ignored` 명령어를 사용하면 무시되는 파일들까지 전부 보여준다. 

     
     

    - 그 외의 명령어 

    • git show [ commit id ] - commit id  수정한 내용들을 보여준다.
      • git show --name-only [ commit id ] - commit 에 적용된 파일들의 이름만 보여준다.
    • git push 
    • git pull 
    • commit 관련 명령어 
      • git commit -m [ Message ] - staging area 있는 파일들을 Repository(여기서 repository local store 의미한다) 이동시킨다. 
      • git commit --amend : 로컬 저장소에 커밋된 가장 최신 메세지를 수정할 수 있다. 원격 저장소에 이미 커밋이 되었다면 아주 복잡해진다... 
    • git checkout -f [ file ] - 입력된 file 가장 최신에 commit 파일로 바꾼다 
    • git check-ignore [ file ]  - 인자로  파일이 .gitignore 적용되는지 알려준다만약 .gitignore *.txt , *.o, *.pyc  있다고 예를 들면 
      • git check-ignore build_ds.pyc build.sh 
      • build_ds.pyc 
      • 위처럼 .gitignore 적용되는 파일들은 출력이 된다 
    • git rm [ files & dir ] - 원격 저장소와 로컬 저장소에 있는 파일  폴더를 삭제한다. 
    • git rm --cached [ files & dir ]  - 원격 저장소에 있는 파일을 삭제한다. 로컬 저장소에 있는 파일은 삭제하지 않는다. 

    '프로젝트 > 운영체제 만들기' 카테고리의 다른 글

    크로스 컴파일[작성중]  (0) 2023.06.03
    GCC[작성중]  (0) 2023.06.02
    메모리 맵  (0) 2023.06.01
    커널 이미지  (0) 2023.05.31
    페이징  (0) 2023.05.30
Designed by Tistory.