当正在进行的提交突然看起来依赖于另一个尚未提交的提交时,该如何处理呢?


13

我对Git经验不足,但是我会尽力去适应它,到目前为止,我只是将它用于我自己从事的项目。

当我编写代码时,自然会有一些自上而下的方法(因为我不知道未来),并且有一个重复出现的主题:

我做一些工作。
我发现要使我的工作变得“值得承担”,我需要做其他工作。
其他工作值得自己承担。

所谓可承诺的东西,是指可以编译的东西,或者不是完全混乱的东西。
通过某种值得它自己提交的东西,我指的是我了解到提交应该只做一件事。

我解决它的方法很麻烦。如果其他工作在另一个文件中,则我创建一个新分支,在那里提交并合并。如果工作在同一文件中.. ugh ..我进行本地复制并将文件重置为HEAD中的状态,进行所需的提交,然后开始从该副本恢复我的工作。我实际上应该如何处理?我没有想到这是这样吗?我不这么认为,因为它一定会经常出现在每个人身上(至少他们也不知道未来)。还是似乎我的工作流程可能有缺陷?


1
我经常在添加库和配置时发现自己处于相同的情况。我只是git status用来查看所有已更改的文件,并通过git add与特定文件(而不是git add --all)一起使用并进行逐个提交来进行两次或多次提交。
克里斯·西里菲斯

您可以使用选择文件的一部分git add -p,然后仅提交那些部分。这是一项非常强大的技术,我几乎一直都在使用它。
eush77

Answers:


17

有多种解决方法。

如果您想在不影响当前更改的情况下进行第一次提交的更改,则可能要使用git stash。这样会将您所有未完成的更改都收起来,让您以后可以将其还原。使用git status地看到,它们不存在了。现在按照您的习惯创建第一个提交。接下来,您可以使用它git stash pop来还原原始更改并创建第二个提交,从而完成主要工作。

另一种方法是进行所有必需的更改,然后创建两个提交,两个提交都包含工作的一部分。为此,您可以使用git提供的索引(也称为暂存区域)。这是可以用来准备提交的特殊区域。假设您已经更改了多个文件,则可以使用将每个文件添加到索引中git add。执行git commit此操作时,只会提交添加到索引的文件。git status将向您显示更改的哪些部分将被提交,哪些不被提交。例如,在更改文件a.txt,b.txt和c.txt之后,它将执行以下操作git add a.txt

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

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:   b.txt
        modified:   c.txt

当你正在做git commit在这种状态下,只有改变A.TXT将被添加到您的承诺。

另外,您可以使用来查看要提交的确切更改git diff --cached,这将向您显示所有将要提交的更改的差异。

如果一个文件包含两个提交的更改,则还可以使用“ git add --patch b.txt”将其仅一部分添加到索引中。git将为您提供一种交互模式,询问您是否应将给定文件中的每个更改添加到索引中。如果行之间的更改彼此相邻,而这需要在两次提交中进行拆分,则这可能会变得更加困难,但是也有解决方法。

如果您想了解有关登台区域的更多信息,则可能需要阅读以下内容:http : //gitready.com/beginner/2009/01/18/the-staging-area.html

您可能还想在此处阅读有关交互式添加的更多信息:http : //nuclearsquid.com/writings/git-add/


5

如果您对Git使用GUI,例如Atlassian的SourceTree或git gui,则可以提交文件的一部分,而使其他部分不提交。实际上,您可以提交单独的代码行。

当我跌倒您描述的兔子洞时,我经常这样做。这是使该明智的提交或主要提交的先决条件的好方法。

您可以从命令行执行此操作,但这有点笨拙。

当您可以在Git补丁程序级别和单独的行中提交时,您无需创建新的分支,存储,提交,存储和合并。只要继续努力,就不要中断流程。您的工作进展顺利。


@MasterMastic这应该是您接受的答案。能够仅提交单独的代码行真是太天真了。
JesseTG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.