2011-08-29 172 views
15

我不认为这是可能的,但认为有人可能有一个漂亮的想法,如何实现这一点:让git永不推送单个提交?

我有一个项目,我检查了很久之前,我接管了它。我对各种文件进行了大约十次更改,这些更改是我从不想检入的(它们都是配置更改)。

有什么办法来提交这组更改,然后从来没有实际推送那个提交吗?我知道这听起来很奇怪:)

澄清:

我想这些变化留在我的工作目录,我需要他们的应用程序在本地运行。我希望能够保持提交它们周围的其他变动,在同一个文件甚至变化,但从来没有推配置更改其他地方...

这有点像以前那样每推我会想:

  • 樱桃采摘和藏匿这一承诺
  • 变基的一个犯了
  • 这个藏匿重新应用到我的代码库

回答

18

这是一种类似的模式,可以将本地补丁集保存到您不控制的上游项目中。处理这种情况最简单的方法是让所有的改变打通合并,像这样的中间分支:

___________________________ master 
\__________________________ config-changes 
    \_____________________ daily-work 

master包含一切,是被共享。在config-changes中唯一承诺的内容是您希望能够在共享时轻松恢复的更改。 daily-work是你做的所有工作的分支设置它,这样做:

# (no local config changes should be in master at this point) 
git checkout -b config-changes master 
# Make your config-related changes that you don't want to share 
git commit -am "Made local config changes" 
git checkout -b daily-work 
# Work and commit like normal 

当你准备好分享您的更改,这样做:

git rebase --onto master config-changes daily-work 
git checkout master 
git merge daily-work 

这将恢复所有的变化在config-changes中制作,但除此之外使它看起来像你从master直接分支。请注意,在完成此重新分配之后,如果您想继续使用daily-work,则需要将其重新分配到config-changes,但最好为每个更改创建一个新分支。

当你需要从master拉下新的变化,这样做:

git checkout master 
git pull 
git checkout config-changes 
git merge master 

合并重新应用本地配置的变化到最新的高手。然后,您可以根据需要自由创建新的daily-work分支,或将config-changes合并到旧分支中。基本上,您绝不会直接从master合并到daily-work。你总是先通过config-changes

起初看起来很多工作,但是一旦你做了一次或两次,你会发现它比手动维护更改要容易得多。

+0

真棒,这正是我正在寻找/希望的。谢谢! –

+0

这非常有帮助。谢谢! – Pat

+0

SmartGit有一个名为“Interactive Rebase”的功能,可让您轻松上下移动提交。对于这种情况,在对话框中向上移动“config-changes”提交最容易。然后,只需在“config-changes”之前提交即可。作为避免意外推送我的临时提交的预防措施,我在提交消息中添加了一个“TMP:”前缀,然后添加了一个本地push-hook来在我意外推送我的临时提交时发出警告。 – Ryuu

0

啊,就创建一个单独的分支,有储存这些变化:

git checkout -b your-new-branch 
git commit -a 

你完成提交后,就回到原来的分支,而忘记了这些变化。

+0

我认为他想要他现在正在研究的分支的变化。回去会删除更改。 – manojlds

+0

我想要我的本地代码库中的更改。即我希望他们都在我的工作目录中,我永远不希望他们被推到任何地方。如果我在分支中这样做,我不会看到我将如何访问这些更改以及我想要推送的更改。 –

+0

可能是这种情况。我会等待cwolves澄清。 –

3

对这些文件使用git update-index --assume-unchanged使git认为这些文件没有被修改。

评论之后,另一种选择是有一个单独的分支,你推。在这个分支的承诺是樱桃采摘等从工作分支。所以,当你想推动,切换到“推”分支,樱桃选择提交从“工作”,并推动。

+0

如果我正确阅读文档,这与'git ignore'类似? –

+0

@cwolves - 这是为了“忽略”对已经被跟踪的文件的改变。 'git ignore'用于忽略回购库中的文件。 – manojlds

+0

啊,gotcha。谢谢,但不是我所需要的 - 我需要能够稍后提交到一个文件,但不是我之前做的更改......我正在研究一个项目,其中“配置”分散在十几个文件中我还需要稍后修改。理想情况下,我会将所有这些合并成一个/几个配置文件,但它与所有需要半天时间的事情紧密相关...... –