使用Git管理本地修改

11

在我的本地分支中,我对一个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(在可能的情况下)合并,但不需要提交它。 我该如何做到这一点?


为什么不让git忽略makefile呢? - dasheddot
1
@dasheddot:我不想忽略这个文件。如果有人向makefile中添加了一个新的命令,那么当我合并时,我仍然希望接收到该更改,只是我不想提交对该文件的更改。 - Peter Alexander
3个回答

10

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

创建一个名为makefix的新分支,并将makefile提交到该分支。每当您需要构建项目时,请切换到该分支。您可以在master分支中工作并继续合并或变基makefix分支以与master同步。

总体思路是创建一个包含您的Makefile但从未推送的分支。

个人建议经常使用rebase命令将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
谢谢你的回答。正如你所说,这有点长,所以我希望有人知道一个更简单的解决方案。如果没有一种简单的方法来管理本地修改,我会感到非常惊讶。 - Peter Alexander
据我所见,您想要本地更改,这些更改既不被推送,但是对于已跟踪的文件而言又领先于远程版本。您也可以每次变基您的本地提交,只需小心不要推送HEAD,但这似乎更容易出错。 - Jacob Groundwater
当然需要一些命令,但在我看来,这绝对是处理这个问题最干净的方法,所以+1。不过,我会选择 git merge master 而不是 git rebase master:这样可以保留 makefix 分支的旧状态,创建两个分支之间的梯子,基本上记录了你想要发布的所有状态以及应用了本地更改的所有状态。 - cmaster - reinstate monica

3

让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

如果对于你来说,变基不是一个选项的话,你可以创建一份常规 Makefile 的副本并将其用作 gitignore:

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

然而,对于这个变体,您需要关注(常规的、由git控制的)Makefile,并在必要时相应地更新您的本地版本。

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

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


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