1

这在我身上经常发生:

经过一天的编码后,我开始为某个功能进行相关更改。我主要通过“git add -p”来选择性地只添加相关的更改(保持调试的东西等等)。

但后来我意识到我也做了一些同样值得承诺的事情。它与功能无关,但会影响相同的代码。因此我想在此之前提交。不幸的是,我已经花了很多时间来展示这个功能。你如何处理这种情况?

我目前的解决方案是这样的:

(想象部分功能“B”已经上演,现在你意识到有功能“A”)

cp .git/index .git/index_bak #Save partly staged feature B
git reset                    #Start again
git add -p                   #Stage only A
git commit                   #Commit only A
mv .git/index_bak .git/index #Restore stage. This is now a bit strange
                             #as it seems to remove feature A. Therefore
                             #reapply feature A (which is still in the
                             #working directory) again - only to the stage

git diff -U0 HEAD~1.. | git apply --cached --unidiff-zero

git add -p                   #Continue stageing B
4

3 回答 3

3

不要扰乱您的分期流程。
完成您的初始提交,然后继续执行您注意到的功能。

一旦你完成了所有的登台并进行了所有的提交(本地),你仍然可以做一个交互式的 rebase 并重新排序这些提交。

于 2018-02-25T00:10:41.367 回答
2

正如您所注意到的,手动弄乱索引有点困难。因此,我建议您习惯不涉及使用它的工作流程。

您可能有几个选项可以让您将工作拆分为多个提交:

最简单的解决方案可能是先查看您的更改,然后再开始选择您要提交的更改。这样,您将不得不考虑首先要上演什么。因此,当您对其中的多个提交进行更改时,您可以先制定该计划,然后仅暂存您想要为第一次提交暂存的那些更改。

如果您已经开始暂存提交,然后想要进行不同的提交,您也可以先重置索引。当然,这会扔掉你已经上演过的东西,所以你必须在之后重做,但现在你可能知道你需要上演什么,所以它可能会更快。

减少问题的一种方法是实际撤消那些您不想包含在任何提交中的更改。因此,如果您准备好提交,但仍然有调试代码,无论如何您都想摆脱这些代码,您可以在重置索引之前先撤消这些更改。因此,当您随后进行其他提交时,您可能只需一次添加所有更改,而无需使用git add -p.

另一种方式,这是我经常做的事情,就是只提交部分,然后稍后以交互方式重新设置这些部分。因此,当您开始为提交 A 准备阶段,然后遇到提交 B 的内容时,只需提交您已经为 A 准备的任何内容。然后为提交 B 执行内容,然后再次继续执行 A。完成所有操作后,请使用交互式 rebase 以您希望历史实际看起来的方式重新排序和合并提交。

虽然这是最复杂的方式,涉及到可能更高级的交互式变基,但它也使您可以更好地控制所有内容,并且您不需要丢弃(暂存)工作,您已经完成了。

于 2018-02-25T00:13:33.200 回答
0

除了pokeVonC的答案,如果你的 Git 至少是 2.5,考虑使用git worktree add创建一个新的独立分支,在那里你可以做完全独立的工作。请注意,所有未提交的更改(在索引和/或工作树中)都不会被复制到新添加的工作树中。

每个工作树都有自己的私有HEAD和索引(当然还有自己独立的工作树)。Git 做了一个相当强的约束:每个添加的工作树必须与其他工作树(包括主工作树)位于不同的分支上。但是,您可以在创建新工作树的过程中创建一个新分支,这使得这个约束很容易处理。

于 2018-02-25T01:46:48.793 回答