Назад

January 26, 2025

πŸ“¦ ΠžΠΏΡ‚ΠΈΠΌΡ–Π·ΡƒΠΉΡ‚Π΅ свій Ρ€ΠΎΠ±ΠΎΡ‡ΠΈΠΉ процСс Π·Π° допомогою Git stash

Π―ΠΊΡ‰ΠΎ Π²ΠΈ Ρ‰Π΅ Π½Π΅ використовували Git stash Π°Π±ΠΎ просто цікавитСся Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΈΠΌΠΈ Ρ€ΠΎΠ±ΠΎΡ‡ΠΈΠΌΠΈ процСсами Π· Git, Ρ†Π΅ΠΉ пост для вас. Ми розглянСмо Π²Π°Ρ€Ρ–Π°Π½Ρ‚ΠΈ використання stashing, ΠΎΠ±Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌΠΎ ΠΉΠΎΠ³ΠΎ Π½Π΅Π΄ΠΎΠ»Ρ–ΠΊΠΈ Ρ‚Π° Π·Π°ΠΏΡ€ΠΎΠΏΠΎΠ½ΡƒΡŽ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, який Π·Ρ€ΠΎΠ±ΠΈΡ‚ΡŒ кСрування Π½Π΅Π·Π°ΠΊΠΎΠΌΡ–Ρ‡Π΅Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±Π΅Π·ΠΏΠ΅Ρ‡Π½Ρ–ΡˆΠΈΠΌ Ρ– Π·Ρ€ΡƒΡ‡Π½Ρ–ΡˆΠΈΠΌ.

Π©ΠΎ Ρ‚Π°ΠΊΠ΅ Git stash?

Git stash β€” Ρ†Π΅ Π²Π±ΡƒΠ΄ΠΎΠ²Π°Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Git, яка дозволяє тимчасово Π·Π±Π΅Ρ€Ρ–Π³Π°Ρ‚ΠΈ Π½Π΅Π·Π°ΠΊΠΎΠΌΡ–Ρ‡Π΅Π½Ρ– Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ– Π·ΠΌΡ–Π½ΠΈ. Наприклад, якщо Ρƒ вас Ρ” Π·ΠΌΡ–Π½Π΅Π½Ρ– Ρ„Π°ΠΉΠ»ΠΈ, ΠΊΠΎΠΌΠ°Π½Π΄Π° git status ΠΌΠΎΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΠΈ Ρ‰ΠΎΡΡŒ ΠΏΠΎΠ΄Ρ–Π±Π½Π΅:

$ git status
On branch main
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:   app.js

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

Π―ΠΊΡ‰ΠΎ ΠΏΠΎΡ‚Ρ€Ρ–Π±Π½ΠΎ Π·Π±Π΅Ρ€Π΅Π³Ρ‚ΠΈ Ρ†Ρ– Π·ΠΌΡ–Π½ΠΈ, Π°Π»Π΅ Π½Π΅ Π·Π°ΠΊΠΎΠΌΡ–Ρ‚ΠΈΡ‚ΠΈ Ρ—Ρ… Ρƒ ΠΏΠΎΡ‚ΠΎΡ‡Π½Ρƒ Π³Ρ–Π»ΠΊΡƒ, Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ використати ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ git stash:

$ git stash
Saved working directory and index state WIP on main: 821817d some commit message

Π¦Π΅ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ваш Ρ€ΠΎΠ±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³:

$ git status
On branch main
nothing to commit, working tree clean

Команда git stash list ΠΏΠΎΠΊΠ°Π·ΡƒΡ” всі наявні ΡΡ‚Π΅ΡˆΡ–:

$ git stash list
stash@{0}: WIP on main: 821817d some commit message

Π‘Ρ‚Π΅ΡˆΡƒΠ²Π°Π½Π½Ρ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠΈΠΊΠ°Π½Π½Ρ– ΠΌΡ–ΠΆ Π³Ρ–Π»ΠΊΠ°ΠΌΠΈ

Git stash Π½Π°ΠΉΡ‡Π°ΡΡ‚Ρ–ΡˆΠ΅ Π²ΠΈΠΊΠΎΡ€ΠΈΡΡ‚ΠΎΠ²ΡƒΡŽΡ‚ΡŒ, Ρ‰ΠΎΠ± Π·Π±Π΅Ρ€Ρ–Π³Π°Ρ‚ΠΈ Π½Π΅Π·Π°ΠΊΠΎΠΌΡ–Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄ пСрСмиканням ΠΌΡ–ΠΆ Π³Ρ–Π»ΠΊΠ°ΠΌΠΈ. Наприклад:

$ git status
On branch feature-a
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:   utils/helpers.js

$ git stash
Saved working directory and index state WIP on feature-a: fd25af5 start feature A

$ git switch feature-b
# ... ΠΏΠΎΡ‡ΠΈΠ½Π°Ρ”ΠΌΠΎ Ρ€ΠΎΠ±ΠΎΡ‚Ρƒ Π½Π°Π΄ feature B

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π·Ρ– ΡΡ‚Π΅ΡˆΡƒΠ²Π°Π½Π½ΡΠΌ

  • Π›Π΅Π³ΠΊΠΎ Π·Π°Π±ΡƒΡ‚ΠΈ ΠΏΡ€ΠΎ існування ΡΡ‚Π΅ΡˆΠ°, Ρ– Ρ†Π΅ ΠΌΠΎΠΆΠ΅ призвСсти Π΄ΠΎ Π΄ΡƒΠ±Π»ΡŽΠ²Π°Π½Π½Ρ Ρ€ΠΎΠ±ΠΎΡ‚ΠΈ.
  • Π’Π°ΠΆΠΊΠΎ Π·Ρ€ΠΎΠ·ΡƒΠΌΡ–Ρ‚ΠΈ, Π΄ΠΎ якої Π³Ρ–Π»ΠΊΠΈ Π½Π°Π»Π΅ΠΆΠΈΡ‚ΡŒ ΡΡ‚Π΅Ρˆ.
  • Π―ΠΊΡ‰ΠΎ Π³Ρ–Π»ΠΊΠ° Π·ΠΌΡ–Π½ΡŽΡ”Ρ‚ΡŒΡΡ (Π½Π°ΠΏΡ€ΠΈΠΊΠ»Π°Π΄, Ρ‡Π΅Ρ€Π΅Π· rebase), ΠΌΠΎΠΆΡƒΡ‚ΡŒ Π²ΠΈΠ½ΠΈΠΊΠ½ΡƒΡ‚ΠΈ ΠΊΠΎΠ½Ρ„Π»Ρ–ΠΊΡ‚ΠΈ ΠΏΡ–Π΄ час застосування ΡΡ‚Π΅ΡˆΠ°.
  • Π‘Ρ‚Π΅ΡˆΠΈ Π½Π΅ Π·Π±Π΅Ρ€Ρ–Π³Π°ΡŽΡ‚ΡŒΡΡ Π½Π° сСрвСрі. Π―ΠΊΡ‰ΠΎ ваш локальний Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€Ρ–ΠΉ Π·Π½ΠΈΠΊΠ½Π΅ (Π½Π°ΠΏΡ€ΠΈΠΊΠ»Π°Π΄, Ρ‡Π΅Ρ€Π΅Π· Π·Π±Ρ–ΠΉ диска), ΡΡ‚Π΅ΡˆΠΈ Π±ΡƒΠ΄ΡƒΡ‚ΡŒ Π²Ρ‚Ρ€Π°Ρ‡Π΅Π½Ρ–.

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΈΠΉ ΠΏΡ–Π΄Ρ…Ρ–Π΄: тимчасові ΠΊΠΎΠΌΡ–Ρ‚ΠΈ

Π—Π°ΠΌΡ–ΡΡ‚ΡŒ використання Git stash спробуйтС тимчасово Π·Π°ΠΊΠΎΠΌΡ–Ρ‚ΠΈΡ‚ΠΈ Π·ΠΌΡ–Π½ΠΈ Ρƒ Π³Ρ–Π»ΠΊΡƒ. Для Ρ†ΡŒΠΎΠ³ΠΎ використовуйтС ΠΊΠΎΠΌΡ–Ρ‚ Ρ–Π· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ β€œWIP” (work in progress):

$ git add .
$ git commit -m "WIP"

Коли повСрнСтСся Π΄ΠΎ Π³Ρ–Π»ΠΊΠΈ, Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ скасувати Ρ†Π΅ΠΉ ΠΊΠΎΠΌΡ–Ρ‚ Ρ– ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΠΈ Π·ΠΌΡ–Π½ΠΈ Ρƒ Ρ€ΠΎΠ±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³:

$ git reset --soft HEAD~

Π©ΠΎΠ± Π·Ρ€ΠΎΠ±ΠΈΡ‚ΠΈ Ρ†Π΅ΠΉ процСс Π·Ρ€ΡƒΡ‡Π½Ρ–ΡˆΠΈΠΌ, ΡΡ‚Π²ΠΎΡ€Ρ–Ρ‚ΡŒ Π΄Π²Π° псСвдоніми:

$ git config --global alias.wip '!git add -A && git commit -mWIP'
$ git config --global alias.unwip '!git reset --soft $(git log -1 --format=format:"%H" --invert-grep --grep "^WIP$")'

Π’Π΅ΠΏΠ΅Ρ€ Π²ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ використовувати:

  • git wip: Π·Π°ΠΊΠΎΠΌΡ–Ρ‚ΠΈΡ‚ΠΈ всі Π·ΠΌΡ–Π½ΠΈ як WIP.
  • git unwip: скасувати останній ΠΊΠΎΠΌΡ–Ρ‚ Ρ–Π· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ β€œWIP”.

Коли Π²Π°Ρ€Ρ‚ΠΎ використовувати Git stash?

Git stash Π½Π°ΠΉΠΊΡ€Π°Ρ‰Π΅ ΠΏΡ–Π΄Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ для розбиття Π²Π΅Π»ΠΈΠΊΠΈΡ… Π·ΠΌΡ–Π½ Π½Π° ΠΌΠ΅Π½ΡˆΡ– ΠΊΠΎΠΌΡ–Ρ‚ΠΈ. Наприклад:

// ΠŸΠΎΡ‡Π°Ρ‚ΠΊΠΎΠ²ΠΈΠΉ ΠΊΠΎΠ΄
function greet() {
  console.log("Hello, world!");
}

Π’ΠΈ Ρ€ΠΎΠ±ΠΈΡ‚Π΅ Π²Π΅Π»ΠΈΠΊΡƒ Π·ΠΌΡ–Π½Ρƒ:

// Π—ΠΌΡ–Π½Π΅Π½ΠΈΠΉ ΠΊΠΎΠ΄
const now = new Date();
function greet(name) {
  const greeting = now.getHours() < 12 ? "Good morning" : "Hello";
  console.log(`${greeting}, ${name}!`);
}

ВикористайтС git stash для збСрСТСння ΠΊΡ–Π½Ρ†Π΅Π²ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ Ρ‚Π° ΠΏΠΎΠ΅Ρ‚Π°ΠΏΠ½ΠΎΠ³ΠΎ додавання Π·ΠΌΡ–Π½ Π΄ΠΎ ΠΊΠΎΠΌΡ–Ρ‚Ρ–Π².

$ git stash push --include-untracked
$ git stash apply

Висновок:

Git stash β€” Ρ†Π΅ Π·Ρ€ΡƒΡ‡Π½ΠΈΠΉ інструмСнт для тимчасового збСрСТСння Π½Π΅Π·Π°ΠΊΠΎΠΌΡ–Ρ‡Π΅Π½ΠΈΡ… Π·ΠΌΡ–Π½, особливо для розбиття Π²Π΅Π»ΠΈΠΊΠΈΡ… Π·ΠΌΡ–Π½ Π½Π° ΠΌΠ΅Π½ΡˆΡ– ΠΊΠΎΠΌΡ–Ρ‚ΠΈ. Однак для пСрСмикання ΠΌΡ–ΠΆ Π³Ρ–Π»ΠΊΠ°ΠΌΠΈ ΠΊΡ€Π°Ρ‰Π΅ використовувати тимчасові ΠΊΠΎΠΌΡ–Ρ‚ΠΈ (β€œWIP”), Ρ‰ΠΎΠ± ΡƒΠ½ΠΈΠΊΠ½ΡƒΡ‚ΠΈ Π²Ρ‚Ρ€Π°Ρ‚ΠΈ Π΄Π°Π½ΠΈΡ… Ρ– спростити управління Ρ–ΡΡ‚ΠΎΡ€Ρ–Ρ”ΡŽ. Π’ΠΈΠ±ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄, який Π½Π°ΠΉΠΊΡ€Π°Ρ‰Π΅ ΠΏΡ–Π΄Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ для вашого Ρ€ΠΎΠ±ΠΎΡ‡ΠΎΠ³ΠΎ процСсу, Ρ– Ρ‚Ρ€ΠΈΠΌΠ°ΠΉΡ‚Π΅ Ρ–ΡΡ‚ΠΎΡ€Ρ–ΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Ρ‡ΠΈΡΡ‚ΠΎΡŽ Ρ‚Π° Π·Ρ€ΠΎΠ·ΡƒΠΌΡ–Π»ΠΎΡŽ!