让Git永远不推送单个提交?

21

我不认为这是可能的,但我认为有人可能有一个巧妙的想法来实现这个:

我有一个项目,我检查过它,它存在了很久,早在我接手之前。我对各种文件进行了大约十几个更改,我永远不想将它们检入(它们都是配置更改)。

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

澄清:

我希望这些更改留在我的工作目录中,我需要它们使应用程序在本地运行。 我希望能够保持其他更改的提交,甚至同一文件中的更改,但永远不要将配置更改推送到任何其他地方...

这有点像在每次推送之前,我都想要:

  • 挑选并存储此提交
  • 将此提交从Git历史记录中删除
  • 推送
  • 重新应用此存储到我的代码库
3个回答

23

这与维护一个你无法控制的上游项目的本地补丁集类似。最简单的处理方法是创建一个中间分支,所有更改都通过该分支合并,如下所示:

___________________________ 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进行rebase,但最好为每个更改创建一个新分支。

当您需要从master拉取新更改时,请执行以下操作:

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

合并操作会将您本地的配置更改应用到最新的主分支上。然后,您可以自由创建一个新的 daily-work 分支,或者根据需要将 config-changes 合并到旧分支中。基本上,您永远不要直接从 master 分支合并到 daily-work 分支。您总是要先经过 config-changes 分支。
起初可能会感觉很麻烦,但只要做一两次就会发现比手动维护更容易。

SmartGit有一个名为“交互式变基”的功能,可以轻松地将提交上下移动。对于这种情况,在对话框中将“config-changes”提交向上移动到最高位置很容易。然后,在“config-changes”之前的提交上进行推送即可。作为避免意外推送我的临时提交的预防措施,我在提交消息中添加了一个“TMP:”前缀,并添加了本地推送钩子,在我意外推送我的临时提交时警告我。 - Ryuu
说实话,我已经厌倦了这样做。有没有更简单的方法来自动化这个过程? - Ryuu

4
使用git update-index --assume-unchanged命令,使Git认为这些文件未被修改。
除此之外,还有一种方法是创建一个独立的分支进行推送。在这个分支中,从工作分支中挑选需要的提交。当你想要推送时,切换到“推送”分支,从“工作”分支中挑选提交并进行推送。

如果我正确地阅读了文档,这类似于 git ignore - user578895
@cwolves - 这是用于“忽略”已被跟踪的文件更改的。 git ignore 用于忽略仓库外的文件。 - manojlds
啊,我明白了。谢谢你,但不完全是我需要的——我需要能够稍后提交那个文件,但不包括我之前所做的更改……我正在处理一个项目,其中“配置”分散在十几个文件中,我也需要稍后修改这些文件。理想情况下,我想将所有这些内容合并到一个/一对配置文件中,但它与所有内容都紧密相连,这需要花费半天时间才能完成…… - user578895
@cwolves - 那你真的应该考虑改变你项目的结构。 - manojlds

-1

好的,只需创建一个单独的分支,将这些更改存储在那里:

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

当你提交完成后,只需返回到原始分支并忘记这些更改即可。


我认为他希望在他目前工作的分支中进行更改。返回将删除更改。 - manojlds
我想要在我的本地代码库中进行更改。也就是说,我希望它们都在我的工作目录中,但我永远不希望它们被推送到任何地方。如果我在一个分支中这样做,我不知道如何同时访问这些更改和我想要推送的更改。 - user578895
可能是这样。我会等待 cwolves 澄清。 - Chaitanya Gupta
好的,正如@manojlds所指出的那样,“git update-index --assume-unchanged”是一个选项。但是当你有一个文件想要提交一组更改但保留另一个文件时,它会失效。你能不能把所有这些config相关的行都放到一个单独的文件中呢? - Chaitanya Gupta
这不是用户想要的。用户想要在将更改应用到开发分支后,与他所做的更改一起进行修改,但不希望将这些初始开发分支提交添加到主分支。 - Ishan Srivastava
我觉得这个用户@ChaitanyaGupta在进行报复性的负面评分。需要向社区举报他。 - Ishan Srivastava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接