我怎么能告诉Git完全忘记文件?

时间:2017-06-23 21:08:21

标签: git

我正在使用我的master分支来保留基础资料'用于各种项目的子分支的文件。让我们说我为一家制造货车和下坡滑雪板的公司工作。我的主分支将包含用作这些产品的部件的所有文件。每个产品都来自masterwagon分支,ski分支等。然后使用git rm删除每个项目不需要的部分(虽然马车上的滑雪板听起来很有趣)。

问题在于,每当我将master分支(可能是材料更改)合并到项目分支(例如 wagon )时,git认为我真的希望更改为我已经忘记了git rm被遗忘的文件,并将它们添加回来 - 滑雪板的版本大师留在树上,如下面的代码所示。

如何让git真正 p>

将一些部分添加到master,并提交:

$ pwd
/tmp/parts
$ git init
Initialized empty Git repository in /tmp/parts/.git/
$ echo rubber > wheels
$ echo steel > skis
$ echo vinyl > seat
$ echo wood > sides
$ ls
seat  sides  skis  wheels
$ 
$ git add .
$ git commit -a -m 'initial parts'
[master (root-commit) ca7610e] initial parts
 4 files changed, 4 insertions(+)
 create mode 100644 seat
 create mode 100644 sides
 create mode 100644 skis
 create mode 100644 wheels

创建一个wagon项目分支,并删除我们在货车上不需要的部分:

$ git checkout -b wagon
Switched to a new branch 'wagon'
$ ls
seat  sides  skis  wheels
$ git rm skis
rm 'skis'
$ git rm seat
rm 'seat'
$ git commit -a -m 'initial wagon design'
[wagon 384b246] initial wagon design
 2 files changed, 2 deletions(-)
 delete mode 100644 seat
 delete mode 100644 skis

工程团队决定更换一些材料。在master中提交这些更改,以便我们的所有项目都可以使用这些更改:

$ git checkout master
Switched to branch 'master'
$ ls
seat  sides  skis  wheels
$ 
$ echo 'titanium' > skis
$ echo 'metal' > sides
$ git commit -a -m 'design requirements call for stronger sides and skis'       
[master a8bf4c4] design requirements call for stronger sides and skis
 2 files changed, 2 insertions(+), 2 deletions(-)

我们需要{em>一些的wagon项目中的更改,所以合并master来获取它们,但现在git抱怨了:

$ git checkout wagon
Switched to branch 'wagon'
$ git merge master
CONFLICT (modify/delete): skis deleted in HEAD and modified in master. Version master of skis left in tree.
Automatic merge failed; fix conflicts and then commit the result.

2 个答案:

答案 0 :(得分:4)

我认为您可能不会将git用作源控制系统,而更像是解决方案管理器。考虑一下,如果你想在结帐新分支时删除其中的不同部分,为什么要将文件置于源代码管理之下呢?

功能分支是开发路径上的分支,旨在与主服务器合并,并为整个项目带来其他功能。

您可以为每种材料创建一个仓库,然后设置项目构建以从物料回购中获取所需的材料。

答案 1 :(得分:0)

到目前为止,我找到的最可行的解决方案是将master合并到当前分支,然后使用--porcelain打印出Deleted Updated个文件列表,然后调用xargs删除它们:

git status --porcelain | awk '{if ($1=="DU") print $2}'

这不漂亮。将它插入pre-merge git钩子会很好,但显然不存在。