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

标签 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"
  • 我修改了文件 A,其中包含“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 我恢复了未暂存提交但索引已丢失的更改。

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

最佳答案

让我们这样试试:

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

  • 答:提交。

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

  • 答:它 promise 。

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

  • 答:他们在特殊的“stash ”处,不是分支机构。但它们仍然是提交。


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


如果你想在 Git 中保存一些东西,提交它

这可以说是 Git 的底线:提交可以保存东西。否则,您所拥有的只是工作树中的内容,以及索引(暂存区)中的内容。当您运行 git commit 时,暂存区的东西会永久存在。工作树的内容从不是永久的:您必须将其复制到暂存区然后提交。

这就是 git stash 所做的。它实际上进行了两次 提交,一次针对当前索引,一次针对工作树。2 它只是在分支以外的其他地方进行提交,使用名称stash 以找到它们。

不过,没有什么能阻止您做出自己的 promise 。进行两次或多次提交然后必须撤消它们只是有点痛苦,这就是 git stash 存在的原因。


2当您像以前那样使用 --include-untracked 时,它实际上进行了三次 提交:一次用于索引,一次用于索引用于工作树,第三个用于未跟踪文件。第三次提交非常棘手,无论是制作还是恢复。 stash 脚本使用临时索引而不是尝试在主索引中完成工作。


你总是可以使用另一个克隆

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

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

为了快速完成副业,git worktree add(仅限 2.5 和更新版本)

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

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

关于git - 如何在不使用 git-stash 的情况下保存正在进行的工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41226396/

相关文章:

git - 如何找到 git 分支中 merge 后会更改另一个分支的所有文件

linux - 在提示符下配置 git 分支

git - 为新项目创建一个新的空分支

git - 如果没有新的提交,是否可以在 git 中查看谁 merge 了分支?

git - 在 git 中强制推送个人分支是否安全?

git - 向 Microsoft 请求凭据后 URL 身份验证失败

git - 使用 BFG 清除文件后无法推送到 >2gb 存储库

git - 对某些分支使用 git-hooks(使用 Husky 和 ​​git-branch-is)

git - 如何恢复未提交的更改,包括文件和文件夹?

xcode - 如何从 Xcode 8 上的先前提交中恢复?