使用git管理仅限本地的更改

时间:2011-11-24 20:37:13

标签: git version-control merge git-merge

在我的本地分支上,我对Makefile进行了一些个人(仅限本地)更改(只是更改了编译器的路径)。显然我不想提交这些更改,因为它们只与我有关。但是,如果我不提交它们,那么当我尝试与远程分支同步时出现错误:

% git fetch upstream
% git merge upstream/master
error: Your local changes to 'Makefile' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.

每次发生这种情况时存储然后取消存储文件似乎很乏味。例如,在Perforce上,您只需将这些文件移动到单独的更改列表中,并在必要时解决合并冲突。

我想要发生的是让git自动将我的本地Makefile与远程的Makefile合并(如果可能),但不必提交它。我怎么会这样做?

3 个答案:

答案 0 :(得分:8)

有几种方法可以解决这个问题,这是我的想法。

创建一个新的makefix分支并在那里提交makefile。每当您需要创建项目时,请切换到该分支。您可以在master中工作,只是继续合并,或者针对makefix重新定位master分支。

一般的想法是,您正在创建一个包含永不推送的Makefile的分支。

就我个人而言,我会针对makefix重新master,因此我的Makefile更改始终领先于实际的可推送代码。它只是感觉更清洁。

代码示例

git branch makefix
git checkout makefix

Makefile

进行更改
git add Makefile
git commit -m "Add Local Makefile Changes to Compiler Path"

每日工作

git checkout master
git fetch upstream
git merge upstream/master

git checkout makefix
git rebase master

它长而丑,所以我希望别人有更好的方式=]

答案 1 :(得分:2)

让git自动执行rebase可能更容易,即创建本地分支,配置rebase,添加更改,拉动......

git checkout -b mybranch origin/master
git config branch.mybranch.rebase true

根据您的需要调整Makefile ...

git add Makefile
git commit -m 'My local-only Makefile.'

从现在开始,git会根据

重新定义您的更改
git pull

或者,(特别是如果你没有选择rebase)你可以创建一个要使用的常规Makefile和gitignore的副本:

cp Makefile Makefile.local
echo Makefile.local >> .git/info/exclude
make -f Makefile.local

但是,使用该变体时,您需要密切关注(常规,git控制的)Makefile,并在必要时相应地更新本地版本。

答案 2 :(得分:1)

为什么不修改Makefile以使用变量来获取编译器的路径而不是硬编码的东西?然后,您可以在您的环境中设置适当的值。很多这些(如C编译器的CC,C预处理器的CPP等,都是由make预先设置的)。如果不是,则可以为其提供可由环境变量覆盖的默认值。这个例子假设GNU make,其他make实用程序允许类似的解决方案:

FOO ?= /usr/bin/foo

test:
        @echo CC is ${CC}
        @echo FOO is ${FOO}

(确保使用真正的标签)。

这给出了:

$ make
CC is cc
FOO is /usr/bin/foo
$ export FOO=/opt/bin/foo
$ make
CC is cc
FOO is /opt/bin/foo
$ make FOO=/just/this/once
CC is cc
FOO is /just/this/once

这是一个更易于维护的解决方案,并且避免了有一天意外推送上游本地更改的风险。