Git Stash-保存更改以供以后使用

时间:2020-02-23 14:33:23  来源:igfitidea点击:

在本教程中,我们将学习在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