我想使用这个工作流:
进行一些改变。 将未分阶段的更改保存到存储中。 用阶段中的东西做一些事情(构建、测试等)。 提交。 恢复未分阶段的更改。
有办法完成第二步吗?
例子:
git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git stash push
test
git commit
git stash pop
我想使用这个工作流:
进行一些改变。 将未分阶段的更改保存到存储中。 用阶段中的东西做一些事情(构建、测试等)。 提交。 恢复未分阶段的更改。
有办法完成第二步吗?
例子:
git init
echo one >file
git add file
git commit
echo two >>file
git add file
echo three >>file
git stash push
test
git commit
git stash pop
当前回答
扩展前面的回答,我有时会有一组复杂的更改,但希望先提交一个单独的更改。例如,我可能发现了一个错误或其他不正确的代码,我想在进行阶段性更改之前修复它。一个可行的方法是:
首先把所有东西都藏起来,但保留阶段性的变化
$ git保存——keep-index[——include-untracked]
现在也将阶段性更改单独保存
$ git保存
为解决问题做出改变;和测试;提交:
$ git add[——interactive][——patch] $ git commit -m"fix…"
现在恢复之前的更改:
$ git隐藏pop
解决任何冲突,并注意如果存在冲突,git将应用而不是删除顶部的隐藏条目。
(…然后提交分阶段的更改,并恢复所有其他更改的存储,然后继续…)
其他回答
我对Python程序如何预提交感兴趣。这是代码。 https://github.com/pre-commit/pre-commit/blob/3fe38dff05957f609cf7b97f471b35a8d9e0659a/pre_commit/staged_files_only.py#L50
它在功能上等同于:
git diff-index --ignore-submodules --binary --exit-code --no-color --no-ext-diff $(git write-tree) -- >stash.patch
git checkout -- .
# Do stuff now
git apply stash.patch && rm stash.patch
这是(在我看来)最好的解决方案,这完全符合OP的要求。它只存储未暂存的、被跟踪的文件——无需不必要的提交或使用——keep-index存储所有更改的文件
它列出了所有未分段的、跟踪的更改(git diff——name-only),将换行符转换为空格(| tr '\n' ' ' '),并使用git stash push存储所有这些文件:
git stash push $(git diff --name-only | tr '\n' ' ')
Git stash push有一个选项——keep-index,这正是你所需要的。
运行git stash push——keep-index。
git stash save --keep-index
此外,Re:
为什么不在提交更改之后提交它们呢?——心
答:因为你应该总是签入测试过的代码:)这意味着,你只需要用你即将提交的更改来运行测试
当然,作为一名有经验的程序员,您天生就有测试和检查这些更改的冲动——这只是在开玩笑
从Git 2.35+ (Q1 2022)开始,你现在可以在Git stash推送上使用——staging标志(man)来只stage你的索引的变化。
既然你的问题正好相反,我们有两个选择:
像这样反向操作:
git stash push --staged # Stash staged changes
git stash # Stash everything else
git stash pop stash@{1} # Restore staged changes stash
阶段性的更改是你想要保存的,而不是你想要保留的。现在你可以运行:
git stash push --staged
我从另一个S/O帖子的回答中得到了这个信息。