如何在 Git 中存储更改?
这个问题可以改写为"如何在 Git 中保存正在进行的工作 (WIP) 并在以后方便时返回?"
问题 − 当我们切换分支时,Git 会重置我们的工作目录,以包含目标分支最后一次提交的快照。例如,如果我们从 feature 分支切换到 master 分支,Git 会将工作目录中的内容替换为 master 分支的最后一次提交。但如果我们的工作目录中有尚未提交的本地更改,这些更改将会丢失。在这种情况下,Git 不允许我们切换分支。让我们看看这是如何发生的,以及我们应该如何解决这个问题。
示例 − 创建一个空的仓库并执行以下命令。示例显示我们正在 feature 分支中编辑和添加文件。突然,我们可能需要切换到主分支以立即修复 master 分支中的错误。由于 feature 分支中有一些正在进行的工作 (WIP),因此无法切换到 master 分支。
$ 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
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

