TIL - 21.06.24 πŸ‘¨β€πŸ’» - Git

μ„±ν›ˆΒ·2021λ…„ 6μ›” 24일
0

TIL

λͺ©λ‘ 보기
11/59
post-thumbnail

TIL - 21.06.24 πŸ‘¨β€πŸ’»

Git

Git의 μ˜μ—­μ€ 크게 두가지 Tracked area 와 Untracked area둜 λ‚˜λˆ μ§€λ©°,
Tracked areaλŠ” ν›„μˆ ν•  세가지 μƒνƒœλ‘œ λ‚˜λˆ„μ–΄μ§„λ‹€.

  • unmodified (μˆ˜μ •λ˜μ§€ μ•ŠμŒ)
    κΈ°μ‘΄ μ»€λ°‹ν–ˆλ˜ νŒŒμΌμ„ μˆ˜μ •ν•˜μ§€ μ•Šμ€ μƒνƒœ
    λ¬Έμ œκ°€ μ—†μ„μ‹œ git status λͺ…λ Ήμ–΄λ‘œ ν™•μΈλ˜μ§€ μ•ŠλŠ”λ‹€.

  • modified (μˆ˜μ •λ¨)
    κΈ°μ‘΄ μ»€λ°‹ν–ˆλ˜ νŒŒμΌμ„ μˆ˜μ •ν•œ μƒνƒœ

  • staged
    modified νŒŒμΌμ„ stage에 μΆ”κ°€ν•œ μƒνƒœ(push 되기 μ§μ „μ˜ μƒνƒœ)


git push -u

$ git push λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν• λ•Œ
$ git push remoteRepository localBranchToPush 의 λͺ…λ Ήμ–΄λ‘œ ν‘Έμ‹œν•˜κ³ λŠ” ν•œλ‹€.

remoteRepositoryλΌλŠ” 원격 μ €μž₯μ†Œμ— localBranchToPushλΌλŠ” μ΄λ¦„μ˜ 둜컬 브랜치λ₯Ό ν‘Έμ‹œν•΄μ„œ 원격 μ €μž₯μ†Œμ—λ„ localBranchToPushλΌλŠ” μ΄λ¦„μ˜ 브랜치λ₯Ό λ§Œλ“€κ³  둜컬 브랜치의 λ‚΄μš©μ„ λ³΅μ‚¬ν•˜κ±°λ‚˜ 이미 같은 μ΄λ¦„μ˜ λΈŒλžœμΉ˜κ°€ μžˆλ‹€λ©΄ 둜컬 브랜치의 λ°μ΄ν„°λ‘œ κ°±μ‹ ν•œλ‹€.

$ git push -u remoteRepository localBranchToPush 와 같이 -u μ˜΅μ…˜μ„ μ‚¬μš©ν• λ•Œκ°€ μžˆλ‹€.

μ΄λŠ” 차후에 git push λ˜λŠ” git pull을 ν•  λ•Œ μžλ™μ μœΌλ‘œ remoteRepository 에 λ‹€κ°€ localBrachToPush λΌλŠ” μ΄λ¦„μ˜ 브랜치λ₯Ό pushν•˜κ±°λ‚˜ pull ν•˜κ²Œ 경둜λ₯Ό μ €μž₯ν•˜λŠ” μ˜΅μ…˜μ΄λ‹€.


git fetch

$ git fetchλŠ” 원격 μ €μž₯μ†Œμ˜ μ΅œμ‹  정보λ₯Ό κ°€μ Έμ˜€λŠ” λͺ…령어이닀.
$ git pullκ³Ό μœ μ‚¬ν•˜μ§€λ§Œ 차이점은 git pull은 원격 μ €μž₯μ†Œμ˜ μ΅œμ‹  정보λ₯Ό κ°€μ Έμ™€μ„œ 본인의 λ‘œμ»¬λ ˆν¬μ— λ³‘ν•©κΉŒμ§€ ν•΄λ²„λ¦¬μ§€λ§Œ, git fetchλŠ” μ΅œμ‹  정보λ₯Ό κ°€μ Έμ˜€κΈ°λ§Œ ν•˜κ³  병합은 ν•˜μ§€ μ•ŠλŠ”λ‹€.

$ git fetch λͺ…λ Ήμ–΄λ‘œ κ°€μ Έμ˜¨ μ΅œμ‹  정보λ₯Ό ν™•μΈν•˜κ³  μ‹Άλ‹€λ©΄ $ git checkout FETCH_HEAD λͺ…λ Ήμ–΄λ‘œ ν•΄λ‹Ή 브랜치둜 μ§„μž…ν•  수 μžˆλ‹€.

μ—¬κΈ°μ„œ κ²°κ΅­ $ git checkout localBranch 이후 $ git merge FETCH_HEAD λ₯Ό ν•˜κ²Œλ˜λ©΄ $ git pullκ³Ό λ˜‘κ°™μ•„ μ§€λŠ” 것이닀.


git diff

μ΅œμ‹  컀밋과 비ꡐ해 ν˜„μž¬ 파일의 λ‹€λ₯Έ 뢀뢄을 ν™•μΈν•˜λŠ” λͺ…λ Ήμ–΄
staged area에 μžˆλŠ” 파일(add 된)은 비ꡐ할 수 μ—†λ‹€.

μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ staged area도 μ‘°νšŒν•  수 μžˆλŠ”λ°
--cached 와 --stagedλ₯Ό μ΄μš©ν•˜λ©΄ 비ꡐ할 수 μžˆλ‹€.


git rm

깃에 μ €μž₯된 νŒŒμΌμ„ μ‚­μ œν•˜λŠ” λͺ…λ Ήμ–΄.

$ git rm fileName 으둜 μ‚­μ œν•  κ²½μš°λŠ” 리λͺ¨νŠΈμ™€ 둜컬 λͺ¨λ‘μ—μ„œ μ‚­μ œλ˜μ§€λ§Œ
$ git rm --cache fileName 으둜 μ‚­μ œν•  κ²½μš°λŠ” 리λͺ¨νŠΈμ—μ„œλ§Œ μ‚­μ œλ˜κ³  λ‘œμ»¬μ—λŠ” λ‚¨μ•„μžˆλ‹€.

$ git rm --cache .dirName/
dirNameμ΄λΌλŠ” 디렉토리 μ‚­μ œ.

$ git rm --cache .dirName/fileName
디렉토리 λ‚΄ fileName 파일 μ‚­μ œ.


git reset

κΉƒμ˜ 컀밋을 μ·¨μ†Œν•˜λŠ” λͺ…λ Ήμ–΄

$ git reset HEAD^ (HEAD^ === HEAD~1)
// μ§μ „μ˜ 컀밋을 μ·¨μ†Œν•˜κ³  컀밋 μ§μ „μœΌλ‘œ λŒμ•„κ°.

$ git reset HEAD~3 (HEAD^^^ === HEAD~3)
// μ΅œμ‹  3개 컀밋을 μ·¨μ†Œν•˜κ³  μ§μ „μœΌλ‘œ λŒμ•„κ°.

$ git reset logId
// logId μžλ¦¬μ— git log에 λ‚˜μ˜€λŠ” SHA-1 μ²΄ν¬μ„¬μ˜ μ•ž 6자리 μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή μ»€λ°‹κΉŒμ§€ μ·¨μ†Œν•˜κ³  κ·Έ μ§μ „μœΌλ‘œ λŒμ•„κ°.


git reset의 μ˜΅μ…˜

리셋 λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜κ³  원격 μ €μž₯μ†Œμ—λ„ μ μš©μ‹œν‚€λ €λ©΄ push λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν• λ•Œ -f μ˜΅μ…˜μ„ λ„£μ–΄ κ°•μ œλ‘œ μ μš©μ‹œμΌœμ•Ό ν•œλ‹€.

$ git reset HEAD~1 --soft
// 직전 컀밋을 μ·¨μ†Œν•˜κ³  직전 μ»€λ°‹λœ νŒŒμΌλ“€μ€ staged μƒνƒœλ‘œ μ›Œν‚Ή 디렉토리에 남김. ( git add 된 μƒνƒœ )
$ git reset HEAD~1 --mixed
// κΈ°λ³Έ κ°’μœΌλ‘œ μ˜΅μ…˜μ„ λ„£μ§€μ•ŠμœΌλ©΄ ν•΄λ‹Ή μ˜΅μ…˜μœΌλ‘œ λ¦¬μ…‹λœλ‹€.
// 직전 컀밋을 μ·¨μ†Œν•˜κ³  ν•΄λ‹Ή μ»€λ°‹μ—μ„œ μ»€λ°‹λœ νŒŒμΌλ“€μ€ untracked μƒνƒœλ‘œ μ›Œν‚Ή 디렉토리에 남김. ( git add 되기 μ „ μƒνƒœ )
$ git reset HEAD~1 --hard
// 직전 컀밋을 μ·¨μ†Œν•˜κ³  ν•΄λ‹Ή μ»€λ°‹μ—μ„œ μ»€λ°‹λœ νŒŒμΌλ“€μ€ μ›Œν‚Ή λ””λ ‰ν† λ¦¬μ—μ„œ μ‚­μ œλ¨.
// λ‹€λ₯Έ μ˜΅μ…˜μ€ μˆ˜μ •μ‚¬ν•­μ΄ λ‚¨μ•„μžˆμ§€λ§Œ --hard μ˜΅μ…˜μ€ μˆ˜μ •ν–ˆλ˜ 사항이 κΉ”λ”ν•˜κ²Œ μ‚­μ œλ¨.


원격 μ €μž₯μ†Œμ˜ 파일 ν„°λ―Έλ„λ‘œ μ‚­μ œν•˜κΈ°

예λ₯Ό λ“€μ–΄ μ»€λ°‹ν•˜κ³  ν‘Έμ‰¬ν•˜λŠ” κ³Όμ •μ—μ„œ 원격 μ €μž₯μ†Œ(Github like)에 test.jsλΌλŠ” 파일이 같이 ν‘Έμ‰¬λ˜μ—ˆλ‹€κ³  κ°€μ •ν•˜μž.

  1. $ git rm --cache test.js λͺ…λ Ήμ–΄λ‘œ 원격 μ €μž₯μ†Œ 내에 μžˆλŠ” 파일 μ‚­μ œ
    ν•΄λ‹Ή λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜κ³  git status λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ 원격저μž₯μ†Œμ˜ test.jsλ₯Ό μ‚­μ œν•œλ‹€λŠ” 것이 μŠ€ν…Œμ΄μ§€μ— 있고, 둜컬 νŒŒμΌμ€ untracked μƒνƒœλ‘œ git μΆ”μ μ—μ„œ λΉ μ§€κ²Œ λœλ‹€.

  2. $ git commit -m 'commit message' λͺ…λ Ήμ–΄λ‘œ 컀밋 메세지λ₯Ό 남긴닀.

  3. $ git push origin branchName λͺ…λ Ήμ–΄λ‘œ ν•΄λ‹Ή λ‚΄μš©μ„ 원격 μ €μž₯μ†Œμ— ν‘Έμ‰¬ν•œλ‹€.


원격 μ €μž₯μ†Œμ˜ 컀밋 μ§€μš°κΈ°

μ „μˆ ν•œ 방식이 μ•„λ‹Œ μ•„μ˜ˆ μ»€λ°‹μžμ²΄λ„ 남기기 싫을 κ²½μš°κ°€ μžˆλ‹€.
그럴 κ²½μš°μ—λŠ” 둜컬의 컀밋을 μ—†μ• κ³  ( = μ»€λ°‹μ˜ μ „ λ‹¨κ³„λ‘œ 되돌리고) ν•΄λ‹Ή λ‚΄μš©μ„ κ°•μ œλ‘œ ν‘Έμ‰¬ν•΄μ„œ μ μš©μ‹œν‚€λ©΄ λœλ‹€.

  1. $ git reset HEAD^ λͺ…λ Ήμ–΄λ‘œ κ°€μž₯ 졜근 컀밋을 μ·¨μ†Œν•˜κΈ°.

  2. $ git push origin branchName 으둜 ν‘Έμ‰¬ν•˜κΈ°.

  3. λ§Œμ•½ νŒŒμΌμ„ μ‚­μ œν•œ 컀밋을 μ§€μš°κ³  νŒŒμΌμ„ λ³΅κ΅¬ν•˜κ³  μ‹Άλ‹€λ©΄ $ git checkout deletedFileName 으둜 λ³΅κ΅¬ν•˜κΈ°.


컀밋 메세지 λ³€κ²½ν•˜κΈ°

  • $ git commit --amend λ₯Ό μž…λ ₯ν•˜λ©΄ 기본으둜 μ„€μ •ν•œ CLI ν…μŠ€νŠΈ νŽΈμ§‘κΈ°(기본값은 vim)κ°€ λ‚˜μ˜¬ 것이고, ν•΄λ‹Ή ν…μŠ€νŠΈ νŽΈμ§‘κΈ°λ‘œ λ³€κ²½ ν•  수 μžˆλ‹€.

원격 μ €μž₯μ†Œ μ—°κ²°ν•˜κΈ°

  1. $ git init λͺ…λ Ήμ–΄λ‘œ νŒŒμΌλ“€μ΄ μœ„μΉ˜ν•œ 디렉토리λ₯Ό 둜컬 λ ˆν¬μ§€ν† λ¦¬λ‘œ λ§Œλ“ λ‹€. ( κΉƒμ˜ 관리 ν•˜μ— λ‘”λ‹€. )

  2. κΉƒν—ˆλΈŒμ— λ ˆν¬μ§€ν† λ¦¬λ₯Ό μƒˆλ‘œ λ§Œλ“€κ±°λ‚˜ ν¬ν¬ν•œλ‹€.

  3. $ git remote add shortName repositoryAddress λ₯Ό μ΄μš©ν•΄μ„œ 원격 μ €μž₯μ†Œμ— μ—°κ²°ν•œλ‹€.
    shortName은 ν•΄λ‹Ή 원격저μž₯μ†Œμ˜ 별λͺ…μœΌλ‘œ 본인의 μ €μž₯μ†ŒλŠ” 보톡 origin으둜 μ„€μ •ν•˜λ©° λ§Œμ•½ 본인의 λ ˆν¬κ°€ λ‹€λ₯Έ 레포의 포크라면, κ·Έ 원λ₯˜κ°€ λ˜λŠ” 레포λ₯Ό 보톡 upstream(상λ₯˜)둜 μ„€μ •ν•œλ‹€.

  4. $ git remote -v 둜 연결이 잘 λ˜μ—ˆλŠ”μ§€ ν™•μΈν•œλ‹€.

    + 본인의 원격 μ €μž₯μ†ŒλΏλ§Œ μ•„λ‹ˆλΌ νƒ€μΈμ˜ 원격 μ €μž₯μ†Œλ„ μ—°κ²°ν•˜κ³  pull ν•˜κΈΈ μ›ν•˜λŠ” 경우 ( 포크 원본을 예둜 μ„€λͺ… )

  5. $ git remote add upstream upstreamRepoAddress 둜 둜컬 λ ˆν¬μ™€ μ—°κ²°ν•œλ‹€.

  6. $ git fetch upstream λͺ…λ Ήμ–΄λ‘œ upstream 원격저μž₯μ†Œμ˜ 정보λ₯Ό λ°›μ•„μ˜¨λ‹€.

  7. $ git checkout master λͺ…λ Ήμ–΄λ‘œ λ‚΄ 둜컬 레포의 master 브랜치둜 μ΄λ™ν•œλ‹€.

  8. $ git merge upstream/master λͺ…λ Ήμ–΄λ‘œ 두 브랜치λ₯Ό ν•©λ³‘μ‹œν‚¨λ‹€.

  9. upstream의 레포λ₯Ό μƒˆλ‘œ λ§Œλ“€κ±°λ‚˜ ν¬ν¬ν•œ 본인의 원격 μ €μž₯μ†Œμ— pushν•˜κΈΈ μ›ν•œλ‹€λ©΄ $ git push origin master(main) 으둜 ν‘Έμ‹œν•œλ‹€.



원격 μ €μž₯μ†Œ ν•΄μ œν•˜κΈ°

  1. $ git remote -v (--verbose) λͺ…λ Ήμ–΄λ₯Ό μ΄μš©ν•΄ 연결을 ν•΄μ œν•  원격저μž₯μ†Œλ₯Ό ν™•μΈν•œλ‹€.

  2. $ git remote remove shortName λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ shortName으둜 μ—°κ²°ν•œ 원격저μž₯μ†Œμ™€ μ—°κ²°ν•΄μ œλœλ‹€.


컀밋 μ „ λ‚΄μš© μ΄ˆκΈ°ν™”μ‹œν‚€κΈ°

두가지 방법이 μžˆλ‹€.

  1. $ git restore fileName (.)
    // νŒŒμΌμ„ μ„ νƒν•΄μ„œ 볡ꡬ할 수 μžˆλŠ” 방법, fileName μžλ¦¬μ— '.' dot을 λ„£μœΌλ©΄ μ „λΆ€ μ΄ˆκΈ°ν™” μ‹œν‚¬ 수 μžˆλ‹€.

  2. $ git reset HEAD --hard
    // μ΅œμ‹  μ»€λ°‹μ˜ λ‚΄μš©μœΌλ‘œ λ³€κ²½λœ λ‚΄μš© μ „λΆ€ μ·¨μ†Œν•˜κ³  μ›λ³΅μ‹œν‚€λŠ” 방법


GOOD πŸ˜‰

이전 λ²ˆμ— 깃을 κ³΅λΆ€ν•˜κΈ΄ ν–ˆμ—ˆλŠ”λ° 였늘 κ³΅λΆ€ν•¨μœΌλ‘œμ„œ λ­”κ°€ 더 κΉƒμ΄λž‘ μΉœν•΄μ‘Œλ‹€.

BAD πŸ˜₯

κΉƒ κ³΅λΆ€ν•˜λŠλΌ λ‹€λ₯Έ 곡뢀듀은 거의 λͺ»ν–ˆλ‹€.
λΈ”λ‘œκΉ…ν•˜λŠ”λ° html, css νƒœκ·Έ μ‚¬μš©ν•˜λŠ” 것을 κΉ¨λ‹¬μ•˜λ‹€κ³  μƒκ°ν–ˆμ§€λ§Œ μ‹€μ œ ν¬μŠ€νŠΈμ—μ„  μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

TO DO πŸ”₯

  • 객체 곡뢀
  • λ°°μ—΄ 곡뢀
  • Node.js
  • React

Retrospect 🧐

μ˜€λŠ˜μ€ Git을 λ‹€μ‹œ ν•œλ²ˆ λ°°μ› λ‹€.
이전 λ²ˆμ—” μ§„μ§œ 아무 것도 λͺ¨λ₯΄λŠ” μƒνƒœμ—μ„œ λ¬΄μž‘μ • λ”°λΌν•˜κΈ°λ‘œ git status, git add -A git commit -m λ“±λ“± μ§„μ§œ κ°„λ‹¨ν•œ κ²ƒλ§Œ μ‚¬μš©ν–ˆλ‹€.
μ‚¬μš©ν•˜λ©΄μ„œ git status λͺ…λ Ήμ–΄λ‘œ μƒνƒœλ³΄λ©° modified된 νŒŒμΌλ“€μ΄ 뭐가 μˆ˜μ •λ˜μ—ˆλŠ”μ§€λ„ λͺ¨λ₯΄κ³  μ–΄λ–»κ²Œ μˆ˜μ •λœκ±Έ λ³΄λŠ”μ§€λ„ λͺ¨λ₯΄κ³  λ¬΄μž‘μ • 컀밋 - ν‘Έμ‹œ ν•΄λ²„λ Έμ—ˆλ‹€.
κ·Έλž˜λ„ 였늘 μ’€ 더 배운걸둜 무지성 컀밋과 ν‘Έμ‹œλŠ” 쀄어듀 λ“― ν•˜λ‹€

λΈ”λ‘œκΉ…μ— HTML, CSS νƒœκ·Έλ₯Ό μ΄μš©ν•˜λ©΄μ„œ λ­”κ°€ 더 읽기 μ’‹κ²Œ ν¬μŠ€νŒ… ν•  수 있게된 λŠλ‚Œμ΄λ‹€.
아직은 λͺ…λ Ήμ–΄ μžλ¦¬μ— μŠ€νƒ€μΌ μ£ΌλŠ”κ²Œ ν•œκ³„μ§€λ§Œ 점점 λŠ˜μ–΄λ‚˜κΈΈ κΈ°λŒ€ν•œλ‹€.

λŠ” 무슨 λ―Έλ¦¬λ³΄κΈ°μ—μ„œλ‚˜ μ μš©λ˜μ§€ μ‹€μ œ ν¬μŠ€νŠΈμ—μ„  μ μš©λ˜μ§€ μ•ŠλŠ”λ‹€.

깃은 이전에 ν¬μŠ€νŒ…ν•œκ±°λž‘ λ‹€ μ •λ¦¬ν•΄μ„œ OiMW μ‹œλ¦¬μ¦ˆλ‘œ λ‹€μ‹œ ν•œλ²ˆ λ³΄κΈ°μ’‹κ²Œ 정리 해봐야겠닀.

Reference πŸ™‡

codestates urClass
http://www.notforme.kr/
https://gmlwjd9405.github.io/

profile
μ–΄λ–»κ²Œ 이걸 ν’€μ–΄λ‚Ό 수 μžˆμ„κΉŒ

0개의 λŒ“κΈ€