在Git中处理临时更改(不提交)

时间:2011-08-22 12:56:37

标签: git branch git-branch

通常在分支机构工作时,我需要引入一些“临时”更改(例如额外的调试信息,或者让我更好地观察我实际工作的事情的更改)。

关于这些“临时”变化:

  • 我希望他们在我的分支机构的工作副本中,因为它们可以帮助我处理实际的变化,
  • 我不希望他们提交到分支,因为分支将在某个时候合并为主分区,而且它们不是生产代码。

目前我只是将它们保持为非分页状态,并在暂存每次提交时手动跳过它们。但是我不能坚持这个解决方案,因为:

  • 我必须记住我需要跳过哪些文件,
  • 有一天,我最终会在一个文件中进行2次更改,一次是临时更改,一次是承诺,这将非常麻烦。

我该如何处理?


gitignore显然是不可能的,因为我不想忽略整个文件,我仍然对其他提交者的更改感兴趣(我需要不时地将分支重新命名为master)

10 个答案:

答案 0 :(得分:13)

我通常使用以下方式解决这个问题:

git add -p

...逐步改变大块头。然后你必须确保按 n 进行调试更改。


如果我有更多涉及此类型的更改,我将创建一个名为local-changes的分支,其尖端提交引入调试代码。在创建了几个提交之后,我会使用:

git rebase -i master

...对它们进行重新排序,以便再次提交具有本地更改的提交。然后要更新master并返回本地更改分支,您可以执行以下操作:

git checkout master
git merge local-changes^
git checkout local-changes

答案 1 :(得分:6)

试试git update-index --assume-unchanged <file>。这样,使用git addgit commit -a时,git就不会将文件添加到索引中。

编辑:这不允许您处理一个文件同时具有临时和永久更改的情况。

答案 2 :(得分:4)

这是一种解决方法,一旦设置,只需要你记住一步设置,并在每次推动前一步。

设置:

git branch tempChanges  [branch for temporary changes]
  [create your temporary changes]
git add -A
git commit

注意该提交的sha。然后切换到您的工作分支,并且:

git cherry-pick shaOfTempChangesCommit

现在您对工作分支进行了更改。做你的工作并做出承诺。然后,在你推动之前:

git rebase -i

你会看到这样的事情:

pick bfd4d2e This first commit is your temporary changes.
pick 186a99d Some stuff done on the working branch.
pick ec871c6 More stuff done on the working branch.
(etc.)

删除临时更改的行。然后保存并退出。您的历史记录将被重写以排除临时更改。 (更改仍将存在于 tempChanges 分支中。)完成后,进行所需的任何测试然后再进行 git push

当您准备再次工作时,您可以将临时更改恢复到当前工作分支(或新工作分支):

git cherry-pick shaOfTempChangesCommit

所以,总和,你在这个方法中必须记住的是

    创建工作分支后
  • git cherry-pick shaOfTempChangesCommit

  • 完成工作并准备推送

    之后

    git rebase -i [在推送前删除临时更改]

答案 3 :(得分:3)

您可以使用

git stash

将其保存到临时空间。合并后,您可以使用

git stash pop

将临时更改加载回工作目录。

答案 4 :(得分:1)

我找到了解决这个问题的简洁方法:(请原谅我的ascii-art)。它需要主题分支的附加分支。 (这有缺陷,有争议/纠正,见评论)

这项工作最初看起来像这样:

master
     \
      \
     commit1  ---- commit2 ---- "branch"

工作在“分支”上完成。

引入一些临时更改:

  • 从“master”创建分支“branch-temp”
  • 提交临时更改
  • 将“master”中的“branch”改为“branch-temp”

回购现在看起来像:

master
     \
      \
     "branch-temp" ----- commit1 ---- commit2 ---- "branch"

分支现在可以继续工作,并且状态中不会显示临时更改。

更改或延长临时更改:

  • checkout branch-temp
  • commit - 给那里的临时更改 - 这是错误的,因为它使“branch-temp”发散

将更改从分支合并到主

这有点棘手。除了“branch-temp”引入的更改之外,我们希望合并所有更改。我的想法是:

  • 从“branch”运行正常合并到“master”
    (我们现在有一个合并,但有一些不必要的临时更改 - 让我们删除它们)
  • git revert --no-commit branch-temp
  • git commit --amend
    (这两个步骤应修改合并提交,以便它不再包含来自branch-temp的更改)

答案 5 :(得分:1)

我通常将所有调试代码放在自己的提交中,然后在进行合并之前,我提交revert。我有时会使用大多数其他答案的一些变体,但我喜欢这个,因为它简单,而且它保留了我的开发历史。是的,我不希望我的调试代码在最终产品中,因此revert,但如果测试发现问题,我希望能够恢复该调试代码以便进一步工作。

答案 6 :(得分:1)

如何编写一个简单的shell脚本,根据请求修补和撤消调试更改(然后将其作为git别名)。

E.g。

git apply-my-debug
...
do coding
...
git remove-my-debug
git add .
git commit -m "Don't worry about debug changes"

答案 7 :(得分:1)

为了避免在您创建功能时混乱您的暂存区域,提交您的调试更改时会发出明亮的闪烁警告,表明它们不应进入最终合并:

#warning - DEBUG ONLY - DO NOT MERGE

print(debugInfo)

#warning - DEBUG ONLY - DO NOT MERGE

当您准备合并分支机构时,如果您已经忘记了这些更改,那么您或其他人会在您的请求的代码审核中抓住这些更改

然后您将有不同的方法来删除调试提交:

  1. revert具体的调试提交。这将保留他们在分公司的历史。

  2. cherry-pick good 提交。这将完全删除调试提交。

  3. 更复杂的内容,例如rebase -interactive来删除就地提交。

答案 8 :(得分:0)

GIT的藏匿功能提供了您所要求的。至少对于“保持”部分。在提交时做出好/坏选择是不可避免的。

答案 9 :(得分:0)

我倾向于保留这样的未提交的更改。我只是总是使用git add -igit add -p进行更改(除非我确定我希望树具有所有更改)。这样我就可以查看我想要提交的所有更改,并轻松跳过临时更改。它还有助于您知道您希望尽早提交更改并保持上演甚至提交更改,而不是使用git commit --amend添加更多更改。