Π―ΠΊΡΠΎ Π²ΠΈ ΡΠ΅ Π½Π΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°Π»ΠΈ 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β), ΡΠΎΠ± ΡΠ½ΠΈΠΊΠ½ΡΡΠΈ Π²ΡΡΠ°ΡΠΈ Π΄Π°Π½ΠΈΡ Ρ ΡΠΏΡΠΎΡΡΠΈΡΠΈ ΡΠΏΡΠ°Π²Π»ΡΠ½Π½Ρ ΡΡΡΠΎΡΡΡΡ. ΠΠΈΠ±ΠΈΡΠ°ΠΉΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄, ΡΠΊΠΈΠΉ Π½Π°ΠΉΠΊΡΠ°ΡΠ΅ ΠΏΡΠ΄Ρ ΠΎΠ΄ΠΈΡΡ Π΄Π»Ρ Π²Π°ΡΠΎΠ³ΠΎ ΡΠΎΠ±ΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡ, Ρ ΡΡΠΈΠΌΠ°ΠΉΡΠ΅ ΡΡΡΠΎΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡ ΡΠΈΡΡΠΎΡ ΡΠ° Π·ΡΠΎΠ·ΡΠΌΡΠ»ΠΎΡ!