Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

iOS 개발일지

1014 새싹 70회차 정리 - Shell/Git 명령어 본문

SeSAC iOS 데뷔과정 2기

1014 새싹 70회차 정리 - Shell/Git 명령어

Lia's iOS 2022. 10. 14. 23:12
iOS 앱 개발자 데뷔 과정 70회차

 

 

 

 

#1. Shell

- Shell 이란?

커널은 운영체제의 core한 부분으로, 하드웨어/입출력/시스템 자원을 관리한다.

 

Shell은 사용자가 커널 (OS) 에 명령을 내릴 수 있는 명령어 해석기의 역할을 한다.

Shell의 종류는 다양하며, Bourne Shell, Bash, Z Shell 등이 존재한다.

MacOS는 Bash Shell을 사용했으나, MacOS 10.15 (Catalina) 부터 Z Sehll을 기본 Shell로 사용한다.

 

Terminal은 Shell에 명령을 입력할 수 있는 인터페이스 (프로그램) 이다.

터미널에 입력하는 각종 명령어는, 실제로는 Shell에 명령을 내리는 명령어이기 때문에 Shell 명령어라고 한다.

 

 

 

- Shell 명령어 정리

- pwd (Print Working Directory)

터미널에서 현재 디렉토리 경로 확인

pwd

 

 

- cd (Change Directory)

디렉토리 이동 시 사용하는 명령어 : cd 디렉토리명

cd /  #root 디렉토리로 이동
cd ~  #사용자 home 디렉토리로 이동
cd Desktop  #현재 경로에서 하위에 있는 Desktop 디렉토리로 이동
cd Desktop/sesac  #현재 경로에서 하위에 있는 Desktop 디렉토리의 하위 sesac 디렉토리로 이동
cd /Users/lia/Desktop  #현재 경로와 관계없이 절대경로로 이동
cd ..  #현재 디렉토리의 상위 디렉토리로 이동
cd ...  #현재 디렉토리의 상위 디렉토리의 상위 디렉토리로 이동

 

 

- ls (List)

현재 디렉토리의 파일과 하위 디렉토리의 리스트를 확인

# 현재 디렉토리 파일/디렉토리 조회
ls

# 현재 디렉토리의 숨김파일을 포함한 모든 파일/디렉토리 조회
ls -a
ls -l
ls -al

 

 

- mkdir (Make Directory)

디렉토리를 생성하는 명령어

-p 옵션 : 중간 디렉토리까지 자동으로 생성

mkdir test1  #현재 경로에 test1 디렉토리 생성
mkdir -p test1/test2/test3  #현재 경로에 test1 디렉토리를 생성하고 하위에 test2, 그 하위에 test3 생성

 

 

- touch

empty 파일을 생성해주는 명령어

touch .gitignore  #현재 디렉토리에 .gitignore 파일 생성

 

 

- echo

echo로 입력한 내용을 터미널에 출력하거나, 입력한 내용을 파일에 저장

echo $0  #시스템 변수 출력
echo aaa > a.txt  #a.txt 파일의 내용을 aaa로 덮어쓰기
echo bbb >> a.txt  #a.txt 파일의 마지막 라인에 bbb 추가

 

 

- cat (catenate)

파일의 내용을 터미널에 출력하는 명령어

cat .gitignore

 

 

- rm (remove)

파일이나 디렉토리를 삭제할 때 사용하는 명령어

22회차의 API Key 모아서 관리하기 (feat. gitignore) 에서도 비슷한 git 명령어를 사용한 적 있다.

-r 옵션 : 디렉토리를 삭제할 때 사용하는 옵션

-f 옵션 : 강제 삭제 옵션

rm filename.swift  #파일 삭제
rm -r directoryName  #디렉토리 삭제
rm -rf directoryName  #디렉토리 강제 삭제

 

 

- clear

터미널의 화면을 초기화시켜 깔끔하게 정리

clear

 

 

- history

사용자가 과거에 입력한 명령어를 보여주는 명령어

-c 옵션 : history 초기화

history  #과거에 입력한 명령어 확인
history -c  #history 초기화(전체 삭제)

 

 

 

- Git 명령어 정리

- git config

git config는 global 설정과 local 설정으로 나뉘며, local 설정이 우선 적용된다.

# 전체 프로젝트에 적용되는 글로벌 user 설정
git config --global user.name
git config --global user.email

# 개별 프로젝트에 적용되는 user 설정
git config user.name
git config user.email

# init branch가 main이 아니라 master로 나오는 경우, 아래의 명령어를 입력하면 다음부터 main으로 생성된다.
git config --global init.defaultBranch "main"

# config 설정 내용 확인
git config --global --list
git config --list

---------------------------------------------------------------------------------------

# vs code를 git editor로 지정
git config --global core.editor "code --wait"

# global 설정 변경
git config --global -e

# local(프로젝트 폴더) 설정 변경
git config --local -e

# alias(별칭) 설정 / 명령어에 띄어쓰기가 있는 경우 ''로 명령어를 감싸주어야 동작한다.
git config --global alias.별칭 명령어
git config --global alias.st status
git config --global alias.cm 'commit -am'

 

 

- git init

프로젝트 폴더에서 git을 처음 사용할 때, 최초 한번

git init

# Tip : git init 후 init(empty) commit 생성 (필수 X)
git commit --allow-empty -m "git init"

 

 

- git add

워킹 디렉토리에 있는 파일들을 스테이징 에리어 (index) 로 전환할 때

# 변경된 모든 파일을 스테이징 상태로 전환
git add .

# 변경된 특정 파일만 스테이징 상태로 전환
git add a.swift

 

 

- git commit

# 커밋 생성
git commit -m "message"

# 추가 커밋을 생성하지 않고, 마지막 커밋에 amend
git commit -m --amend -m "message"

 

 

- git status

현재 관리되고 있는 깃 폴더의 상태변화에 대해 확인할 때

git status

 

 

- git log

git commit log 및 branch, HEAD 정보 확인

git log
git log --oneline
git log --graph
git log --graph --oneline

 

 

- git reflog

git의 모든 변동사항에 대한 로그 확인

git reflog

 

 

- git reset

git을 과거 시점으로 돌릴 때 사용하며, 과거로 돌아간 리셋도 다시 미래 시점으로 리셋 가능

# 워킹 디렉토리 + 스테이징 에리어 + 로컬 리포를 특정 커밋 시점으로 리셋
git reset --hard commit_id

# 스테이징 에리어 + 로컬 리포를 특정 커밋 시점으로 리셋
git reset commit_id
git reset --mixed commit_id

# 로컬 리포만 특정 커밋 시점으로 리셋
git reset --soft commit_id

 

 

- git stash

파일의 변경사항을 커밋하기 전에 임시저장할 때 사용하는 기능

pull할 때, 커밋이 되지 않는 내용이 있거나 branch switch 시 사용

# git stash
git stash

# stash message 작성
git stash -m "message"

# stash 목록 확인
git stash list

# stash 변경사항 확인
git stash show stash@{0}

# stash list에서 최신 stash 삭제
git stash drop

# stash list에서 특정 stash 삭제
git stash drop stash@{0}

# stash list 전체 삭제
git stash clear

# stash list stac에서 가장 최신 stash로 복원
git stash apply

# stash list에서 특정 stash로 복원
git stash apply stash@{0}

# stash list에서 가장 최신 stash로 복원하면서, stash list에서 해당 stash 삭제
git stash pop
git stash

 

 

- git branch

# 브랜치 생성
git branch branchName

# 브랜치 전환
git switch branchName

# 브랜치 삭제
git branch -d branchName

# 브랜치명 변경
git branch -m branchName

 

 

- git merge

merge는 fast-forward merge와 3way merge로 구분된다.

fast-forward (ff) merge는 merge commit을 남기지 않고 branch의 HEAD만 이동하며, 3way merge는 merge commit을 남긴다.

merge conflict가 발생한 경우에는 git status를 통해 conflict 파일을 확인 후, 해당 파일에서 conflict를 해결 후 commit을 진행한다.

git merge branchName

-----------------------------------------------------

# merge conflict 상황에서 vs code로 수정
code filename

# merge conflict 상황에서 merge를 취소할 때
git merge --abort

# fast-forward merge 상황에서 merge commit을 남기고 싶을 때
git merge --no-ff branchName

# squash merge
git merge --squash branchName

 

 

- rebase

분기된 브랜치의 base commit의 위치를 base branch (ex. main) 의 최신 커밋으로 이동하는 기능이다.

3way merge 상황에서 rebase를 통해 fast-forwad merge 가 가능해진다.

rebase는 분기된 브랜치의 base commit이 변경되기 때문에, base commit 이후 모든 commit_id는 변경된다.

 

협업 시, remote repo에 push 된 커밋은 rebase를 지양해야 한다.

push 되지 않은 commit 이나 branch 에서만 사용을 권장한다.

 

혼자 사용하는 remote repo의 경우에는 로컬에서 rebase 후 force push 할 수 있다.

# force push : 기존 remote repo의 내용을 무시하고, local repo의 내용으로 강제 push
git push -f origin main

 

rebase를 진행 시, merge conflict 처럼 conflict이 발생할 수 있다.

충돌이 발생한 파일을 확인 후, merge conflict와 동일하게 해결한 후 git add 후에 git rebase -- continue 를 하면 된다.

 

과거 commit 수정을 위해 사용하는 rebase를 Interactive Rebase 라고 한다.

수정이 필요한 커밋의 이전 commit_id를 통해 명령을 입력한다.

# command 영역에 필요한 명령어 입력
pick : 대상 커밋
edit : 커밋 수정이 필요한 경우 (커밋 메세지, 작성자, 시간, 코드 변경)
reword : 커밋 메세지 수정만 필요한 경우
squash : 여러 커밋을 하나의 커밋으로 합쳐야 하는 경우 (어떤 커밋이 스쿼시 되었는지 커밋 메세지에 표기)
fixup : 여러 커밋을 하나의 커밋으로 합쳐야 하는 경우 (어떤 커밋이 합쳐졌는지 커밋 메세지에 표기되지 않음)

 

Interactive Rebase도 commit에 변화가 일어나기 때문에, rebase 한 커밋 이후의 모든 commit_id가 변경된다.

# commit_id는 rebase 대상 커밋의 이전 커밋 id
git rebase -i commit_id

# edit 상태 : 커밋 메세지 변경
git commit --amend -m "message"

# edit 상태 : 커밋 작성자 변경 / --no-edit 옵션을 통해 커밋메세지 수정 없이 바로 커밋 가능
git commit --amend --no-edit --author="user <user@gmail.com>"

# edit 상태 : 커밋 일자 변경 / --no-edit 옵션을 통해 커밋메세지 수정 없이 바로 커밋 가능
git commit --amend --no-edit --date="{Jul 15 21:10:33 2022 +0900}"

# rebase 상태에서 수정이 완료되어, 다음 커밋으로 넘어갈 때
git rebase --continue

# rebase 중단
git rebase --abort