본문 바로가기

Github

07_명령어로 깃 다루기

반응형

깃 명령어를 알아야 하는 이유

  • 지금까지 배운 소스트리는 일종의 보조 도구일 뿐이다.
  • 소스트리를 이용하지 않고도 얼마든지 능수능란하게 버전을 관리할 수 있다.

소스트리는 처음 배울 때 시각적으로 더 쉽게 익힐 수 있으나, 깃 명령어 몇 줄 입력하면 버전 관리가 끝나므로 숙지하면 더 빠르고 간편하다.

![img](https://blog.kakaocdn.net/dn/b7QAbb/btrRuw0kUEt/bgH1K6uPKrmviuvzJxI3aK/img.png)

저장소와 버전 만들기

실습은 git bash에서 해보자.

  • pwd : 현재 경로 보기

비어있는 git 저장소 생성하기

git init

.git 폴더가 생성된다. .git이 있는 이 공간이 작업 디렉터리다.

  • touch : 파일 생성하기
touch a.txt	

현재 작업 디렉터리 상태 확인하기

git status

![img](https://blog.kakaocdn.net/dn/qPaZA/btrRtcBCyo2/c341jp3TwJKiZ9rzdHtqy1/img.png)

Untracked files : 갑자기 생긴 파일. 즉, 깃이 추적하지 않고 있는 파일.

a.txt가 생성됨을 깃이 감지하였다는 것을 의미한다.

staging하기 (=stage에 올리기)

git add a.txt

add하고 다시 status를 확인해보면

![img](https://blog.kakaocdn.net/dn/FwX0d/btrRstc52ax/jIKnSevVNKFKeFHtmusNOK/img.png)

changes to be committed : 새로운 파일 a.txt이 커밋할 준비가 완료되었다는 의미

현재 디렉터리 내 모든 변경 사항을 staging하기

git add .

commit 하기 (제목만 작성하기)

git commit -m "커밋메시지"

![img](https://blog.kakaocdn.net/dn/cUkruZ/btrRthXccNr/p8R3PhHHg9NKsbNpTUUea1/img.png)

지금까지 commit 확인하기

git log

![img](https://k.kakaocdn.net/dn/bIMUgN/btrRuqlDIzm/r2LkAk0pdpzlsZSADCyohk/img.png)

staging + commit 한 번에 하기

git commit -am "커밋메시지"

commit 하기 (제목과 본문 작성하기)

git commit

vi 편집기가 오픈된다. 여기에 커밋 메시지를 작성한다.

  • **a, i** : insert
  • **o** : 한칸 띄어서 새로운 내용 입력하기
  • **esc** : 입력 상태에서 벗어나기 (명령 모드로 전환하기)
  • **:w** : 저장
  • **:q** : 종료
  • **:wq** : 저장 및 종료

![img](https://k.kakaocdn.net/dn/bViUld/btrRstD4Sl5/ck3hIrcIYMbKwk0nKEd1d0/img.png)

하단에 insert가 뜬 상태에서 작성할 수 있다.

제목

내용
# Please enter the commit message for your changes. ...
# ...

입력이 끝나면 esc를 누른다.

![img](https://k.kakaocdn.net/dn/cQcVnt/btrRtcVYWzH/89RDsfVnejJZSlGaYQVpf1/img.png)

git log로 커밋을 확인해보자.

![img](https://k.kakaocdn.net/dn/oqEMQ/btrRupUy23S/HzifmPqN8PLRdKV1kSpb10/img.png)

커밋 다양하게 조회하기: log

깃 커밋 목록 조회하기

git log

깃 커밋 한 줄로 보기

git log --oneline

각 커밋이 어떤 변경사항 있는지 보기

git log -p 
git log --patch

터미널로 깃 브랜치 그래프로 보기

git log --graph

브랜치 그래프 한 줄로 보기

git log --oneline --graph

태그 관리하기: tag

가장 최근 커밋에 태그 달기

git tag [태그이름]

특정 커밋에 태그 달기

커밋해시는 git log를 통해 확인 가능

git tag [태그이름] [커밋해시]

태그 목록 조회하기

git tag
git tag --list
git tag -l

태그 삭제하기

git tag --delete [태그이름]
git tag -d [태그이름]

작업 내역 비교하기: diff

최신 커밋과 지금까지 작업과의 변경사항 보기(비교)

git diff

최신 커밋과 스테이지 비교하기

git diff --staged
git diff --cached

커밋끼리 비교하기

커밋된 순서: 커밋해시1 -> 커밋해시2 (뒤가 더 최신이어야 함)

커밋해시1에 비해 커밋해시2가 어떤 점들이 변경되었는지 뜸

git diff [커밋해시1] [커밋해시2]

작업 되돌리기: revert, reset

  1. revert : 이전 커밋을 유지하면서 이전 커밋으로 돌아가는 새로운 커밋 생성
  2. reset : 시간을 되돌려 그 시점으로 돌아감 (hard, mixed, soft)

revert하기

이미 커밋한 커밋을 취소한 상태로 돌아가서 새로운 커밋 생성하기 때문에 '취소할 커밋 해시'를 입력한다.

  1. 명령어 입력
git revert [취소할커밋해시]
  1. vi 편집기 열림 -> 저장하고 나오기 -> 커밋 생성 완료

reset하기

mixed reset하기

git reset [되돌아갈커밋해시]

soft/hard reset하기

git reset --soft [되돌아갈커밋해시]
git reset --hard [되돌아갈커밋해시]

작업 임시 저장하기: stash

작업 임시 저장하기

git stash

메시지와 함께 임시 저장하기

git stash -m "임시저장메시지"

임시 저장한 내역 보기

git stash list

내역

stash@{0} : On master: 임시저장메시지 // 메시지와 함께 임시 저장
stash@{1} : WIP on master: dd4c622 fourth commit // 메시지 없이 임시 저장

가장 최근에 한 stash가 0번, 가장 먼저 한 stash가 나중 번호다.

  • **WIP** : Work In Progress. master 브랜치에서 작업 중임을 의미함
  • 즉, 커밋 메시지가 fourth commit인 dd4c622 커밋해시에서 작업 중인 내역이 하나가 있다는 의미

임시 저장 항목 적용하기

git stash apply 

임시 저장 항목 삭제하기

git stash drop stash@{n}

ex) git stash drop stash@{1}

브랜치 관리하기: branch

작업 디렉터리 내 모든 브랜치 보기

git branch

브랜치 생성하기

git branch [브랜치명]

브랜치 이동하기

git checkout [브랜치명]

브랜치 생성과 동시에 이동하기

git checkout -b [브랜치명]

모든 브랜치의 커밋 보기

git log만 하면 다른 브랜치의 앞선 커밋은 보이지 않는다. 앞서고 있는 모든 커밋들을 보려면 뒤에 --branches를 붙인다.

git log --branches

브랜치 병합하기

  1. 병합하고자 하는 다른 브랜치로 이동 (git checkout master)
  2. 병합 명령어 입력
git merge [머지할브랜치명]
  1. (+) 브랜치가 더이상 쓸모없다면 삭제하기
git branch -d [브랜치명]

브랜치 병합 시 충돌 해결하기

  1. merge -> 충돌 발생
  2. 충돌 파일 확인
<<<<<<<< HEAD
master
======
bar
>>>>>>>> bar
  • ===== : 두 브랜치 내용의 구분선
  1. 파일 직접 수정 및 저장
  2. 명령어 입력
git add .
git commit

rebase 하기

실습

git checkout -b foo
touch foo_a.txt
git add foo_a.txt
git commit -m "foo first commit"

touch foo_b.txt
git add foo_b.txt
git commit -m "foo second commit"

그러면 foo branch가 master branch가 2단계 더 앞서게 됨. master도 변화를 준다.

git checkout master
touch d.txt
git add d.txt
git commit -m "master fourth commit"
touch e.txt
git add e.txt
git commit -m "master fifth commit"

앞서나가는 모든 커밋 확인한다.

git log --branches

![img](https://blog.kakaocdn.net/dn/pWQCA/btrR9jH1GxG/RzR4dThDAmQLpc7EV2hEKK/img.png)

rebase하기

여기서 foo branch를 rebase하자.

foo branch의 base가 'master third commit'이라면, rebase하면 'master fifth commit'으로 한다.

git checkout foo
git rebase master

충돌이 없다면 'master fifth commit'에서 뻗어 나온 것처럼 된다.

![img](https://blog.kakaocdn.net/dn/bHkude/btrR9E6asPQ/Dn562OqD87bu5uEvRzNMKk/img.png)

원격 저장소와 상호작용하기

(1) clone

git repository에서 Code > 경로 복사

git clone [원격저장소 경로명]

(2) push

master -> main 브랜치명 변경

git branch -M main

원격 저장소 추가하기

git remote add origin [원격저장소 경로명]

추가 잘 됐는지 확인하기

git remote -v

추가한 원격 저장소로 push하기

git push origin main

'git push' 만으로 push하기

git push -u origin main

이후론 'origin main' 생략하고 `git push`만으로 push 가능

(3) fetch

원격 저장소가 로컬 저장소보다 앞서는 경우, 로컬 저장소에 앞선 내용 가져오기

git fetch origin main

하지만 이전에 `git push -u origin main` 으로 origin main을 등록해놨으므로

git fetch

만 입력해도 `get fetch origin main`이 된다.

⭐하지만 fetch는 원격 저장소의 변경사항을 로컬 저장소로 merge하는 게 아니라, 변경사항을 일단 가져오기만 한다. 그래서 `git log`를 입력하면 commit이 안나온다.

일단 가져온 변화를 확인하려면

  1. `git checkout origin/main`
  2. `git checkout FETCH_HEAD` : fetch해온 head branch로 이동 -> `git log`

변경사항들 main에 merge하기

git merge origin/main

그러면 원격 저장소와 로컬 저장소의 상태가 동일해진다.

(4) pull

원격 저장소가 로컬 저장소보다 앞서는 경우, fetch + merge하기

  • fetch: 로컬로 변경사항 가져오기
  • merge: 합치기 (가져온 내용이 main branch에 반영됨)
git pull origin main
  • origin에 있는 내용을 main으로 pull하겠다.

명령어로 풀 리퀘스트 보내기

풀 리퀘스트 과정

  1. 기여하려는 저장소를 본인 계정으로 포크하기
  2. 포크한 저장소를 클론하기
  3. 브랜치 생성 후 생성한 브랜치에서 작업하기
  4. 작업한 브랜치 푸시하기
  5. 풀 리퀘스트 보내기

(1) 기여하려는 저장소를 본인 계정으로 포크하기

  • 포크: 저장소 복제

포크 싱크 맞추기

포크된 이후로 commit이 더 쌓였다면 싱크를 맞춰줘야함

![img](https://blog.kakaocdn.net/dn/bbovjm/btrSegW8vQo/5GQegAaGrbZMnEa9zQPDZK/img.png)

(2) 포크한 저장소를 클론하기

  1. 클론 받기
  1.  
  2. git clone [복사한 원격저장소 경로] cd collaboration ls -a

(3) 브랜치 생성 후 생성한 브랜치에서 작업하기

  1.  
git branch nno3onn
git checkout nno3onn

or

git branch -b nno3onn
  1. html에 내용 추가하기
  1. 수정 내용 확인하기
    1. git status
    2. git diff

(4) 작업한 브랜치 푸시하기

git add index.html
git commit -m 'add my name in index.html'
git push origin nno3onn

(5) 풀 리퀘스트 보내기

![img](https://blog.kakaocdn.net/dn/dG5Edm/btrSf2deY0S/KrCVO9UeKyHVmlYRA5Mww0/img.png)

![img](https://blog.kakaocdn.net/dn/cCqE5A/btrR9vnVWpY/Bo0mhyKBBjK1P1B8P6oKe1/img.png)

반응형