如何在 Git 中暂存更改?


这个问题可以改述为“如何在 Git 中保存工作进度 (WIP) 并方便时返回?”

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

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

$ git init                  // initialize an empty repo
$ echo abc>abc.txt          // create a file and add some text to it
$ git add abc.txt           // stage the file
$ git commit −m abc.txt     // commit changes to the repo
$ git checkout feature      // Switch to the feature branch
$ git log −−oneline         // Display commit history
$ echo lmno>lmno.txt        // create a file and add some text
$ git add lmno.txt          // stage the file
$ git commit −m 'save lmno' // commit changes to the repo
$ echo lmno lmno>>lmno.txt  // append data to the file
$ 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

将工作进度 (WIP) 推送到暂存区

我们不想提交更改,因为我们还没有完成。在这种情况下,我们需要暂存我们的更改。暂存意味着将东西存储在安全的地方。我们将其存储在 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

暂存后,工作树将是干净的。现在协作者可以切换到任何其他分支并进行一些重要工作。完成后,协作者可以再次切换回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 // lists contents of the current directory
$ cat newfile.txt // lists contents of newfile.txt
$ cat lmno.txt // list contents of lmno.txt

输出如下所示 −

//output of ls
abc.txt lmno.txt newfile.txt
//output of cat newfile.txt
hello
//output of cat lmno.txt
lmno
lmno lmno

清理暂存区

成功应用暂存区后,我们可能需要清理内容,因为暂存区不会默认删除。我们可以使用以下命令删除特定暂存区。

$ git stash drop 0

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

$ git stash clear

更新于:2021年2月20日

700 次浏览

启动您的 职业生涯

完成课程获得认证

开始学习
广告