Git

개발을 하다보면 발생할 수 밖에 없는 수많은 버전의 코드들, 변경사항, 백업파일 등등.
이런 소스 코드들을 관리하기 위해 만들어진 대표적인 분산형 버전관리(VCS:Version Control System) 시스템이다.

리누즈 토발즈라는 리눅스 개발자가 2주만에 만들었다는데, 사실 리눅스도 대학생때 본인이 사용하는 컴퓨터에서 돌아갈 수 있는 운영체제를 심심해서 뚝딱 만든 것이라고 함. 그리고 리눅스는 현재 많은 컴퓨터 운영체제, 서버, android나 ios, 각종 임베디드 기기에서 돌아가는 운영체제이기도 하다. 여기서 맥은 리눅스의 먼 후손(?)같은 느낌이고, 윈도우는 노선이 좀 다른듯. (그래서 개발을 맥북으로 하는게 편하다는 걸까...?)


Github

git은 버전을 관리하는 하나의 프로그램 일 뿐, 소스 코드를 저장하고 관리할 원격 저장소가 필요하다. 그 역할을 하는것이 바로 github 인 것.

외에 코드 저장소로서 비슷한 서비스를 제공하는 Bitbucket, GitLab 등 도 있다.





Git 설치하기

  1. 공식 사이트(https://git-scm.com/)에서 git을 다운로드(Download for Windows/Download for Mac) 하고

  2. 다음의 명령어로 설치된 깃 버전(-v, version)을 확인한다.

    $ git -v

  1. 정상적으로 버전이 확인되면 다음의 명령어로 초기 환경설정을 해준다.

    $ git config --global user.name "깃헙유저네임"
    $ git config --global user.email "깃헙(계정)메일주소"
    $ git config --global core.editor "vim"
    $ git config --global core.pager "cat"

*잘 등록됐는지 확인하고 싶으면 $ git config --list 로 확인하기


  1. https://gist.github.com/johanmeiring/3002458 이 페이지로 이동해서 lg alias도 설정해준다. 수정이 필요한 경우 $ vi ~/.gitconfig 에서 수정 가능하다.




Git bash

커맨드 라인 인터페이스(CLI)의 형식을 가진 명령어 처리기로, 우리가 키보드로 입력한 명령어를 운영체제로 전달하여 명령을 실행할 수 있도록 중간 다리 역할을 해주는 도구이다.

사전적 의미로는 Bourne Again Shell의 줄임말. Steve Bourne 이라는 사람이 개발한 최초의 유닉스 쉘 프로그램(sh)의 확장판 이라는 의미. (쉘은 커맨드 라인 인터페이스를 구현한 대표적인 프로그램)


*우리가 Git bash를 사용하는 이유

개발자는 마우스를 움직여 클릭하는 방식의 GUI인터페이스가 요청할 수 없는 작업(개발 환경이나 서버 관리 등)을 해야한다. 이를 위해 윈도우는 cmd, 리눅스와 맥은 terminal을 사용하는데 운영체제마다 명령어가 다르다는 문제가 있다. 이때 윈도우사용자는 리눅스 명령어를 사용할 수 있게 해주는 git bash를 사용하면 편리하다!





Git bash 사용하기

CLI Shell command

  • cd {Documents/} : {Documents} 디렉토리 안으로 이동
  • mkdir {dirname} : (make directory) 디렉토리 생성
  • cd .. : 상위 디렉토리로 이동
  • pwd : 현재 디렉토리 경로를 루트 경로부터 보여줌
  • ls :
  • touch {readme.md} : 파일{readme.md} 생성
  • mv {readme.md} {bin/} : (move) 파일을 특정 위치{bin/}로 옮기기
  • mv {readme.md} {./README.txt} : 파일명{readme.md}을 변경{README.txt로}
    (./는 현재위치를 나타냄. 같은 폴더에서 디렉토리 이동을 하는 경우 이름을 변경하는 효과가 있음)
  • mv {dir1} {dir2} : 디렉토리{dir1}의 이름을 디렉토리{dir2}로 변경
  • cp {readme.md} {bin/} : (copy) 파일 복사해서 디렉토리(bin/)에 붙여넣기
  • rm {README.txt} : (remove) 파일(README.txt)을 삭제
  • rm -rf {bin/} : {bin/} 폴더 삭제

  • cat {readme.md} : {readme.md} 파일 내용을 출력하기
    *CLI에서 파일 내용을 단순 출력해서 확인할 때 사용되는 명령어.

  • vi readme.md : vim으로 파일(readme.md) 열기
    *vim : CLI기반의 텍스트 편집기. 여러가지 모드와 플러그인 등을 통해 원하는 개발환경을 구성할 수 있음


Vim command

  • i : insert mode
  • v : visual mode
  • ESC : normal mode로 돌아가기
  • d : 삭제
  • dd : 한 줄 삭제
  • dd(지우고싶은줄수)j : (지우고 싶은 줄 수) 만큼 한번에 삭제
  • :q : quit. 편집 그만하고 편집기 닫음
  • :q! : 변경사항 저장 없이 강제 종료
  • :w : 현재 내용 저장
  • :wq : write and quit. 저장하고 종료
  • :{number} : 해당 {number} 입력하고 엔터로 해당 위치로 커서이동




Github Repository 만들고 연결하기

git repo를 만드는 방법은 두가지가 있다.

  1. 깃허브 사이트 로그인 후 본인의 대시보드에서 new repository 로 repo를 만든다.

    생성한 repo의 주소를 복사해서 clone 한다.
    $ git clone {repo address}

  1. CLI 명령어로 만드는 것과 동시에 등록(push -u origin main)한다.

    $ mkdir {repo} && cd {repo}				👉 {my-repo}폴더를 만들고 디렉토리 이동
    $ git init									👉 git 저장소(repo)를 생성(초기화)
    $ git remote add origin https://github.com/{username}/{reponame}.git	👉 깃헙 원격 저장소에 origin 등록하고 설정
    $ touch README.md							👉 REDAME.md 파일 생성
    $ git add README.md							👉 수정사항 add로 staging
    $ git commit -m "docs: Create README.md"	👉 커밋 생성. -m 은 커밋 메세지를 바로 적용하는 옵션(이지만 사용은 추천하지X)
    $ git push -u origin main					👉 원격 저장소 main에 push




Github에 코드가 반영되기까지

repo를 만들고 열심히 코드를 적었다. 이것을 원격저장소에 저장하고 싶은데, 그전에 거치는 단계가 있다. 우리가 작업하는 로컬의 프로젝트 디렉토리를 Working Directory라고 한다면,

working directory(local)

Staging Area(index에 기록한다고 표현하기도 함)

Repository(remote, origin)

바로 Staging Area가 그것인데, 작성한 내용을 $git add 로 Staging 할 수 있다. 그렇게 Staging 된 상태의 파일들을 커밋$ git commit하고 난뒤 push하면 원격 저장소(repo)에 올라가는 것이다.

굳이 Staging 이라는 작업을 하는 이유가 뭘까 궁금해서 찾아봤는데, 다음과 같은 이유가 있다고 한다.

$ git add$ git commit 해야 하는 것 잊지말자.



.gitignore 와 .gitattributes

.gitignore

git이 추적할 필요 없는 파일을 명시한다.
로컬에서 나만 사용하는 환경설정 파일이나 중요한 데이터가 들어있는 파일 등은 git이 추적할 필요도 없고 다른 파일들과 같이 저장소에 업로드 되서도 안된다. git이 무시할 수 있도록 .gitignore 파일에 적어주자.

예시 - 특정파일 추적을 하고 싶지 않을 경우

*.java
*.py

.gitattribute

github에서 팀 프로젝트를 할 때, pull로 팀 repo를 끌어올 것 이다. 이때 파일별로 필터를 걸거나, 파일별로 merge 전략을 다르게 설정해서 환경설정 파일에 적용할 때 사용한다.

예시 - 파일단위, 디렉토리 별 다른 설정을 부여하고 싶을 경우

# Avoid conflicts in pbxproj files
*.pbxproj binary merge=union
# Always diff strings files as text
*.strings text diff




참고

https://parkjh7764.tistory.com/39
https://www.liquidweb.com/kb/basic-bash-shell-commands-a-cli-tutorial/
https://pers0n4.io/github-remote-repository-and-upstream/
https://iseunghan.tistory.com/322#Staging%20Area

profile
매일 조금씩 나아가는중

0개의 댓글