Git Stash-保存更改以供以后使用
在本教程中,我们将学习在Git中存储更改。
git stash
当我们要保存而不希望提交在工作目录中所做的更改并稍后返回时,可以使用git stash命令。
示例:假设您要添加一个新函数。
然后,迫切需要修复一个错误。
您尚未准备好使用新函数,并且尚未在Git存储库中提交它。
因此,在这种情况下,您可以存储更改并返回工作目录的最后提交状态并修复错误。
完成后,您可以从存储中找回"新函数"的更改并继续进行操作。
Stash是在本地
当我们执行git stash
命令时,我们将更改存储在本地存储库中,并且这些存储区永远不会移至存储库服务器。
以下是我们在"设置Git"存储库教程中创建的git-project的状态。
$git status On branch master nothing to commit, working tree clean
以下是存储库中的文件。
$ls -la total 0 drwxr-xr-x 5 staff 170 Nov 12 19:46 . drwxr-xr-x 28 staff 952 Nov 14 22:42 .. drwxr-xr-x 14 staff 476 Nov 16 19:00 .git -rw-r--r-- 1 staff 0 Nov 12 19:26 index.php drwxr-xr-x 3 staff 102 Nov 12 19:46 js
让我们对index.php文件进行一些更改,并使用git status命令检查工作目录的状态。
$git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: index.php no changes added to commit (use "git add" and/or "git commit -a")
现在,假设我们要恢复为工作目录的初始状态,并且我们不想丢失对index.php文件所做的更改。
在这种情况下,我们将使用git stash命令存储更改。
$git stash Saved working directory and index state WIP on master: f066f07 initial commit HEAD is now at f066f07 initial commit
现在所有更改都被隐藏,我们回到上一次提交。
在上面的输出中,我们看到消息...主服务器上的WIP:f066f07初始提交...,这意味着更改存储在master分支上,并且存储在最后一次提交f066f07上。
默认情况下,存储区在分支顶部被标记为WIP-"正在进行中",并从中提交创建存储区。
如果我们现在执行git status
命令,我们将得到以下内容。
$git status On branch master nothing to commit, working tree clean
附带信息
要创建带有消息的存储,我们使用git stash save" message"命令,其中,"" message"
是我们要为该存储设置的内容。
$git stash save "new feature"
git stash的默认行为
默认情况下,git stash
命令将存储正在跟踪的文件,即已经添加到Git存储库中或者已暂存的文件,即准备提交。
默认情况下,不会通过git stash命令隐藏被忽略的文件(忽略Git)和新创建但尚未暂存的文件。
隐藏未跟踪的文件
要存储未跟踪的文件,我们使用git stash -u命令。
假设我们在项目文件夹中创建一个新文件README,并使用git status命令检查存储库的状态。
$git status On branch master Untracked files: (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track)
如果我们使用git stash
命令,那么新文件README将不会被保存,因为它没有被跟踪并且未在Git存储库中提交。
$git stash No local changes to save
为了存放新文件,我们必须使用-u选项。
$git stash -u Saved working directory and index state WIP on master: f066f07 initial commit HEAD is now at f066f07 initial commit
全部隐藏
要存储所有文件(跟踪的,暂存的,新文件,忽略的文件),我们使用git stash -a命令。
列出Stash
要列出存储,我们使用git stash list
命令。
$git stash list stash@{0}: WIP on master: f066f07 initial commit stash@{1}: WIP on master: f066f07 initial commit
在上面的输出中,我们看到两个存储,它们分别标记为stash @ {0}和stash @ {1}。
应用Stash
如果我们想重新应用最近创建的存储,我们使用git stash pop
命令。
$git stash pop Already up-to-date! On branch master Untracked files: (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track) Dropped refs/stash@{0} (af18d2ac781301c4f9a6cd14f21be74083dd0129)
在上面的输出中,我们可以看到已隐藏的README文件现在重新应用于工作目录。
最后一行Dropped refs/stash @ {0}表示从存储列表中删除了存储stash @ {0}。
重新应用特定的存储
要重新应用特定的存储,我们使用git stash pop stash @ {id}
命令。
$git stash pop stash@{0}
删除特定的存储
要删除特定的存储,我们使用git stash drop stash @ {id}
命令。
$git stash save "new feature" Saved working directory and index state On master: new feature HEAD is now at f066f07 initial commit $git stash list stash@{0}: On master: new feature $git stash drop stash@{0} Dropped stash@{0} (d1b5d4fbabaf246d8436dd038fdca23cc9a90a29)
删除所有藏匿处
要删除所有存储,我们使用以下命令。
$git stash clear