๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Environment·Tool

CLI ํ™˜๊ฒฝ์—์„œ Git ์‚ฌ์šฉํ•˜๊ธฐ(๋ช…๋ น์–ด ์ •๋ฆฌ) #1

by Leica 2020. 8. 5.
๋ฐ˜์‘ํ˜•

CLI ํ™˜๊ฒฝ์—์„œ Git ์‚ฌ์šฉํ•˜๊ธฐ(๋ช…๋ น์–ด ์ •๋ฆฌ) #1

๐Ÿ“ ๋ชฉ๋ก

status
log
add
commit
branch
checkout
push
pull
fetch

 

status

- ํ˜„์žฌ git ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์คŒ
- ๋‹ค์Œ 4๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ถœ๋ ฅ๋จ

1) Untracked files
2) Changes to be committed
3) Changes not staged for commit
4) Nothing to commit, working tree clean

 

1) Untracked files

- Untracked ์ƒํƒœ์˜ ํŒŒ์ผ๋“ค
- Git์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ํŒŒ์ผ๋“ค
- add ๋ช…๋ น์–ด๊ฐ€ ์ ์šฉ๋˜๊ธฐ ์ „์˜ ํŒŒ์ผ๋“ค
- ex) ์‹ ๊ทœ ํŒŒ์ผ

 

2) Changes to be committed

- Staged ์ƒํƒœ์˜ ํŒŒ์ผ๋“ค
- Untracked/Modified ์ƒํƒœ์—์„œ add ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Staged ์ƒํƒœ๊ฐ€ ๋œ ํŒŒ์ผ๋“ค
- commitํ•  ์ค€๋น„๊ฐ€ ๋œ ํŒŒ์ผ๋“ค

 

3) Changes not staged for commit

- Modified ์ƒํƒœ์˜ ํŒŒ์ผ๋“ค
- Unmodified ์ƒํƒœ์—์„œ ํŒŒ์ผ ์ˆ˜์ •์„ ํ†ตํ•ด Modified ์ƒํƒœ๊ฐ€ ๋œ ํŒŒ์ผ๋“ค
- ์ด ์ƒํƒœ์˜ ํŒŒ์ผ๋“ค์„ commitํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” add ํ•„์š”

 

4) Nothing to commit, working tree clean

- ๋ชจ๋“  ํŒŒ์ผ์ด Unmodified ์ƒํƒœ์ผ ๋•Œ
- commitํ•  ๊ฒƒ์ด ์—†๊ณ  ์ž‘์—… ๊ณต๊ฐ„์ด cleanํ•œ ์ƒํƒœ

 

log

- ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ช…๋ น์–ด
- ์ปค๋ฐ‹ ๋‹จ์œ„๋กœ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์Œ“์ž„
- log๋ฅผ ๋ณผ ์ค„ ์•Œ์•„์•ผ develop, release, hotfix ๋ธŒ๋žœ์น˜๊ฐ€ ๋‚œ๋ฌดํ•  ๋•Œ merge ๋ฐฉํ–ฅ์ด๋‚˜ ์ˆœ์„œ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Œ
- ์œ„์— ์žˆ๋Š” ๊ฒƒ์ด ์ตœ์‹ , ์•„๋ž˜ ์žˆ์„ ์ˆ˜๋ก ์˜ˆ์ „ ์ปค๋ฐ‹

 

git log ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ alias ์„ค์ •์„ ์‚ฌ์šฉํ•ด์„œ ๋” ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ์ถœ๋ ฅ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

git config --global alias.lg "log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all"

 

์ผ๋ฐ˜ git log ๊ฒฐ๊ณผ

$ git log
commit 3fb7854e925c0efc1509f033fe007cbfd50d3efb (HEAD -> master)
Author: Yoon <leicareddot@gmail.com>
Date:   Tue Aug 4 05:20:09 2020 +0900

    cherry pick test

commit e7b33dd2a82253c9c332409dd4fd6192388659f6 (origin/master)
Merge: f2f8d58 09dc9fe
Author: leicareddot <61109222+leicareddot@users.noreply.github.com>
Date:   Tue Aug 4 05:01:37 2020 +0900

    Merge pull request #2 from leicareddot/feature/e
    
    feature pr conflict

commit 09dc9fe848f057395fee513ff068e3d295081c62 (origin/feature/e, feature/e)
Author: Yoon <leicareddot@gmail.com>
Date:   Tue Aug 4 04:53:19 2020 +0900

    feature pr conflict

...

 

alias ์‚ฌ์šฉ

$ git lg
* 3fb7854 - (21์‹œ๊ฐ„ ์ „) cherry pick test - Yoon (HEAD -> master)
*   e7b33dd - (21์‹œ๊ฐ„ ์ „) Merge pull request #2 from leicareddot/feature/e - leicareddot (origin/master)
|\  
| * 09dc9fe - (22์‹œ๊ฐ„ ์ „) feature pr conflict - Yoon (origin/feature/e, feature/e)
|/  
* f2f8d58 - (22์‹œ๊ฐ„ ์ „) master pr conflict - Yoon
*   ab2685b - (22์‹œ๊ฐ„ ์ „) Merge pull request #1 from leicareddot/feature/d - leicareddot

...

 

add

- ํŒŒ์ผ์„ Staged ์ƒํƒœ๋กœ ๋งŒ๋“ฆ -> ํŒŒ์ผ์„ Git์ด ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ฆ
- Untracked / Modified ์ƒํƒœ์˜ ํŒŒ์ผ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
- Staged ์ƒํƒœ์˜ ํŒŒ์ผ๋งŒ commit ๊ฐ€๋Šฅ

 

commit

- ํŒŒ์ผ์„ Staged ์ƒํƒœ์—์„œ Unmodified ์ƒํƒœ๋กœ ๋งŒ๋“ฆ -> ํ•œ ๋‹จ์œ„์˜ ์ž‘์—…์ด ์™„๋ฃŒ
- Git ์‹œ์Šคํ…œ์— ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ์„ ์ €์žฅ
- SHA-1 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•œ ํ•ด์‹œ๊ฐ’์„ ํ‚ค๋กœ ์ƒ์„ฑ
- ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ํ•˜๋‚˜ ์ถ”๊ฐ€๋จ(git log)
- ์‹ค๋ฌด์—์„œ ํ•œ ์ž‘์—…(๊ธฐ๋Šฅ, ํ”ผ์ฒ˜) ๋‹จ์œ„๋กœ ํ•œ ์ปค๋ฐ‹ ๊ถŒ์žฅ

 

 

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” commit ์˜ต์…˜

 

  • -m : commit ๋ฉ”์‹œ์ง€ ์„ค์ •
  • -a : modified ์ƒํƒœ์˜ ํŒŒ์ผ๋“ค์— ๋Œ€ํ•ด add์™€ commit์„ ๋™์‹œ์— ํ•จ

๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๋•Œ ๋งˆ๋‹ค commitํ•˜๋ ค๋ฉด add๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•˜๋Š”๋ฐ -a ์˜ต์…˜์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

  • -am : -a์™€ -m์„ ํ•ฉ์นœ ๊ฒƒ. ์ œ์ผ ๋งŽ์ด ์‚ฌ์šฉ โญ๏ธ
git commit -am "Commit message..."

 

  • --amend

- amend๋Š” '๊ณ ์น˜๋‹ค'๋ผ๋Š” ๋œป

- ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜. ์ข…์ข… ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

- ํ˜„์žฌ Stage ์ƒํƒœ์˜ ํŒŒ์ผ๋“ค์ด ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹๊ณผ ํ•ฉ์ณ์„œ ๋‹ค์‹œ ์ปค๋ฐ‹๋จ(๋”ฐ๋ผ์„œ ์ปค๋ฐ‹์˜ ํ•ด์‹œ๊ฐ’๋„ ๋ฐ”๋€œ)

- ๋งŒ์•ฝ Stage์— ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค๋ฉด (commit์ดํ›„์— ์ž‘์—…์„ ์•ˆํ–ˆ์œผ๋ฉด) ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋งŒ ์ˆ˜์ •

 

branch

Git branch ์ „๋žต - Git Flow

 

- ํ•˜๋‚˜์˜ '์ž‘์—… ๊ณต๊ฐ„'์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ์‰ฌ์›€
- ์ปค๋ฐ‹ ์‚ฌ์ด๋ฅผ ๊ฐ€๋ณ๊ฒŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ํฌ์ธํ„ฐ ๊ฐ™์€ ๊ฒƒ

 

1) ๋ธŒ๋žœ์น˜ ํ™•์ธ

git br

 

๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, *์ด ๋ถ™์€ ๋ธŒ๋žœ์น˜๊ฐ€ ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๋ธŒ๋žœ์น˜์ด๋‹ค.

  develop
  feature/d
  feature/e
* master

 

git br -r

-r ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์›๊ฒฉ ์ €์žฅ์†Œ์˜ ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2) ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

git br {๋ธŒ๋žœ์น˜ ๋ช…}

 

3) ๋กœ์ปฌ ๋ธŒ๋žœ์น˜ ์‚ญ์ œ

๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด -d, -D ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‘ ์˜ต์…˜์—๋Š” ์•ฝ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

 

git br -D {๋ธŒ๋žœ์น˜ ๋ช…}

-d --force์˜ ๋‹จ์ถ• ๋ช…๋ น

merge ์—ฌ๋ถ€์™€ ์ƒ๊ด€ ์—†์ด ๊ฐ•์ œ๋กœ(force) ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

 

git br -d {๋ธŒ๋žœ์น˜ ๋ช…}

--delete์˜ ๋‹จ์ถ• ๋ช…๋ น

์ปค๋ฐ‹ ๋ฐœ์ƒ ํ›„ ์›๊ฒฉ ์ €์žฅ์†Œ์— ๋จธ์ง€๊ฐ€ ๋˜์ง€ ์•Š์€ ์ƒํƒœ์ด๋ฉด error: The branch ... is not fully merged ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์‚ญ์ œ๊ฐ€ ์‹คํŒจํ•จ

 

4) ์›๊ฒฉ ๋ธŒ๋žœ์น˜ ์‚ญ์ œ

์›๊ฒฉ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ• ๋•Œ๋Š” git push ๋ช…๋ น์–ด์˜ --delete ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

git push origin --delete {๋ธŒ๋žœ์น˜ ๋ช…}

์ด ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์›๊ฒฉ ๋ธŒ๋žœ์น˜๋Š” ์‚ญ์ œ๋œ๋‹ค.

 

git fetch -p

์‚ญ์ œ๋œ ์›๊ฒฉ ๋ธŒ๋žœ์น˜๋ฅผ ๋กœ์ปฌ์— ์ตœ์ข…์ ์œผ๋กœ ๋ฐ˜์˜ํ•œ๋‹ค.

 

checkout

- ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™
- ํŠน์ • ์ปค๋ฐ‹์œผ๋กœ ์ด๋™

 

1) ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™

git checkout {๋ธŒ๋žœ์น˜ ๋ช…}

 

2) ํŠน์ • ์ปค๋ฐ‹์œผ๋กœ ์ด๋™

git checkout {์ปค๋ฐ‹ ํ•ด์‹œ๊ฐ’}

git log ๋ช…๋ น์„ ํ†ตํ•ด ์ปค๋ฐ‹์˜ ํ•ด์‹œ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•ด์‹œ๊ฐ’์„ checkout ๋ช…๋ น์˜ ์ธ์ž๋กœ ์ž…๋ ฅํ•˜์—ฌ ํ•ด๋‹น ์ปค๋ฐ‹์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ˜„์žฌ working directory๊ฐ€ cleanํ•œ ์ƒํƒœ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.

์ด๋™ํ•œ ๊ณผ๊ฑฐ์˜ ์ปค๋ฐ‹์—์„œ ์‹ ๊ทœ ๋ธŒ๋žœ์น˜๋ฅผ ๋”ฐ์„œ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

3) checkout -b ์˜ต์…˜

๋ธŒ๋žœ์น˜ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๋ธŒ๋žœ์น˜๋กœ checkout(์ด๋™)ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜

๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋‘ ๋ช…๋ น์–ด๋Š” ๋™์ผํ•จ

git co -b {๋ธŒ๋žœ์น˜ ๋ช…}

 

push

- ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์˜ ์ •๋ณด๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ์—…๋กœ๋“œ
- Clone ํ•œ ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์— ์“ฐ๊ธฐ ๊ถŒํ•œ ํ•„์š”
- ๊ฐ™์€ ๋ธŒ๋žœ์น˜๋กœ ์—ฌ๋Ÿฌ ๋ช…์ด ๋ฐ›์•„์„œ ๋ˆ„๊ตฐ๊ฐ€ push ํ–ˆ๋‹ค๋ฉด ๋‚˜๋Š” push ํ•  ์ˆ˜ ์—†์Œ
- merge / rebase ํ›„ push ํ•  ์ˆ˜ ์žˆ์Œ

 

git push [์›๊ฒฉ ์ €์žฅ์†Œ ์ด๋ฆ„] [๋ธŒ๋žœ์น˜ ์ด๋ฆ„]

์›๊ฒฉ ์ €์žฅ์†Œ ์ด๋ฆ„๊ณผ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒ๋žต ์‹œ origin, master๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

๐Ÿ“ ์›๊ฒฉ ์ €์žฅ์†Œ ์ด๋ฆ„์€ git remote ๋ช…๋ น์„ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

push -f ์˜ต์…˜

  • push --force์˜ ๋‹จ์ถ•
  • ๋‚ด ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋กœ ์›๊ฒฉ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ•์ œ๋กœ ๋ฎ์–ด์”Œ์›€ - ๐Ÿšจ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉ!
  • ํ˜ผ์ž ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋žœ์น˜์—์„œ๋งŒ(feature ๋ธŒ๋žœ์น˜ ๋“ฑ) ์‚ฌ์šฉํ•ด์•ผํ•จ

 

push --set-upstream ์˜ต์…˜

git push --set-upstream [์›๊ฒฉ ์ €์žฅ์†Œ ์ด๋ฆ„] [๋ธŒ๋žœ์น˜ ์ด๋ฆ„]

push ์‹œ fatal: The current branch ... has no upstream branch ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์›๊ฒฉ ์ €์žฅ์†Œ์— pushํ•˜๋ ค๋Š” ๋ธŒ๋žœ์น˜๊ฐ€ ์—†๋‹ค๋Š” ๋ฉ”์‹œ์ง€์ด๋‹ค.

์ด๋Ÿด ๋•Œ๋Š” push --set-upstream ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์›๊ฒฉ ์ €์žฅ์†Œ ์ด๋ฆ„๊ณผ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ push๋œ๋‹ค.

 

pull

- Clone ํ•œ ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ merge
- ์ž๋™ merge ์ค‘ ์ถฉ๋Œ(conflict) ๋ฐœ์ƒ ์‹œ ์‹คํŒจํ•˜๋ฏ€๋กœ ์ถฉ๋Œ ์ฒ˜๋ฆฌ ํ•„์š”
- ์œ ์‚ฌํ•œ ๋ช…๋ น์–ด๋กœ fetch๊ฐ€ ์žˆ์Œ

pull ์ค‘ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด merge --abort๋กœ ๋˜๋Œ๋ฆฌ๊ฑฐ๋‚˜ ์ถฉ๋Œ๋‚œ ๋กœ์ปฌ ํŒŒ์ผ ์ˆ˜์ • ํ›„ add ํ•จ์œผ๋กœ์จ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1) git merge --abort

pull์„ ์ทจ์†Œํ•˜๊ณ  merge ์‹œ๋„ ์ „์œผ๋กœ git ์ƒํƒœ๋ฅผ ๋˜๋Œ๋ฆผ

 

2) ์ถฉ๋Œ๋‚œ ๋กœ์ปฌ ํŒŒ์ผ ์ˆ˜์ • ํ›„ add

์ถฉ๋Œ๋‚œ ๋กœ์ปฌ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๊ณ  add ๋ช…๋ น์„ ์ž…๋ ฅํ•จ์œผ๋กœ์จ ์ถฉ๋Œ์„ ํ•ด๊ฒฐ ํ–ˆ์Œ์„ git์—๊ฒŒ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด commit, push๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

fetch

- Clone ํ•œ ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ , ์ž๋™์œผ๋กœ mergeํ•˜์ง„ ์•Š์Œ
- ์›๊ฒฉ ์ €์žฅ์†Œ์˜ ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
- ์ž๋™์œผ๋กœ mergeํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ merge ํ•„์š”

 

Related

 

References

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€