제대로 파는 Git & GitHub - by 얄코 8-1 ~ 10-5
Git에서 추적하지 않는 파일들 삭제(Git에서 관리되지 않는 파일 삭제)
옵션 | 설명 |
---|---|
-n | 삭제될 파일들 보여주기 |
-i | 인터렉티브 모드 시작 |
-d | 폴더 포함 |
-f | 강제로 바로 지워버리기 |
-x | ⚠️ .gitignore에 등록된 파일들도 삭제 |
💡 흔히 쓰이는 조합: git clean -df
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
특정 파일을 지정된 상태로 복구
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 .
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
태그 종류 | 설명 |
---|---|
lightweight | 특정 커밋을 가리키는 용도 |
annotated | 작성자 정보와 날짜, 메시지, GPG 서명 포함 가능 |
git tag 태그명칭
git tag
git show 태그명칭
git tag -d 태그명칭
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
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
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
rebase --onto
옵션 사용
git rebase --onto (도착 브랜치) (출발 브랜치) (이동할 브랜치)
citrus
로 fast forwardmerge
로 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
위의 사항들을 진행하신 뒤 git reflog
를 사용해서 내역을 살펴보시면
아래와 같이, rebase --onto
명령시 여러 내역들이 진행된 것을 볼 수 있습니다.
rebase --onto
가 여러 동작들을 포함한다는 것을 알 수 있죠.
그럼 전체 브랜치의 상테를 reabse --onto
이전으로 돌리려면 어떻게 하면 될까요?
reset
은 브랜치별로 이뤄지므로, rebase --onto
로 영향을 받은
모든 브랜치들에서 하나하나 리셋을 진행해주어야 합니다.
혹은 다시 옮겨붙이는 방법도 있죠.
현재 이번 실습으로 변화가 일어난 브랜치는
main
(패스트포워드 됨)과 citrus
이 둘입니다.
main
은 그리로 옮겨붙여진citrus
로 fastforward된 것이 마지막 액션이므로
reflog
의 기록상에서 그 이전 기록으로 reset --hard
를 하면 됩니다.
lemon
과 lime
이 추가되기 전으로 돌아가는거죠.
그리고 citrus
브랜치는 해당 브랜치가 옮겨지기 전 마지막 커밋인
commit: Lime
부분을 reflog
에서 찾아 그리로 reset --hard
하면 됩니다.
다른 방법으로는, 다시 rebase --onto
를 사용해서
citrus
의 커밋들을 main
으로부터 도로
fruit
브랜치의 orange
부분으로 옮기는 것입니다.
그러러면 orange
커밋으로 checkout
한 다음
그곳에서 새 브랜치를 만들고 (temp
라 가정하죠)
git rebase --onto temp main citrus
위 명령어로 citrus
의 두 커밋들을 해당 위치로 옮겨붙인 뒤
temp
브랜치는 삭제해주시면 됩니다.
merge --squash 옵션 사용
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
와 merge --squash
는, 실행 후 코드의 상태는 같지만
내역 면에서 큰 차이가 있는 것이라고 이해하시면 됩니다.
일반 merge
: A와 B 두 브랜치를 한 곳으로 이어붙임
merge --squash
: B 브랜치의 마디들을 복사해다가 한 마디로 모아 A 브랜치에 붙임 (staged 상태로)
브랜치 | 용도 |
---|---|
main | 제품 출시/배포 |
develop | 다음 출시/배포를 위한 개발 진행 |
release | 출시/배포 전 테스트 진행(QA) |
feature | 기능 개발 |
hotfix | 긴급한 버그 수정 |