如何在不使用git-stash的情况下保存正在进行的工作?

时间:2016-12-19 15:52:01

标签: git git-branch git-commit git-stash git-reset

我有一个这种情况的git目录:

ProgSoul@PROGSOUL-LENOVO:~/esercizio3_2$ git status
Sul branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   A

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   A

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        B

在这种情况下,我有:

  • 索引中有一个名为A的文件,里面有一个字符串“AA”
  • 我在其中修改了带有“AAA”的文件A,但我没有在舞台上添加此更改。所以在工作目录中我有一个字符串“AAA”在里面
  • 未跟踪的空文件B

我的老师要我暂时暂停工作,创建一个BUGFIX文件,提交它并恢复我之前的状况。

我通过以下命令实现了它:

git stash --include-untracked
touch BUGFIX
git add BUGFIX
git commit -m "Aggiunto file BUGFIX"
git stash pop --index

使用这些命令,我​​保存了我的初始状态,并在我的修复提交后恢复了它。 我的老师也让我在不使用git-stash的情况下达到了这个目标。

我按照了藏匿文档中的帮助:

git checkout -b WIP
git commit -a -m "WIP"
git checkout master
touch BUGFIX
git add BUGFIX
git commit -a -m "BUGFIX"
git checkout WIP
git reset --soft HEAD^

使用git reset --soft我恢复了索引但是没有为提交暂存的更改已经丢失。

使用git reset --mixed我恢复了没有为commit提交的更改但索引已丢失。

如果我在不使用git stash的情况下提交修复程序,如何恢复相同的初始状态?

4 个答案:

答案 0 :(得分:4)

让我们这样试试:

  • 问:你如何在Git中保存一些东西?

  • 答:提交。

  • 问:git stash怎么样,它似乎可以保存,它是如何管理的?

  • 答:提交。

  • 问:但它没有在我的分支上提交任何提交。 1

  • 答:他们是在特殊的“藏匿”事物上,而不是分支。但他们仍然在提交。

1 从技术上讲,这不是一个问题。 : - )

如果你想在Git中保存一些内容,请提交

这是Git的底线,因为它是:提交保存的东西。否则你所拥有的就是工作树中的东西,以及索引中的东西(staging-area)。当您运行git commit时,暂存区域内容将变为永久性。工作树的东西永远不会永久性:你必须将它复制到暂存区域然后提交它。

这是git stash的作用。它实际上使两个提交,一个用于当前索引,一个用于工作树。 2 它只是使它们在除分支之外的其他东西上,使用名称stash要找到它们。

但是,没有什么能阻止你做出自己的提交。做两个或更多提交然后必须撤消它们只是有点痛苦,这就是git stash存在的原因。

2 当您使用--include-untracked时,它实际上会使三个提交:一个用于索引,另一个用于工作树,以及第三个用于未跟踪文件。第三次提交是非常棘手的,无论是制作还是恢复。存储脚本使用临时索引而不是尝试在主索引中执行工作。

您可以随时使用其他克隆

每个Git存储库通常独立于所有其他Git存储库,但可以与任何相关的Git存储库对等。因此,您可以将一个存储库克隆到另一个存储库,从而获得另一个可以工作的工作树。此工作树还带有自己的(单独的)索引/暂存区域。

如果在本地创建克隆,在本地文件系统上,Git通常能够避免大量的存储库文件复制。因此虽然这看起来很昂贵,但通常并不那么糟糕。主要问题是你现在有两个存储库要记住提交,你必须在它们和/或你最初克隆的上游之间获取和/或推送。

对于快速侧面工作,git worktree add(仅限2.5和更新版本)

在Git 2.5之前,有一个“贡献”脚本来制作备用工作树。从2.5开始,它得到了官方的支持,但从那时起就有一些重要的错误修复(现在它还有一些粗糙的边缘)。您现在可以运行git worktree add来创建一个新的工作树,它将使用不同的分支,但共享底层存储库。

共享一个底层存储库的两个工作树不能使用相同的分支。 (这是因为Git存储了“当前分支”和“当前提交”的概念,以及当你进行 new 提交时Git推进当前分支的方式。)如果你的目标,但是,要在某个其他分支中修复,而不是现在正在处理的分支,这正是您所需要的。

答案 1 :(得分:1)

Git有一个鲜为人知的功能,内置于此。

echo fix fix >> BUGFIX
git add BUGFIX
git commit BUGFIX

...如果已经跟踪BUGFIX,您甚至不需要git add,它会为您做到这一点。见the git commit description的第3点:

  

列出文件作为commit命令的参数(没有--interactive或--patch switch),在这种情况下,提交将忽略索引中暂存的更改,而是记录列出的文件的当前内容(必须已经被Git知道;

虽然描述没有说明,但当前内容会被添加到索引以及提交中。

答案 2 :(得分:1)

感谢我收到的每一个答案。我实现了两种可能的解决方案:

git worktree add -b BUGFIX ../bugfix_temp master
pushd ../bugfix_temp
touch BUGFIX
git add BUGFIX
git commit -a -m "emergency BUGFIX"
popd
rm -rf ../bugfix_temp
git worktree prune

OR

touch BUGFIX
git add BUGFIX
git commit --only BUGFIX -m "emergency BUGFIX"

答案 3 :(得分:1)

如果您要保存但尚未提交的文件中有大量更改,那么一个选择就是获取更改的差异并将其保存到文件中并将差异存储在其他位置。< / p>

git diff changedfile > ~/diff_of_an_idea.diff
git restore changedfile # back to original

然后稍后要添加差异

git apply ~/diff_of_an_idea.diff
git add & git commit