2023/07/27 TIL

김도현·2023년 7월 27일
0

TIL

목록 보기
8/76

제대로 파는 Git & GitHub - by 얄코 4-5 ~ 7-5

4.GitHub 사용하기

5. 원격의 브랜치 다루기

(1). 로컬에서 브랜치 만들어 원격에 push해보기

  1. 새로운 브랜치를 만들고 push해보기
fatal: The current branch from-local has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin from-local

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.

어디에 업로드 할지 몰라 오류발생

git push -u origin from-local 또는 git push --set-upstream origin from-local
  1. 브랜치 목록 살펴보기
  • git branch
    • 이렇게 입력시 로컬에 있는 브랜치만 표시
  • git branch --all 또는 git branch -a
    • 이렇게 입력시 오리진에 있는 브랜치도 표시
    $ git branch -a
    conflict
    * from-local
    main
    remotes/origin/from-local
    remotes/origin/main

(2). 원격의 브랜치 로컬에 받아오기

  1. GitHub에서 from-remote브랜치 만들기

  2. 원격의 변경사항 확인
git fetch
  • git branch -a로 확인
  1. 아래 명령어로 로컬에 같은 이름의 브랜치를 생성하여 연결하고 switch
git switch -t origin/브랜치명

(3). 원격의 브랜치 삭제

git push (원격 이름) --delete (원격의 브랜치명)

Github에서 프로젝트 삭제 방법

설정의 맨 아래 Delete this repository 클릭




6. SourceTree로 진행해보기

(1). 원격 추가하기

  1. 원격 추가하기

    경로에 복사한 HTTP 기입

    모두 선택후 Push

(2). push와 pull

petch

push

pull

(3). 삭제

5.Git 보다 깊이 알기

2. Git의 3가지 공간

(1). Git의 3가지 공간

  • commit되어 레포지토리에 들어간 후 수정사항이 발생하면 tracked 파일로써 스테이징을 기다리게 됩니다.

Working directory

  • untracked: Add된 적 없는 파일, ignore 된 파일
  • tracked: Add된 적 있고 변경내역이 있는 파일
  • git add 명령어로 Staging area로 이동

Staging area

  • 커밋을 위한 준비 단계
    • 예시: 작업을 위해 선택된 파일들
  • git commit 명령어로 repository로 이동

Repository

  • .git directory라고도 불림
  • 커밋된 상태

비유 설명

상태설명
untracked식기세척기에 들어가 본 적이 없거나 식기세척기 사용이 불가(ignored)한 그릇
tracked식기세척기에 들어가 본 적이 있고 식기세척기 사용이 가능한 그릇
add식기세척기에 넣는 행위
staging area식기세척기 안(에 들어간 상태)
commit세척(식기세척기 가동)
repository세척되어 깨끗해진 상태
파일에 수정이 가해짐그릇이 사용되어 이물질(커밋되지 않은 변경사항)이 묻음
working directory세척되어야 하는 상태

tracked가 된다는 건, Git의 관리대상에 정식으로 등록됨을 의미합니다.
새로 추가되는 파일은 반드시 add해줌으로써, 해당 파일이 tracked될 것임을 명시해야 하는 이유입니다.
(Git이 새 파일들을 무조건 다 관리해버리는 것을 방지)

(2). 파일의 삭제와 이동

git rm

일반 삭제시

$ git status
On branch from-remote
Your branch is up to date with 'origin/from-remote'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    tigers.yaml

no changes added to commit (use "git add" and/or "git commit -a")
  • 파일의 삭제가 working directory에 있음

git rm으로 삭제시

$ git status
On branch from-remote
Your branch is up to date with 'origin/from-remote'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    tigers.yaml
  • 파일의 삭제가 Staging area에 있음
    • add된 상태

git mv

일반적인 파일 이름 변경

$ git status
On branch from-remote
Your branch is up to date with 'origin/from-remote'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    tigers.yaml

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        zzamtigers.yaml
  • 원래 파일은 삭제 되었고 변경된 파일 명으로 새로 생성된 모습

git mv으로 변경

$ git mv tigers.yaml zzamtigers.yaml

결과

$ git status
On branch from-remote
Your branch is up to date with 'origin/from-remote'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        renamed:    tigers.yaml -> zzamtigers.yaml
  • 이름만 변경된 상태

파일을 staging area에서 working directory

쉽게 말해서 add취소

git restore --staged (파일명)
  • --staged를 빼면 working directory에서도 제거
  • 예전: git reset HEAD (파일명)

reset의 세 가지 옵션

  • --soft: repository에서 staging area로 이동
  • --mixed (default): repository에서 working directory로 이동
  • --hard: 수정사항 완전히 삭제

3. HEAD

Git의 HEAD

현재 속한 브랜치의 가장 최신 커밋

checkout 으로 앞뒤 이동해보기

git checkout HEAD^
  • ^ 또는 ~: 갯수만큼 이전으로 이동
    • git checkout HEAD^^^, git checkout HEAD~5
  • ⭐️ 커밋 해시를 사용해서도 이동 가능
    • git checkout (커밋해시)
  • git checkout -: (이동을) 한 단계 되돌리기

💡 이전으로 checkout된 상태에서 소스트리로 HEAD 상태 보기

익명의 브랜치에 위치함을 알 수 있음
git branch로 현재 해드 해쉬 알아내기

$ git branch
* (HEAD detached at 4697b11)
  alpha-branch
  beta-branch
  delta-branch
  main

해드에서 새로운 브랜치 만들기

$ git switch -c gamma-branch
Switched to a new branch 'gamma-branch'

⭐ HEAD 사용하여 reset하기

git reset HEAD(원하는 단계) (옵션)

SourceTree


4. fetch vs pull

fetch와 pull의 차이

  • fetch: 원격 저장소의 최신 커밋을 로컬로 가져오기만 함
  • pull: 원격 저장소의 최신 커밋을 로컬로 가져와 merge 또는 rebase

원격의 새 브랜치 확인

  • git checkout origin/(브랜치명)
  • git switch -t origin/(브랜치명)

6.Git 보다 잘 활용하기

1. Help와 문서 활용하기

git help

Git 사용 중 모르는 부분이 있을 때 도움을 받을 수 있는 기능

git help

자세한 설명

git help -a

해당 명령어의 설명과 옵션 보기

git (명령어) -h
git help (명령어)
git (명령어) --help
  • 해당 명령어의 설명과 옵션 웹사이트에서 보기
  • ⭐️ 웹에서 열리지 않을 시 끝에 -w를 붙여 명시

Git 문서

Git 문서 보기
Pro Git 책 보기

2. Git으 각종 설정

(1). global 설정과 local 설정

config를 --global과 함께 지정하면 전역으로 설정됩니다.

  • 특정 프로젝트만의 user.nameuser.email 지정해보기

(2). 설정값 확인

현재 모든 설정값 보기

git config (global) --list

에디터에서 보기 (기본: vi)

git config (global) -e

기본 에디터 수정

git config --global core.editor "code --wait"
  • 또는 code 자리에 원하는 편집 프로그램의 .exe파일 경로 연결
  • --wait : 에디터에서 수정하는 동안 CLI를 정지
  • 💡 git commit 등의 편집도 지정된 에디터에서 열게 됨

위의 에디터 설정을 되돌리려면
git config --global -e로 편집기를 연 뒤 아래 부분을 삭제하고 저장

(3). 유용한 설정들

줄바꿈 호환 문제 해결

git config --global core.autocrlf (윈도우: true / 맥: input)

pull 기본 전략 merge 또는 rebase로 설정

git config pull.rebase false
git config pull.rebase true

기본 브랜치명

git config --global init.defaultBranch main

push시 로컬과 동일한 브랜치명으로

git config --global push.default current

(4). 단축키 설정

📄관련 문서 보기

git config --global alias.(단축키) "명령어"
  • 예시: git config --global alias.cam "commit -am"

7.프로답게 커밋 관리하기

1.🐰 어떻게 커밋하는게 좋을까요?

(1). 작업을 커밋할 때 권장사항

  1. 하나의 커밋에는 한 단위의 작업을 넣도록 합니다.
  • 한 작업을 여러 버전에 걸쳐 커밋하지 않습니다.
  • 여러 작업을 한 버전에 커밋하지 않습니다.
  1. 커밋 메시지는 어떤 작업이 이뤄졌는지 알아볼 수 있도록 작성합니다.

(2). 커밋 메시지 컨벤션

널리 사용되는 커밋 메시지 작성방식

type: subject

body (optional)
...
...
...

footer (optional)

예시

feat: 압축파일 미리보기 기능 추가

사용자의 편의를 위해 압축을 풀기 전에
다음과 같이 압축파일 미리보기를 할 수 있도록 함
 - 마우스 오른쪽 클릭
 - 윈도우 탐색기 또는 맥 파인더의 미리보기 창

Closes #125

Type

타입설명
feat새로운 기능 추가
fix버그 수정
docs문서 수정
style공백, 세미콜론 등 스타일 수정
refactor코드 리팩토링
perf성능 개선
test테스트 추가
chore빌드 과정 또는 보조 기능(문서 생성기능 등) 수정

Subject

커밋의 작업 내용 간략히 설명

Body

길게 설명할 필요가 있을 시 작성

  • Breaking Point 가 있을 때
  • 특정 이슈에 대한 해결 작업일 때

(3). Gitmoji

😊 사이트 방문하기

2. 보다 세심하게 스테이징하고 커밋하기

(1). 내용 확인하며 hunk별로 스테이징하기

  • hunk이란 Git의 변경사항 단위

아래 명령어로 hunk별 스테이징 진행

git add -p
  • 옵션 설명을 보려면 ?입력 후 엔터
  • y 또는 n로 각 헝크 선택
  • 일부만 스테이징하고 진행해보기
  • git stats와 소스트리로 확인

예시

$ git add -p
diff --git a/leopards.yaml b/leopards.yaml
index 2198cce..eeb1ac5 100644
--- a/leopards.yaml
+++ b/leopards.yaml
@@ -1,8 +1,8 @@
 team: Leopards

-manager: Dooli
+manager: Peter

-coach: Lupi
+coach: Rocket

 members:
 - Linda
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]? ?   
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file  
d - do not stage this hunk or any of the later hunks in the file
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
g - select a hunk to go to
/ - search for a hunk matching the given regex       
s - split the current hunk into smaller hunks        
e - manually edit the current hunk
? - print help
@@ -1,8 +1,8 @@
 team: Leopards

-manager: Dooli
+manager: Peter

-coach: Lupi
+coach: Rocket

 members:
 - Linda
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]? y   
@@ -11,3 +11,5 @@ members:
 - Olivia
 - Evie
 - Dongho
+- Drax
+- Groot
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,e,?]? n

diff --git a/tigers.yaml b/tigers.yaml
index 287c2df..75081a1 100644
--- a/tigers.yaml
+++ b/tigers.yaml
@@ -1,8 +1,8 @@
 team: Tigers

-manager: Brenda
+manager: Thanos

-coach: Ruth
+coach: Ronan

 members:
 - Linda
(1/2) Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]? n   
@@ -11,5 +11,8 @@ members:
 - George
 - Tyler
 - kim
+- Gamora
+- Nebula

 fetch: this
+new: branch
\ No newline at end of file
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,s,e,?]? t     
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file  
d - do not stage this hunk or any of the later hunks in the file
K - leave this hunk undecided, see previous hunk     
g - select a hunk to go to
/ - search for a hunk matching the given regex       
s - split the current hunk into smaller hunks        
e - manually edit the current hunk
? - print help
@@ -11,5 +11,8 @@ members:
 - George
 - Tyler
 - kim
+- Gamora
+- Nebula

 fetch: this
+new: branch
\ No newline at end of file
(2/2) Stage this hunk [y,n,q,a,d,K,g,/,s,e,?]? y     

(2). 변경사항을 확인하고 커밋하기

git commit -v
  • j, k로 스크롤하며 내용 확인
  • git diff --staged와 비교
  • 커밋 후 남은 헝크를 다른 버전으로 커밋해보기
커밋 명칭

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
#	modified:   leopards.yaml
#	modified:   tigers.yaml
#
# Changes not staged for commit:
#	modified:   leopards.yaml
#	modified:   tigers.yaml
#
# ------------------------ >8 ------------------------
# Do not modify or remove the line above.
# Everything below it will be ignored.
diff --git a/leopards.yaml b/leopards.yaml
index 2198cce..e4dea21 100644
--- a/leopards.yaml
+++ b/leopards.yaml
@@ -1,8 +1,8 @@
 team: Leopards
 
-manager: Dooli
+manager: Peter
 
-coach: Lupi
+coach: Rocket
 
 members:
 - Linda
diff --git a/tigers.yaml b/tigers.yaml
index 287c2df..35ebf69 100644
--- a/tigers.yaml
+++ b/tigers.yaml
@@ -11,5 +11,8 @@ members:
 - George
 - Tyler
 - kim
+- Gamora
+- Nebula
 
 fetch: this
+new: branch
\ No newline at end of file

3. 커밋하기 애매한 변화 치워두기

(2). 변경사항 만들기

git stash
  • git stash save와 같음
$ git stash
Saved working directory and index state WIP on main: 12e6a0f Edit Leopards and Tigers

(3). 원하는 시점, 브랜치에서 다시 적용

git stash pop
$ git stash pop
On branch main
Your branch is ahead of 'origin/main' by 2 commits.  
  (use "git push" to publish your local commits)     

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)  
        new file:   tomcats.yaml

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   tigers.yaml

Dropped refs/stash@{0} (737b4cd8f9276765e1af220d671f476d02d91e18)

(4). 원하는 것만 stash 해보기

  • 아래 명령어로 Stash2만 선택하여 스태시
git stash -p
$ git stash -p
diff --git a/jaguars.yaml b/jaguars.yaml
index ba26d8e..8858d30 100644
--- a/jaguars.yaml
+++ b/jaguars.yaml
@@ -7,3 +7,4 @@ members:
 - Harvey
 - Myles
 - Pinkfong
+- Stash3
\ No newline at end of file
(1/1) Stash this hunk [y,n,q,a,d,e,?]? n

diff --git a/leopards.yaml b/leopards.yaml
index eeb1ac5..350951a 100644
--- a/leopards.yaml
+++ b/leopards.yaml
@@ -13,3 +13,4 @@ members:
 - Dongho
 - Drax
 - Groot
+- Stash2
(1/1) Stash this hunk [y,n,q,a,d,e,?]? y

Saved working directory and index state WIP on main: 12e6a0f Edit Leopards and Tigers

(5). 메시지와 함께 스태시

git stash -m 'Add Stash3'

(6). 스태시 목록 보기

git stash list
  • 리스트상의 번호로 apply, drop, pop 가능
    • ex) git stash apply stash@{1}
$ git stash list
stash@{0}: On main: Add Stash3
stash@{1}: WIP on main: 12e6a0f Edit Leopards and Tigers

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)     
$ git stash apply stash@{1}
On branch main
Your branch is ahead of 'origin/main' by 2 commits.  
  (use "git push" to publish your local commits)     

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   leopards.yaml

no changes added to commit (use "git add" and/or "git commit -a")

(7). 스태시를 브랜치로 저장하기

$ git stash branch stash-branch
Switched to a new branch 'stash-branch'
On branch stash-branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   jaguars.yaml
        modified:   leopards.yaml

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (fd1a3875308937e8468c4799602bf9134ed8b66a)

(8). stash apply

$ git stash apply stash@{1}
On branch main
Your branch is ahead of 'origin/main' by 2 commits.  
  (use "git push" to publish your local commits)     

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   leopards.yaml

no changes added to commit (use "git add" and/or "git commit -a")$ git stash apply stash@{1}
On branch main
Your branch is ahead of 'origin/main' by 2 commits.  
  (use "git push" to publish your local commits)     

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   leopards.yaml

no changes added to commit (use "git add" and/or "git commit -a")

Stash 사용법 정리

명령어설명비고
git stash현 작업들 치워두기끝에 save 생략
git stash apply치워둔 마지막 항목(번호 없을 시) 적용끝에 번호로 항목 지정 가능
git stash drop치워둔 마지막 항목(번호 없을 시) 삭제끝에 번호로 항목 지정 가능
git stash pop치워둔 마지막 항목(번호 없을 시) 적용 및 삭제apply + drop
💡 git stash branch(브랜치명) 새 브랜치를 생성하여 pop충돌사항이 있는 상황 등에 유용
git stash clear치워둔 모든 항목들 비우기

소스트리로 해 보기



4. 커밋 수정하기

git commit --amend

마지막 커밋 수정

(1). 커밋 메시지 변경

  • Panthers의 members에 Hoki 추가하고 스테이지
  • 커밋 메시지: 횻홍
  • 아래 명령어로 에디터 열어 커밋 메시지 변경
git commit --amend
  • 커밋 메시지: Add a member to Panthers

(2). 커밋에 변화 추가

  • Pumas의 members에 Poki 추가하고 스테이지
  • git commit --amend로 마지막 커밋에 포함
  • 커밋 메시지 아무렇게나 변경

(3). 커밋 메시지 한 줄로 변경

git commit --amend -m 'Add members to Panthers and Pumas'

5. 과거의 커밋들을 수정, 삭제, 병합, 분할하기

git rebase -i (대상 바로 이전 커밋)

  • 과거 커밋 내역을 다양한 방법으로 수정 가능
명령어설명
p, pick커밋 그대로 두기
r, reword커밋 메시지 변경
e, edit수정을 위해 정지
d, drop커밋 삭제
s, squash이전 커밋에 합치기

0개의 댓글