Ant*_*elo 5 git git-stash git-reset git-commit git-branch
我在这种情况下有一个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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我有:
我的老师希望我暂时中止工作,创建一个BUGFIX文件,提交并恢复以前的状态。
我通过以下命令实现了它:
git stash --include-untracked
touch BUGFIX
git add BUGFIX
git commit -m "Aggiunto file BUGFIX"
git stash pop --index
Run Code Online (Sandbox Code Playgroud)
使用这些命令,我保存了初始状态,并在提交修复程序后将其恢复。我的老师还要求我不要使用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^
Run Code Online (Sandbox Code Playgroud)
使用git reset --soft我恢复了索引,但未暂存的更改已丢失。
使用git reset --mixed我恢复了未暂存的更改,但索引已丢失。
一旦提交修订而不使用git stash,如何恢复相同的初始状态?
让我们这样试试:
问:如何在 Git 中保存一些东西?
答:答应吧。
Q:怎么样git stash,好像可以保存东西,它是怎么做到的?
答:它承诺。
问:但它没有在我的分支上提交任何提交。1
A:他们在特殊的“藏匿”东西上,这不是一个分支。但他们仍然提交。
1从技术上讲,这不是一个问题。:-)
这是 Git 的底线,就像它一样:提交可以保存东西。否则,您所拥有的只是工作树中的内容和索引(暂存区)中的内容。当您运行git commit. 工作树的东西从来都不是永久的:你必须将它复制到暂存区然后提交。
这就是git stash它的作用。它实际上进行了两次提交,一次用于当前索引,一次用于工作树。2 它只是使它们都位于分支以外的其他东西上,而是使用名称stash来查找它们。
不过,没有什么能阻止你做出自己的承诺。进行两次或多次提交然后必须撤消它们只是有点痛苦,这就是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 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
Run Code Online (Sandbox Code Playgroud)
或者
touch BUGFIX
git add BUGFIX
git commit --only BUGFIX -m "emergency BUGFIX"
Run Code Online (Sandbox Code Playgroud)