通常在分支机构工作时,我需要引入一些“临时”更改(例如额外的调试信息,或者让我更好地观察我实际工作的事情的更改)。
关于这些“临时”变化:
目前我只是将它们保持为非分页状态,并在暂存每次提交时手动跳过它们。但是我不能坚持这个解决方案,因为:
我该如何处理?
gitignore
显然是不可能的,因为我不想忽略整个文件,我仍然对其他提交者的更改感兴趣(我需要不时地将分支重新命名为master)
答案 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 add
或git 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" ----- commit1 ---- commit2 ---- "branch"
分支现在可以继续工作,并且状态中不会显示临时更改。
更改或延长临时更改:
将更改从分支合并到主:
这有点棘手。除了“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
当您准备合并分支机构时,如果您已经忘记了这些更改,那么您或其他人会在您的请求的代码审核中抓住这些更改
然后您将有不同的方法来删除调试提交:
revert
具体的调试提交。这将保留他们在分公司的历史。
cherry-pick
good 提交。这将完全删除调试提交。
更复杂的内容,例如rebase -interactive
来删除就地提交。
答案 8 :(得分:0)
GIT的藏匿功能提供了您所要求的。至少对于“保持”部分。在提交时做出好/坏选择是不可避免的。
答案 9 :(得分:0)
我倾向于保留这样的未提交的更改。我只是总是使用git add -i
或git add -p
进行更改(除非我确定我希望树具有所有更改)。这样我就可以查看我想要提交的所有更改,并轻松跳过临时更改。它还有助于您知道您希望尽早提交更改并保持上演甚至提交更改,而不是使用git commit --amend
添加更多更改。