如何在 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