如何在 Git 中存储更改?

gitlinuxopen sourcesoftware & coding

这个问题可以改写为"如何在 Git 中保存正在进行的工作 (WIP) 并在以后方便时返回?"

问题 − 当我们切换分支时,Git 会重置我们的工作目录,以包含目标分支最后一次提交的快照。例如,如果我们从 feature 分支切换到 ma​​ster 分支,Git 会将工作目录中的内容替换为 ma​​ster 分支的最后一次提交。但如果我们的工作目录中有尚未提交的本地更改,这些更改将会丢失。在这种情况下,Git 不允许我们切换分支。让我们看看这是如何发生的,以及我们应该如何解决这个问题。

示例 − 创建一个空的仓库并执行以下命令。示例显示我们正在 feature 分支中编辑和添加文件。突然,我们可能需要切换到主分支以立即修复 ma​​ster 分支中的错误。由于 feature 分支中有一些正在进行的工作 (WIP),因此无法切换到 ma​​ster 分支。

$ git init // 初始化一个空的仓库
$ echo abc>abc.txt // 创建一个文件并向其中添加一些文本
$ git add abc.txt // 暂存文件
$ git commit −m abc.txt // 将更改提交到仓库
$ git checkout feature // 切换到功能分支
$ git log −−oneline // 显示提交历史记录
$ echo lmno>lmno.txt        // 创建文件并添加文本
$ git add lmno.txt          // 暂存文件
$ git commit −m 'save lmno' // 将更改提交到仓库
$ echo lmno lmno>>lmno.txt  // 将数据附加到文件
$ git checkout master       // 切换到 master 分支

当我们尝试切换分支时,Git 会提示我们暂存更改。

delI@DESKTOP-N961NR5 MINGW64 —/Desktop/Internship/Batch_01/Session03/git/test-re
po (feature)
$ git checkout master
error: Your local changes to the following files would be overwritten by checkout
Imno. txt
please commit your changes or stash them before you switch branches.
Aborting

将正在进行的工作 (WIP) 推送到存储区

由于更改尚未完成,我们不想提交。在这种情况下,我们需要存储更改。存储意味着将内容存储在安全的地方。我们将把这些内容存储在 Git 仓库中一个单独的存储区中。存储不会成为历史记录的一部分。让我们看看它是如何工作的。

以下命令将位于暂存区并等待提交的工作推送到存储区。−m 标志用于提供存储消息。

$ git stash push −m 'working on lmno file not completed '

默认情况下,未跟踪的文件不包含在存储区中。要推送未跟踪的文件(即工作目录中的文件),我们需要包含选项 −am 标志。让我们看一个示例 −

$ echo hello > newfile.txt //在工作区创建一个文件
$ git stash push −am 'my new stash' //将未跟踪的文件推送到存储区

要查看所有存储区,请使用命令 − git stash list

$ git stash list

该命令返回所有存储区。请注意,最新的存储将列在列表顶部,即索引 0 处。

stash@{0}: 功能:我的新存储
stash@{1}: 功能:lmno 文件处理未完成

存储后,工作树将清空。现在,协作者可以切换到任何其他分支并执行一些重要工作。完成后,协作者可以再次切换回 feature 分支。此时,我们决定将其中一个存储应用到我们的工作目录。

应用存储

要将存储的更改应用回我们的工作目录,我们可以使用以下命令 −

$ git stash apply <index_number>

以下示例将存储序列应用于索引 0 和索引 1

$ git stash apply 0
$ git stash apply 1

输出显示存储已被应用,现在我们的工作目录将按预期包含所有更改。

dell@DESKTOP−N96LNR5 MINGw64 /e/tut_repo (feature)
$ git stash apply 0
Al ready up to date!
On branch feature
untracked files:
(use ''git add <file>… " to include in what will be committed)

newfile. txt
nothing added to commit but untracked fi les present

dell@DESKTOP-N961NR5 MINGW64 /e/tut_repo (feature)
$ git stash apply 1
On branch feature
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: Imno.txt
untracked files:
(use "git add <file>… " to include in what will be committed)
no changes added to commit (use "git add" and/or "git commit −a")

我们可以使用以下命令验证工作目录的内容 −

$ ls // 列出当前目录的内容
$ cat newfile.txt // 列出 newfile.txt 的内容
$ cat lmno.txt // 列出 lmno.txt 的内容

输出如下所示 −

//ls 的输出
abc.txt lmno.txt newfile.txt
//cat newfile.txt 的输出
hello
//cat lmno.txt 的输出
lmno
lmno lmno

清理存储

成功应用存储后,我们可能需要清理一些内容,因为存储默认情况下不会被删除。我们可以使用以下命令删除特定的存储。

$ git stash drop 0

要一次性清除存储中的所有内容,我们可以使用以下命令

$ git stash clear

相关文章


有用资源