这个问题可以改写为“如何在 Git 中保存正在进行的工作 (WIP) 并在方便时返回到它?”
问题- 当我们切换分支时,Git 会重置我们的工作目录以包含存储在目标分支的最后一次提交中的快照。例如,如果我们从feature切换到master分支,Git 会将工作目录中的内容替换为master分支的最后一次提交。但是如果我们的工作目录中有尚未提交的本地更改,这些更改将丢失。在这种情况下,Git 将不允许我们切换分支。让我们看看这是如何发生的以及我们应该如何解决这个问题。
示例- 创建一个空的存储库并执行下面给出的命令。该示例显示我们正在功能分支中工作,编辑和添加文件。突然,我们可能不得不切换到 master 以立即修复master分支中的错误。它不允许我们切换到主分支,因为我们在功能分支中有一些正在进行的工作(WIP)。
$ git init // 初始化一个空仓库 $ echo abc>abc.txt // 创建一个文件并向其中添加一些文本 $ git addabc.txt // 暂存文件 $ git commit −mabc.txt // 提交对 repo 的更改 $ git checkout feature // 切换到功能分支 $ git log −−oneline // 显示提交历史 $ echo lmno>lmno.txt // 创建一个文件并添加一些文本 $ git addlmno.txt // 暂存文件 $ git commit −m 'save lmno' // 提交对 repo 的更改 $ echo lmno lmno>>lmno.txt // 将数据附加到文件 $ git checkout master // Switch to the master branch
当我们尝试切换分支时,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
我们不想提交我们的更改,因为我们还没有完成。在这种情况下,我们需要隐藏我们的更改。藏匿意味着将东西存放在安全的地方。我们将把它存储在 Git 存储库的一个单独的存储区中。藏匿不会成为我们历史的一部分。让我们看看它是如何工作的。
以下命令将位于暂存区并等待提交的工作推送到存储中。该-m标志用于提供一个存储消息。
$ git stash push −m 'working on lmno file not completed '
默认情况下,未跟踪的文件不包含在您的存储中。要推送未跟踪的文件,即工作目录中的文件,我们需要包含选项-am标志。让我们看一个例子 -
$ echo hello >newfile.txt//create a file in the working area $ git stash push −am 'my new stash' //push untracked files into the stash
要查看所有存储,请使用命令 - git stash list
$ git stash list
该命令返回所有隐藏。请注意,最新的存储将列在列表的顶部,即索引 0。
stash@{0}: On feature: my new stash stash@{1}: On feature: working on lmno file not completed
藏匿后,工作树将是干净的。现在协作者可以切换到任何其他分支并做一些重要的工作。完成后,协作者可以再次切换回功能分支。此时,我们决定将其中一个存储应用到我们的工作目录中。
要将隐藏的更改应用回我们的工作目录,我们可以使用以下命令 -
$ 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 // lists contents of the current directory $ catnewfile.txt// lists contents of newfile.txt $ catlmno.txt// list contents of lmno.txt
输出如下所示 -
//output of ls abc.txtlmno.txtnewfile.txt //output of cat newfile.txt hello //output of cat lmno.txt lmno lmno lmno
成功应用 stash 后,我们可能需要清理一些东西,因为默认情况下不会删除 stash。我们可以使用以下命令删除特定的存储。
$ git stash drop 0
要一次性清除存储中的全部内容,我们可以使用以下命令
$ git stash clear