Git & Github

루시Soo의 우와한 서재·2021년 7월 27일
0

Git Setup

Connect between Git and Github

Basic Git Commands

How to backtrack in Git

Backtrack Git Commands

Git Branch

Branch Commands

Git Remote

Remote Commands



Git Setup

installation

  • Mac이나 Windows 사용자의 경우 - 라즈베리파이 공식홈페이지 설명 참조 여기

  • Linux 사용자의 경우 - Terminal의 package manager를 통해 설치 가능 sudo apt install git

  • 파이 사용자의 경우 - 이미 설치되어 있으므로 따로 설치할 필요가 없음. config setup 진행

config setup

  1. Git에게 사용자 정보를 알려주기

  2. Git에게 어떤 editor를 사용할지 알려주기

참조

https://projects.raspberrypi.org/en/projects/getting-started-with-git


처음으로


Connect between Git and Github

How to

0. 준비사항 - 사용하는 컴퓨터에 git이 install과 config가 되어있어야한다 ( Git Setup 참조 )

  1. 터미널 또는 File Explorer(윈도우) 등을 이용해서 원하는 위치에 directory를 생성

  2. 생성한 directory 안에 미리 index.html이나 README.md정도 파일을 만들어 두자

  3. 터미널로 생성한 새 directory위치에서 git init

  4. 미리 생성한 파일 git add filenamegit commit -m "short message" 진행

  5. github.com에 로그인해서 새로운 repository생성
    tip) 새 repository에 이름을 부여할 때 my_github_username.github.io형식으로 하면 이것이 나의 github website 주소가 된다
    ( 같은 이름을 가진 복수의 repository는 불가능하므로 이 방법은 한 번만 사용 가능 )

  6. 생성한 repository remote 연결 - git remote add origin my_github_repository_address

나의 github repository address는 개인정보 상 username을 삭제함

나는 위 snippet에 나온 방법 중 두번째를 how to에 설명하였다


처음으로


Basic Git Commands


  • git init
    • syntax git init

    • working directory에 담기는 모든 파일을 github에 연결할 수 있도록 initialize

    • git init는 one-time operation이다


  • git status
    • syntax git status

    • staging area에 added된 파일의 현 상황을 알려준다


  • git add
    • syntax git add file_name
      op.) add 다음에 file_name말고 --all이나 . (dot)을 입력하면 모든 파일을 의미함
      op.) git add file_name1 file_name2 ...와 같이 복수의 파일도 가능

    • 파일의 추가, 삭제, 등등을 추적하기 위해서는 staging area에 파일을 add해야 한다


  • git diff
    • syntax git diff file_name

    • 파일A를 SA에 add한 후, WD에서 해당 파일A를 수정한 경우, SA 안의 파일A와 WD 안의 파일A사이에는 차이점이 생긴다. git diff는 이 차이점을 시각적으로 보여준다


  • git commit
    • syntax git commit -m "short message"
      op.) -m (follwed by a message)

        comit message 관습 (conventions)

      • quotation marks 안에 담겨야 한다
      • 현재형 문법으로 적어야 한다
      • 50자 내외로 짧게 적어야 한다
      • -m을 사용한다면 commit message는 SA에 영구적으로 저장된다

    • commit을 하게되면 git workflow wnd HEAD의 영역으로 넘어가는데 이는 github에 push되기 위한 마지막 과정이다


  • git log
    • syntax git log


    • Head의 commits들을 순차적으로 모두 보여준다

    • 전 version의 commit 돌아가기 위해 SHA code를 찾을 때 사용된다

    • output explanation:
      • 40자의 code( SHA )가 오렌지색으로 표시
      • 누가 작정자( author )인지 표시
      • commit 날짜가 표시
      • commit message가 표시

처음으로


How to backtrack in Git

  • Git이 제공하는 되돌리기 기능을 통해 프로젝트 진행 중 발생한 실수를 취소할 수 있다


Backtrack Git Commands

  • git show HEAD
    • syntax git show HEAD
      op.) HEAD를 --로 대체해서 작성하는 것도 가능하다??

    • 가장 최근에 HEAD area에 commit한 정보를 보여준다


  • git checkout HEAD
    • syntax git checkout HEAD filename
      op.) HEAD를 --로 대체해서 작성하는 것도 가능하다

    • 상황) commit한 후, WD에서 해당 파일의 작업을 더 진행하였다. 하지만 작업한 파일이 마음에 들지 않아 HEAD area에 commited된 파일 Version을 불러오고 싶은 경우 사용 가능하다

    • discards changes in the working directory


  • more git add
    • syntax git add filename_1 filename_2

    • 복수의 파일도 git add 가능하다

    • we can also backtarck files simulaneously if these files are in the same commit and the same branck.



  • git reset HEAD
    • syntaxgit reset HEAD filename
      op.) HEAD를 --로 대체해서 작성하는 것도 가능하다

    • 상황 만약 실수로 파일A에 새로운 lines를 추가한 후 git add를 진행하였다면 git reset HEAD로 되돌릴 수 있다

    • remove file changes from the staging area


  • git reset
    • syntax git reset commit_SHA
      exp.)commit_SHAgit log에서 확인할 수 있는데 이 중 SHA번호 앞의 7자리가 필요하다

    • 원하는 commit_SHA Version으로 되돌릴 수 있다


처음으로


Git Branch

  • 한명의 Git 사용자가 독립적으로 어떤 작업을 진행하기 위한 개념
    branch를 이용하면 project workflow를 쪼개서 다수의 feature-like projects를 진행하여 새로운 기능을 테스트한 후 main branch에 merge할 수 있다

  • 새로운 branch가 생성되면 main 안의 commit이 상속된다

  • 현재는 master branch가 아니라 main branch로 이름이 변경됨




Branch Commands

  • git branch Ⅰ
    • syntax git branch

    • Git 안의 모든 branch들의 정보와 함께 현재 나의 branch 위치를 알려준다


  • git branch Ⅱ
    • syntax git branch new-branch-name

    • 새로운 branch를 생성한다. 이름은 반드시 공백이 없어야 한다


  • git checkout
    • syntax git checkout branch-name

    • 현재 위치인 branch에서 다른 branch나 main으로 이동할 때 사용된다
      특히, git merge하기 위해선 main으로 이동해야하는데 이때 자주 사용된다


  • git merge
    • syntax git merge branch-name

    • branch들을 합칠 때 사용된다
      특히, main 위치에서 다른 branch를 합칠 때 자주 사용된다
      만약 main branch와 branch-name을 합치고 싶다면 메인으로 이동한 후 git merge를 실행한다


  • merge conflict Ⅰ
    • git merge하는 중에 발생하는 경우로 Git이 어떤 lines은 남기고 어떤건 삭제해야할지 모르는 경우 발생

    • 발생하는 경우
      • 합쳐질 두 개의 brnach들 사이에 상이한 lines이 있을 경우
      • 한 branch에서는 삭제된 lines이 다른 branch에서는 존재하는 경우

    • how to resolve
      1. git merge branch-name
      2. output된 confilic error message 확인
      3. 파일을 확인
        • 만약, Git conflict markings( such as <<< HEAD , >>> branch-name )가 보이면 원하지 않는 lines와 conflict markings를 지운다
        • conflict markings가 보이지 않으면 파일을 reopen한 후 위와 같이 진행
      4. 파일을 저장
      5. 터미널에서 해당파일을 git addgit commit


  • delete branch
    • syntax git branch -d branch-name

    • branch-name을 이름으로 가진 branch를 삭제


  • git push
    • single branch pushing syntax git push origin your_branch_name
      나의 local branches 중 하나의 branch를 Git Server( Github repository)에 push한다

    • all branches pushing syntax git push --all origin
      나의 모든 local branches를 Git Server에 push한다

    • 처음으로


      Git Remote

      • 많은 팀원들이 collaborator로서 어느 Github의 project를 공동으로 진행한다면 왕복 8차선의 교차로 신호등와 같은 체계적인 교통정리가 필요하다. Git remote를 이용하면 가능하지만 익숙해지기까지 알아야할 개념들이 좀 있다. 우선 시작하기 전에 몇가지 용어들을 정리해보자

        • remote branches : git clone remote_Location clone_name하면 current working 환경 안에 자동으로 두 개의 local directories가 생성되는데 이중에 project와 동일한 이름의 directory안에 저장된 local branches이다
          이 remote branches는 git 사용자가 수정하는 것이 불가하고 존재이유는 오로지 Github repository와의 network 통신( fetch나 merge 등 )을 위해서이다
          이 전반적인 개념을 remote라고 칭하고 경우에 따라 local remote라고 표기되기도 한다. remote의 main branch는 origin/main라고 하고 가장 최신의 commit을 포인터로 가르킨다. git fetch를 하면 remote는 업데이트되고 포인터는 GS에서 받아온 업데이트된 commit을 가르킨다

        • main branches : git clone에 의해서 생성된 두 개의 directory 중 사용자가 이름을 부여한 directory 안에 담긴, GS에서 복제된 branches를 말한다. 이중 main branch는 main이라고 부르고 역시 포인터도 이 main 가르키는 제일 최신 commit을 의미한다. 사용자의 작업은 여기서 이루어진다

        • Git server or Github repository : 여러명의 공동작업자를 둔, Github 안에 저장된 공용repository. 다른 작업자가 git push를 통해 해당 repository의 내용을 변경했다면 Git 사용자는 git fetch로 origin/main을 포함한 local remote branches를 업데이트해줘야 변경사항이 local에도 적용된다
          앞으로 간략하게 GS라고 표기하겠다

        • pointer : Git 사용자가 local computer에 git clone하면 Git은 자동으로 Git Server 안의 모든 data를 사용자의 local remote에 복제하고 pointer를 만드는데 이 pointer는 Github main branch의 가장 최신 commit과 clone한 직후에는 동일하다 ( 모든 data를 복제한다는 뜻은 commit정보도 복제한다는 의미이다. 자세한 사항은 뒤에나오는 remote workflow를 살펴보자) Git은 또한 사용자가 git clone을 통해 이름을 부여한 directory ( main )에도 같은 data를 복제하고 pointer도 생성한다


      • remote workflow

        • 참조사항
          • 뒤에 나올 사진들 중 master는 앞에서 말한 main branch를 의미한다

          • commit의 SHA번호를 의미하는 숫자는 가장 오른쪽에 위치한 SHA가 최신 commit을 의미한다. 화살표의 방향은 무시하자


        • git.ourcompany.com의 주소에 저장된 Github repository( 다른 말로 Git Server, 앞으로 GS라고 표기한다 )를 git clone을 이용하여 사용자 컴퓨터에 복제하였다. 상단의 Github main branch의 포인터뿐만 아니라 하단의 origin/main와 main branch도 모두 같은 SHA#를 가르키고 있다는 것을 알 수 있다



          사용자가 로컬컴퓨터에서 작업을하며 commit을 진행하고 있는 와중에 그림 상단에서 보듯이 다른 누군가 GS에 push를 진행하였다. 이제 Github 포인터는 190a3를 가르키고 나의 main은 893cf를 가르킨다. 그리고 origin/main은 아직도 f42c5에 머물러있다. 이처럼 git fetch를 진행하지 않으면 origin/main은 GS의 변경된 내용을 가져오지 못한다



          git fetch origin또는 git fetch를 실행하여 GS에 변경된 사항을 사용자의 local remote에 업데이트했다. 이제 origin/masin pointer는 GS pointer와 같은 SHA#를 가르킨다. 그리고 같은 local이지만 origin/main과 main은 다른 commit history를 가지게 된다



          만약 GS외에 이와 관련된 GS가 하나 더 있다면(git.team1.ourcompany.com에 저장됨)이 remote server도 사용자의 current working환경에 추가할 수 있다
          상단의 그림을 보면 git remote add wished_clone_name remote_location_in_url command를 이용한 것을 알 수 있다




          git fetch teamone을 통해 teamone remote server안의 update된 내용을 가져와 teamone/master(즉, teamone이라는 이름을 가진 새로운 remote)에 적용시켰다



      • 사용팁
        • git clone이나 git remote add한 후에는 꼭! git fetch를 진행하자

        • local remote에 git merge를 실행하기 전에도 꼭! git fetch한 후에 merge하고 git push하자

      처음으로



      Remote Commands

      • git clone
        • syntax git clone remote_location_in_url clone_name
        • remote_location : Git에게 어디서 remotes를 찾을 수 있는지 알려준다. web address나 filepath 등등
        • clone_name : clone을 생성할 directory의 이름 부여. 작업자는 이 directory에서 작업을 진행한다.



      • git remote -v
        • syntax git remote -v

        • 현재 git remote의 정보와 그것의 path와 함께 보여준다

        • remote의 이름은 수정도 가능하다


      • git fetch
        • syntax git fetch 또는 git fetch origin

        • local remote를 update해서 GS의 change를 적용시키는 것이다

        • fetch는 영어로 "가지고 오다"를 의미한다


    • git merge
      • sysntax git merge branch_name

      • braches들을 합치는 작업
        만약 main branch와 branch_name을 합치고 싶다면 메인으로 이동한 후 git merge를 실행한다

      • remote의 main branch와 합칠때는 꼭 remote의 main을 fetch해서 Github 안의 새로운 사항을 update한 후 실행하자


    • git push
      • syntax git push origin your_branch_name
        origin remote에 your_branch_name branch를 push하는 경우
        git push --all origin은 내 current working환경에 존재하는 main branch 포함 모든 branches를 push할 수 있다

      • syntax git push in_local_given_remote_name your_branch_name
        origin remote말고 다른 in_local_given_remote_name remote가 존재하고 거기에 push하는 경우

    • 참조

      http://blog.jinlaixu.net/books/ProGit/en/index.html


      처음으로

profile
그냥 끄적끄적 공부 정리 블로그

0개의 댓글