▸인프라/Git & Github

Git 으로 로컬 저장소에 프로젝트 업로드 및 되돌리기

코데방 2020. 2. 24.
728x90

[ Git Bash ]

  • 리눅스 기반의 명령어 수행을 위한 콘솔 프로그램
  • 리눅스 쉘(shell)과 같음 (MAC에서도 리눅스 쉘 기반으로 사용함)

 

윈도우 명령어 기반의 Git CMD도 제공되긴 하지만 대부분 Bash를 사용하기 때문에 정보가 많습니다. 아래와 같이 생긴 콘솔(쉘)입니다.

 

  • [사용자]@[컴퓨터이름] [Bash이름] ~ [현재위치]

 

 


 

 

[ 기본 명령어 ]

  • cd : 폴더 이동
  • mkdir : 폴더 생성
  • touch 파일이름 : 파일 생성 (빈 파일 생성)
  • ls : 현재 위치의 파일 및 폴더 보기
  • clear : 콘솔 창의 내용을 클리어해줌
  • git status : 현재 저장소 현황 보기
  • [Shift + Insert] : 붙여넣기 (Ctrl + v 안됨)

 

[ Git 사용자 등록 ]

  • 이메일 등록 : git config --global user.email "이메일주소"
  • 이름 등록 : git config --global user.name "이름"
  • config 정보 확인 : git config --list

처음할 때만 등록해주면 됩니다. 깃허브의 연동과는 상관없는 사용자 정보입니다. 됐으면 됐다라고 말을 해줘야 할텐데 아무 반응도 없습니다. ㅎㅎ 무소식이 희소식..이지만 확인을 한번 해보면 정상 등록돼 있는 것을 확인할 수 있습니다. 

 

 

 

혹시 삭제하고 싶으면 아래 명령어로 삭제하면 됩니다.

  • 사용자 이메일 삭제 : git config --unset user.email
  • 사용자 이름 삭제 : git config --unset user.name
  • 글로벌 사용자 이메일 삭제 : git config --unset --global user.email
  • 글로벌 사용자 이름 삭제 : git config --unset --global user.name

 

 

[ 로컬 저장소(Repository) 생성과 삭제 ]

  • 지정할 폴더에서 git init

가장 먼저 로컬에 소스코드를 저장할 저장소를 생성합니다. 저장소가 따로 생성되는 것이 아니라 미리 만들어둔 폴더를 저장소로 지정하는 것입니다. 저는 프로젝트 전체를 관리할 예정이므로 프로젝트 폴더를 저장소로 지정하겠습니다. 

 

먼저 cd 명령어로 저장소로 만들 폴더의 위치까지 들어갑니다. 윈도우에서는 경로표시에 역슬레시(\)를 사용하는데 bash에서는 슬레시(/)를 사용합니다. 탐색기에서 복사해서 가져오면 역슬레시라서 안들어가집니다. 저장소로 설정된 폴더는 뒤에 (master) 또는 (branch) 라는 표식이 붙습니다. branch의 개념은 따로 다루도록 하겠습니다.

 

 

지정한 저장소를 해제하기 위한 명령어는 따로 없다고 합니다. 그냥 탐색기에 들어가서 해당 폴더에 숨김 폴더로 생성되는 ".git" 폴더를 지워버리면 됩니다.

 

 


 

 

[ 프로젝트 폴더 업로드(커밋) 하기 ]

  • git add 옵션(또는 파일명)
  • git commit -m "현재 커밋에 대한 설명(메모)"

이제 저장소가 생성됐으니 프로젝트 소스코드를 업로드하겠습니다. 물론 개별 파일도 무방합니다. 로컬 저장소에 업로드 하는 과정은 2단계를 거칩니다.

 

1. add를 해서 로컬 저장소에 업로드할 파일 및 폴더를 추가해준다.

2. commit을 해서 로컬 저장소에 실제로 업로드를 한다. 

 

add를 하게 되면 업로드 대상 파일(폴더)이 스테이징 영역이라는 가상의 공간에 먼저 업로드 됩니다. 그리고 나서 commit을 하게 되면 실제 저장소에 업로드되어 해당 시점의 기록이 스냅샷으로 저장됩니다. 변경사항을 확인할 수도 있고 commit 한 시점으로 되돌아갈 수도 있습니다. 세이브 포인트라고 생각하면 됩니다.

 

"git add ." 또는 "git add -A" 명령어는 현재 폴더 내에 있는 모든 폴더와 파일을 대상으로 지정(스테이징에 업로드)하겠다는 의미입니다.

 

 


 

 

[ 변경 사항에 대해 추가로 커밋 시점 만들기 ]

  • 변경 사항 검색 : git status

위에서 커밋한 포인트로 잘 돌아가는지 확인하기 위해 루트 폴더에 테스트 파일을 하나 생성합니다.

 

 

그리고 현재 저장소의 현황을 보는 "git status" 명령어를 입력하면 아래와 같이 생성한 파일이 빨간색으로 뜨고 있습니다. 빨간색은 Commit한 시점과 달라진 파일과 폴더를 의미합니다. 내용(소스코드 등)을 한글자라도 변경해도 빨간색으로 뜹니다. 그리고 이 변경된 파일을 add해주지 않았을 때 빨간색으로 뜹니다.

 

 

일단 이 파일을 add해주면 초록색이 됩니다. 커밋 준비가 됐다는 뜻입니다.

 

 

커밋을 하면 "working tree clean"이라는 문구가 뜹니다. 마지막 커밋 시점의 내용과 현재 프로젝트 폴더 내의 내용이 완전히 같아서 더 이상 커밋할 것이 없는 뜻입니다. 

 

 


 

 

[ 특정 커밋 시점으로 되돌아가기 ]

  • 커밋 목록 보기 : git log --oneline
  • 실제 폴더/파일을 커밋된 시점으로 되돌리기 : git reset --hard 커밋ID
  • 가장 최신 커밋(Head)시점을 해당 커밋으로 이동시키기 : git reset --soft 커밋ID

이제 수행된 커밋들을 찾아서 "test.txt"가 추가되기 전으로 되돌아가보겠습니다. "git log --oneline" 명령어를 입력하면 커밋의 ID와 입력한 메모들을 볼 수 있습니다. 순서는 시간 순서대로 아래에서 위로 올라갑니다. 변경된 파일들의 내용까지 모두 되돌릴 것이므로 옵션은 'hard'로 줍니다.

 

실제 파일이 지워진 것을 확인할 수 있습니다. 파일이 생기고 지워지는 것뿐 아니라, 파일 안에 변경된 내용까지 모두 되돌아갑니다. 소스코드도 해당 시점으로 돌아가게 됩니다.

 

 

 

reset 명령어의 --soft 옵션은 실제로 되돌아가는게 아니라 특정 시점 이후의 커밋 내용을 목록에서 안보이게 하는 것입니다. 커밋할 때 생기는 스냅샷 파일들은 일종의 연결리스트같이 엮여 있기 때문에, 중간에 있는 커밋을 reset(hard, soft 등 모두)하게 되면 그 이후에 커밋했던 내용도 목록에서 지워집니다. 매번 풀백업을 하는게 아니라 증분백업 형태로 변경된 부분만 계속 저장해 나가기 때문입니다. 백업 솔루션 등에서 많이 사용되는 방식입니다. 

 

실제로 내부 로직은 더 복잡하겠지만 단순화하면 아래와 같은 방식으로 동작합니다. reset하면 그 이후의 커밋은 목록에서는 사라져 보이지만 삭제되지 않기 때문에 복구할 수도 있습니다. 여러 기능을 하는 다른 옵션들이 많은데 천천히 추가로 정리해나가도록 하겠습니다. 

 

 

 

 

 

 

예시로 다시 "test.txt" 파일을 만든 후 커밋을 한 뒤, 'reset --soft' 명령을 실행해보면 커밋시점은 사라졌지만 해당 파일은 그대로 있는 것을 확인할 수 있습니다.

 

 

 

만약 위에서 'test.txt' 파일을 생성한 뒤 Commit하지 않고 Reset 했다면 파일은 지워지지 않습니다. 커밋하지 않았다는 것은 변경 사항이 저장되지 않았다는 것이기 때문에 새로 생성된 내용은 롤백(reset) 대상에서 제외되기 때문입니다.

728x90

댓글

💲 추천 글