2023/07/28 TIL

김도현·2023년 7월 28일
0

TIL

목록 보기
9/76

제대로 파는 Git & GitHub - by 얄코 8-1 ~ 10-5

8. 취소와 되돌리기 보다 깊이 알기

1. 관리되지 않는 파일들 삭제하기

git clean

Git에서 추적하지 않는 파일들 삭제(Git에서 관리되지 않는 파일 삭제)

옵션설명
-n삭제될 파일들 보여주기
-i인터렉티브 모드 시작
-d폴더 포함
-f강제로 바로 지워버리기
-x⚠️ .gitignore에 등록된 파일들도 삭제
  • 위의 옵션들을 조합하여 사용

💡 흔히 쓰이는 조합: git clean -df

  • toClean1.txt
  • toClean2.txt
  • dir/toClean3.txt
    예시
hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)     
$ git clean -n
Would remove toClean1.txt
Would remove toClean2.txt

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git clean -nd
Would remove dir/

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git clean -id
Would remove the following items:
  dir/          toClean1.txt  toClean2.txt
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers
What now> 3
What now> 3
    1: dir/            2: toClean1.txt    3: toClean2.txt
Select items to delete>> 1,3
  * 1: dir/            2: toClean1.txt  * 3: toClean2.txt
Select items to delete>>
Would remove the following items:
  dir/          toClean2.txt
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers
    4: ask each             5: quit                 6: help
What now> 4
Remove dir/ [y/N]? y
Remove toClean2.txt [y/N]? n
Removing dir/

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git clean -df
Removing dir/
Removing toClean1.txt
Removing toClean2.txt

2. 커밋하지 않는 변경사항 되돌리기

git restore

특정 파일을 지정된 상태로 복구

파일 여러 개를 수정하고 아래 명령어들 사용해보기

git restore (파일명)
  • 워킹 디렉토리의 특정 파일 복구
git restore .
  • 모든 파일 복구

변경상태를 스테이지에서 워킹 디렉토리로 돌려놓기

git restore --staged (파일명)

파일을 특정 커밋의 상태로 되돌리기

git restore --source=(헤드 또는 커밋 해시) 파일명

예시

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git restore .

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git restore --source=6ac8f9d73aba50c08ab9232cee75a565f2f6bcb3 tiger
s.yaml

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git restore .

3. reset했어도 희망은 있다.

reflog 명령어

git reflog

reflog는 프로젝트가 위치한 커밋이 바뀔 때마다 기록되는 내역을 보여주고
이를 사용하여 reset하기 이전 시점으로 프로젝트를 복구할 수 있습니다.

예시

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git reflog
c0a4341 (HEAD -> main, tag: v2.0.0, origin/main) HEAD@{0}: checkout: moving from fa88b79e1a46ac73e688b83e9a099d6f4fff4c8f to main
fa88b79 (tag: v1.2.1) HEAD@{1}: checkout: moving from main to v1.2.1
c0a4341 (HEAD -> main, tag: v2.0.0, origin/main) HEAD@{2}: commit (amend): Add members to Panthers and Pumas        
02b9999 HEAD@{3}: commit (amend): Add a member to Panthers bla bla
9c0b888 HEAD@{4}: commit (amend): Add a member to Panthers
1d997ff HEAD@{5}: commit: 횻홍
12e6a0f HEAD@{6}: checkout: moving from stash-branch to main
12e6a0f HEAD@{7}: reset: moving to 12e6a0fd67f3105a11930929a72177f1ee8ffa22
2481f3e HEAD@{8}: commit: 횻홍
12e6a0f HEAD@{9}: reset: moving to HEAD

9. 태그

1. 커밋에 태그 달기

Git의 Tag

태그 달아보기

태그 종류설명
lightweight특정 커밋을 가리키는 용도
annotated작성자 정보와 날짜, 메시지, GPG 서명 포함 가능

마지막 커밋에 태그 달기 (lightweight)

git tag 태그명칭

현존하는 태그 확인

git tag

원하는 태그의 내용 확인

git show 태그명칭

태그 삭제

git tag -d 태그명칭

마지막 커밋에 태그 달기 (annotated)

git tag -a 태그명칭

입력 후 메시지 작성 또는

git tag 태그명칭 -m '자기가 넣고싶은 메시지'
  • -m 태그가 -a 태그 암시

원하는 커밋에 태그 달기

git tag (태그명) (커밋 해시) -m (메시지)

원하는 패턴으로 필터링하기

git tag -l 'v1.*'

원하는 버전으로 체크아웃

git checkout v1.2.1

예시

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag v2.0.0

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag
v2.0.0

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git show
commit c0a4341cc0cd52c6c0c785675b8e6adf6c18cd9e (HEAD -> main, tag: v2.0.0, origin/main)
Author: KimDoHyeon <hj2471755@naver.com>
Date:   Thu Jul 27 19:47:03 2023 +0900

    Add members to Panthers and Pumas

diff --git a/panthers.yaml b/panthers.yaml
index 44c866e..54ca69f 100644
--- a/panthers.yaml
+++ b/panthers.yaml
@@ -8,4 +8,5 @@ members:
 - Violet
 - Stella
 - Anthony
-- Freddiei
\ No newline at end of file

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git show v2.0.0
commit c0a4341cc0cd52c6c0c785675b8e6adf6c18cd9e (HEAD -> main, tag: v2.0.0, origin/main)
Author: KimDoHyeon <hj2471755@naver.com>
Date:   Thu Jul 27 19:47:03 2023 +0900

    Add members to Panthers and Pumas

diff --git a/panthers.yaml b/panthers.yaml
index 44c866e..54ca69f 100644
--- a/panthers.yaml
+++ b/panthers.yaml
@@ -8,4 +8,5 @@ members:
 - Violet
 - Stella
 - Anthony
-- Freddiei
\ No newline at end of file

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag -d v2.0.0
Deleted tag 'v2.0.0' (was c0a4341)

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag -a v2.0.0
fatal: no tag message?

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag v2.0.0 -m "자진모리 버전"

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git show v2.0.0
tag v2.0.0
Tagger: KimDoHyeon <hj2471755@naver.com>
Date:   Fri Jul 28 19:10:47 2023 +0900

자진모리 버전

commit c0a4341cc0cd52c6c0c785675b8e6adf6c18cd9e (HEAD -> main, tag: v2.0.0, origin/main)
Author: KimDoHyeon <hj2471755@naver.com>
Date:   Thu Jul 27 19:47:03 2023 +0900

    Add members to Panthers and Pumas

diff --git a/panthers.yaml b/panthers.yaml
index 44c866e..54ca69f 100644
--- a/panthers.yaml
+++ b/panthers.yaml

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag v1.0.0 

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag
v1.0.0
v2.0.0

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag -d v1.0.0
Deleted tag 'v1.0.0' (was c0a4341)

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag v1.0.0 de1bdf503fde1669fe3500acf6d9efbbe604eacf -m "굿거리 
버전"

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag
v1.0.0
v2.0.0

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag v1.2.1 fa88b79e1a46ac73e688b83e9a099d6f4fff4c8f -m "휘모리 
버전"

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag
v1.0.0
v1.2.1
v2.0.0

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag -l "v1.*"
v1.0.0
v1.2.1

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git tag -l "*0"
v1.0.0
v2.0.0

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git checkout v1.2.1
Note: switching to 'v1.2.1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.  

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:   

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at fa88b79 Add Evie to Leopards

pards
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git push origin v2.0.0
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 187 bytes | 62.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0      
To https://github.com/subscriptioncat/git-practice.git    
 * [new tag]         v2.0.0 -> v2.0.0

hj247@DESKTOP-R1VCF2H MINGW64 /f/git_test (main)
$ git push --delete origin v2.0.0
To https://github.com/subscriptioncat/git-practice.git
 - [deleted]         v2.0.0

2. 원격의 태그와 릴리즈

원격에 태그 동기화

특정 태그 원격에 올리기

git push (원격명) (태그명)

예시

$ git push origin v2.0.0
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 187 bytes | 62.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0      
To https://github.com/subscriptioncat/git-practice.git    
 * [new tag]         v2.0.0 -> v2.0.0

특정 태그 원격에서 삭제

git push --delete (원격명) (태그명)
$ git push --delete origin v2.0.0
To https://github.com/subscriptioncat/git-practice.git
 - [deleted]         v2.0.0

로컬의 모든 태그 원격에 올리기

git push --tags
$ git push --tag
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 491 bytes | 163.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0      
To https://github.com/subscriptioncat/git-practice.git
 * [new tag]         v1.0.0 -> v1.0.0
 * [new tag]         v1.2.1 -> v1.2.1
 * [new tag]         v2.0.0 -> v2.0.0

GitHub의 release

네이버 나눔고딕 코딩글꼴 예시

릴리즈 만들어보기

  • GitHub에서 태그 목록으로
  • 원하는 태그에서 Create release
  • 제목과 내용(마크다운) 입력 후 Publish release


10. Branch 보다 깊이 알기

2. 다른 브랜치에서 원하는 커밋만 따오기

다른 브랜치의 원하는 커밋 가져오기

cherry-pick 명령어 사용

git cherry-pick (체리의 해시)

예시

$ git cherry-pick cadfd026adb861cef437c612fe4f3ef519bf256f 
[main 0bbe2a1] Cherry
 Author: yalco <yalco@kakao.com>
 Date: Sat Jan 1 15:33:36 2022 +0900
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 cherry

3. 다른 가지의 잔가지만 가져오기

다른 브랜치에서 파생된 브랜치 옮겨붙이기

rebase --onto 옵션 사용

🎯 fruit 브랜치에서 파생된 citrus 브랜치를 main 브랜치로 옮겨붙이기

git rebase --onto (도착 브랜치) (출발 브랜치) (이동할 브랜치)
  • citrus로 fast forward
    • merge로 main HEAD를 citrus쪽으로

예시

hj247@DESKTOP-R1VCF2H MINGW64 /c/Users/hj247/Downloads/git-branch (main)
$ git rebase --onto main fruit citrus
Successfully rebased and updated refs/heads/citrus.   

hj247@DESKTOP-R1VCF2H MINGW64 /c/Users/hj247/Downloads/git-branch (citrus)
$ git switch main
Switched to branch 'main'

hj247@DESKTOP-R1VCF2H MINGW64 /c/Users/hj247/Downloads/git-branch (main)
$ git merge citrus
Updating 0bbe2a1..c6787aa
Fast-forward
 lemon | 0
 lime  | 0
 2 files changed, 0 insertions(+), 0 deletions(-)     
 create mode 100644 lemon
 create mode 100644 lime

rebase --onto를 되돌리려면?

위의 사항들을 진행하신 뒤 git reflog를 사용해서 내역을 살펴보시면
아래와 같이, rebase --onto 명령시 여러 내역들이 진행된 것을 볼 수 있습니다.

rebase --onto가 여러 동작들을 포함한다는 것을 알 수 있죠.

그럼 전체 브랜치의 상테를 reabse --onto 이전으로 돌리려면 어떻게 하면 될까요?

reset은 브랜치별로 이뤄지므로, rebase --onto로 영향을 받은
모든 브랜치들에서 하나하나 리셋을 진행해주어야 합니다.
혹은 다시 옮겨붙이는 방법도 있죠.

현재 이번 실습으로 변화가 일어난 브랜치는
main(패스트포워드 됨)과 citrus 이 둘입니다.

1. main 브랜치

main은 그리로 옮겨붙여진citrus로 fastforward된 것이 마지막 액션이므로
reflog의 기록상에서 그 이전 기록으로 reset --hard를 하면 됩니다.

lemonlime이 추가되기 전으로 돌아가는거죠.

2. citrus 브랜치

방법 A

그리고 citrus 브랜치는 해당 브랜치가 옮겨지기 전 마지막 커밋인
commit: Lime 부분을 reflog에서 찾아 그리로 reset --hard하면 됩니다.

방법 B

다른 방법으로는, 다시 rebase --onto를 사용해서
citrus의 커밋들을 main으로부터 도로
fruit브랜치의 orange 부분으로 옮기는 것입니다.

그러러면 orange 커밋으로 checkout 한 다음
그곳에서 새 브랜치를 만들고 (temp라 가정하죠)

git rebase --onto temp main citrus

위 명령어로 citrus의 두 커밋들을 해당 위치로 옮겨붙인 뒤
temp 브랜치는 삭제해주시면 됩니다.

4. 다른 가지의 마디들 묶어서 가져오기

다른 커밋들을 하나로 묶어 가져오기

merge --squash 옵션 사용

🎯 root 브랜치의 마디들을 하나로 묶어 main 브랜치로 가져오기

git merge --squash (대상 브랜치)
  • 변경사항들 스테이지 되어 있음
  • git commit 후 메시지 입력
hj247@DESKTOP-R1VCF2H MINGW64 /c/Users/hj247/Downloads/git-branch (main)
$ git merge --squash root
Automatic merge went well; stopped before committing as requested
Squash commit -- not updating HEAD

hj247@DESKTOP-R1VCF2H MINGW64 /c/Users/hj247/Downloads/git-branch (main)
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)   
        new file:   beet
        new file:   potato
        new file:   radish


hj247@DESKTOP-R1VCF2H MINGW64 /c/Users/hj247/Downloads/git-branch (main)
$ git commit
[main 7b1b785] Squashed commit of the following:
 3 files changed, 0 insertions(+), 0 deletions(-)     
 create mode 100644 beet
 create mode 100644 potato
 create mode 100644 radish

hj247@DESKTOP-R1VCF2H MINGW64 /c/Users/hj247/Downloads/git-branch (main)
$ git reflog
0bbe2a1 HEAD@{2}: checkout: moving from citrus to mainc6787aa (citrus) HEAD@{3}: rebase (finish): returning to refs/heads/citrus
c6787aa (citrus) HEAD@{4}: rebase (pick): Lime
39ff5aa HEAD@{5}: rebase (pick): Lemon
0bbe2a1 HEAD@{6}: rebase (start): checkout main
0bbe2a1 HEAD@{7}: cherry-pick: Cherry
a8bfbbf HEAD@{8}: checkout: moving from root to main
9730f02 (root) HEAD@{9}: commit: Beet
1d6746b HEAD@{10}: commit: Radish

일반 merge와의 차이 정리

일반 mergemerge --squash는, 실행 후 코드의 상태는 같지만
내역 면에서 큰 차이가 있는 것이라고 이해하시면 됩니다.

일반 merge : A와 B 두 브랜치를 한 곳으로 이어붙임
merge --squash : B 브랜치의 마디들을 복사해다가 한 마디로 모아 A 브랜치에 붙임 (staged 상태로)

5. 협업을 위한 브랜치 활용법

Gitflow

사용되는 브랜치들

브랜치용도
main제품 출시/배포
develop다음 출시/배포를 위한 개발 진행
release출시/배포 전 테스트 진행(QA)
feature기능 개발
hotfix긴급한 버그 수정

0개의 댓글