자주 쓰이는 터미널 명령어, Git 명령어
시간이 난 김에 생소한 터미널 명령어들과, git 명령어들을 한 포스팅으로 모아보기로 했다.
CLI를 쓰면, GUI로 해오던 과정을 모두 터미널에서 해결할 수 있다. CLI, GUI 두 가지 인터페이스로 하나의 동일한 컴퓨터를 다룰 수 있는 것이다.
CLI : Command Line Interface 커맨드 라인 인터페이스
Prompt프롬프트: 키보드의 입력을 확인하고 편집할 수 있는 한 줄의 공간
기초 터미널 명령어
cd //폴더 내부로 진입하기
touch //파일 생성하기(폴더X)
pwd //print working directory. 현재 폴더가 위치한 경로를 알아보기
mkdir //새 폴더 생성
ls //특정 폴더 내에 포함된 파일 혹은 폴더 확인
ls -a //숨김 폴더나 파일까지 포함하는 all 항목을 출력
ls -la or ls -al //파일의 포맷까지 함께 출력. d로 시작하면 폴더, -로 시작하면 파일이다.
ls -l //생성자가 사용자인지 관리자인지 파악할 수 있다.
cat //파일 내용을 터미널에서 확인하기
rm //파일 삭제
rm -rf //(recursive force)폴더 삭제
cp 원본파일이름 복사할파일이름 //파일 복제
cp -rf 원본파일이름 복사할파일이름 //폴더 복제
mv 폴더나파일이름 도착폴더이름 //파일과 폴더 옮기기
mv 변경할폴더나파일이름 변경하고자하는이름 //파일명 바꾸기
whoami //현재 로그인 된 사용자를 알 수 있다.
sudo //사용자가 관리자 권한을 획득한다.
- CLI에서 삭제된 파일은 휴지통에 머무르지 않고 즉시 삭제된다.
자주 쓰이는 Git 명령어들
git init: 이전까지 git에게 버전 관리를 맡기지 않던(git 폴더가 존재하지 않던)디렉토리를 앞으로 git의 관리 하에 두겠다는 선언이다. 처음 이 init을 해주고 나면, 해당 폴더 내부에 저절로 .git이라는 폴더가 생기고 앞으로 발생하는 변화를 추적하며 관리해준다.
git clone: git clone <주소> 는 원격 저장소 파일을 작업하기 위해 가지고 오는 명령어이다. main 브런치(master)를 자동으로 가져온다. 주소는 github에서 HTTPS, SSH 두 가지 방식으로 갖고 올 수 있는데, SSH 키를 등록한 상태라면 매번 인증할 필요 없는 SSH주소를 쓰는 것이 편리하다. HTTPS는 push pull할 때마다 이름과 비밀번호를 쳐야 한다.
git add: work tree에서 작성한 문서들 중에서 달라진 부분을 staging로 옮긴다. git add .을 하면 바뀐 부분을 전부 넘기는 거고 git add <filename>으로 원하는 file만 지정하여 넘기기도 가능하다.
git commit -m "변경부분": add 이후 statging에 쌓여 있던 변경사항들을 repository로 옮겨내기 전에 이름표를 붙여주는 과정.
git push origin master / main : push를 통해 commit 까지 끝난 부분들을 원격 레파지토리로 올려준다. 예전엔 default branch, 즉 기본 브런치를 master로 썼는데, 이 단어가 인종차별 혹은 노예제를 연상시킨다는 의견을 받아들여 main으로 바뀌었다. 깃의 레파지토리에서 기본 브런치가 main으로 저장되고 있는지 master로 저장되고 있는지 확인하고 알맞게 푸시해서 올려준다. 변경된 사항들만 commit으로 달아준 태그를 달고서 올라간 것을 볼 수 있다. 수시로 push 해주면 중간 사항들을 쉽게 저장할 수 있으며 관리하기도 쉬워진다.
현재 브랜치가 master인데 main으로 바꾸고 싶다면? -> git branch -M main 명령어로 main 브랜치로 바꾸어 주면 된다.
git pull <원격 저장소명> <branch명> vs git fetch <remote> : 원격 레파지토리에서 로컬 레파지토리로 파일 소스를 가져오는 명령어. pull은 가져오면서 해당 소스가 내가 작업하던 소스보다 최신일시 merge 까지 해준다.(내용을 업데이트해서 반영한다고 보면 된다. 즉 파일을 끌어오며 새 버전으로 내용이 바뀐다.) 반면, fetch는 소스만 가져올 뿐 merge를 하지 않는다.
git branch 브랜치명: 새 브랜치를 생성한다. 새 브랜치는 기반이 되는 부모 브랜치를 그대로 복사해간다. commit log도 부모 브랜치와 같지만, 새 브랜치에 작업하는 내용은 master(main)브랜치에는 반영되지 않는다. 후에 merge를 통해 변경 사항을 받아들일 수 있다.
git checkout -b 브랜치명 : 새로 만들 브랜치를 생성하고, 동시에 그 브랜치로 이동한다.
git branch: 현재 존재하는 브랜치 목록을 볼 수 있다.
git push origin 브랜치명: 다른 브랜치로 push하고 싶을 때!
git status : git add . 까지만 하면 무엇이 staging으로 넘어갔는지 터미널에 나오지 않는다. 따라서 git status를 통해 현재 넘어가 있는(그러나 아직 push되지 않은)파일들을 모아서 볼 수 있다.
git log: git log를 쓰면 지금까지 commit 된 부분들을 시간 순서대로 보여준다.
Q. 누구나(사실 내가)가질 수 있는 소소한 git 질문들
1. branch를 메인 branch에 반영하는 방법은 뭐지?
- git pull origin 브랜치명을 쓰면 된다. pull 명령어는 merge까지 이루어지므로 새로 바뀐 내용도 포함된다.
2. 기능을 끝내고 merge까지 된 브랜치는 어떻게 할까?
- 삭제하는 것이 편하다. git branch -D 브랜치명으로 쉽게 삭제가능하다. 물론, github의 remote repository에는 기록이 죽 남아 있기 때문에 나중에 필요하다면 복구 가능하다. 기록을 완벽하게 지우고 싶다면 github에 들어가서 지워줘야 한다.
3. 충돌conflict은 무엇인가?
- 서로 다른 브랜치의 동일한 파일, 같은 부분에, 다른 내용이 있다는 의미이다. 서로 다른 사람이 같은 구간을 작업했을때 merge 하는 중에 충돌이 발생한다. 사용자는 어떤 branch의 내용을 선택할지 정하고, 충돌이 일어난 부분을 일일이 지워 확인해야 한다. 말만 들어도 귀찮은 일이기 때문에 작업 내용이 겹치지 않게 사전에 주의하는 편이 좋다.
<자세한 conflict 해결법을 알고 싶다면, 출처: https://victorydntmd.tistory.com/78 >
4. git.stash 명령어는 무엇에 쓰는가?
아직 마무리하지 않은 작업을, 스택이라는 저장소에 잠시 저장해두도록 하는 명령어이다. 주로 막 작업하던 것을 두고 잠깐 다른 브랜치로 이동해서 급한 작업부터 진행해야 하는 상황에, 기존 작업을 commit 하기는 싫은 상황에서 사용된다. 나중에 아직 완료되지 않은 작업을 불러와서 다시 작업할 수 있다.
git stash apply, 혹은 git stash apply --index 로 다시 가져올 수 있다. 다만 스택에 저장해둔 stash는 apply를 사용하여 불러온다고 해서 사라지지 않기 때문에, git stash drop로 삭제할 수 있다.
TIP! apply와 drop을 차례로 적용하기 귀찮다면 git stash pop으로 불러옴과 동시에 삭제 가능하다.
5. .gitignore은 대체 뭐지?
git은 이 내부에 기록된, 추적하지 말아야 하는 폴더나 파일들을 전부 무시해준다. 중요한 API키나 비밀번호, 개인정보, github에 올라가서 모두에게 공유되어서는 안 되는 정보들은 gitignore에 넣어 직접 올리지 않도록 해야 한다. github 측에서도 개인 정보가 무방비하게 올라와 있을 시, 간혹 계정을 정지시키는 상황이 발생한다고 한다. 조심해야 하는 이유!
- 주의할 점:
1. add나 commit로 이미 staging이나 레파지토리에 올라간 파일들은 바로 gitignore 되지 않는다. 따라서 이 경우엔 먼저 git에서 제거해주는 과정이 필요하다.
2. .gitignore파일은 프로젝트 디렉토리의 최상단에 위치해야 한다.
아래 페이지에서 쉽게 gitignore 파일을 작성할 수 있다.
https://www.toptal.com/developers/gitignore
gitignore.io
Create useful .gitignore files for your project
www.toptal.com
ERROR! 경험해 본 git error
작업을 마친 뒤 git add로 파일을 올리려 했는데, 아무리 add . 와 push까지 해도 레파지토리에 반영되지 않는 일이 발생했다. 왜 이런 일이 일어났을까?
-> 최상위 폴더가 아닌 하위 폴더에 .git 폴더가 존재할 시에 이런 에러가 발생할 수 있다! .git 폴더 위치를 잘 파악해야 한다. 그 하위폴더에도 똑같이 .git이 있을 시(잘 안된다고 init를 여러 번 시도하다보면 충분히 그럴 수 있다. 경험담...)하위의 .git폴더를 삭제해주면 문제 해결. 이외에도 처음부터 branch를 엉뚱한 곳에 두고 작업을 push 하고 있을 수 있으니(경험담2), branch를 여러 개 쓰는 상황이라면 꼭 확인을 잘 하며 올리도록 하자.