13

假设我在 MASTER 分支上有一个项目,其中包含 100 个 php 文件。为了在项目中修复错误,我创建了一个单独的分支

git checkout -b bugfix

然后在修复 3 个文件(例如 index.php、register.php 和 login.php)中的错误后,我将它合并到主分支中

git checkout master
git merge bugfix

上面的代码将合并我所做更改的所有 3 个文件,但无论如何我可以强制 GIT 只合并 2 个文件,比如 login.php 和 register.php?

4

4 回答 4

15

有两种方法:


方法01

以下解决方案取自一篇博文

事实证明,结帐也可以在这件事上有所帮助。您可以简单地从另一个分支中调出(签出)那些特定文件:

# switch to the branch you want to be your merge destination
git checkout master

# checkout specific files from specific branch (e.g bugfix)
# format: git checkout <source branch> <file.1> <file.2> ... <file.N>
git checkout bugfix login.php register.php

# check the status
git status

# merge them in
git commit -m "your merge comment"

方法 02

这是一种简单的替代方法,但它仅在每个文件有一个提交时才有效(意味着每次更改文件时,您都进行了一次提交,然后移至下一个文件)。在这种情况下,您可以简单地将这些特定提交带到另一个分支(在您的情况下是主分支):

# get which commit you want to take to the other branch (first 7 characters will do)
git log

# switch to the branch you want to be your merge destination
git checkout master

# bring specific commit to this branch (replace the 63344f2 with your own 7 character commit ID)
git cherry-pick 63344f2
于 2015-08-24T00:27:50.973 回答
1

没有办法在 Git 中记录部分合并,所有合并都必须合并所有正在合并的提交的整个根树。

您当然可以选择通过选择其中一个父文件的未更改副本来解决该合并,但这仍然是“完整”合并,并且该文件中的更改将被视为已合并随后在所涉及的分支之间进行变基或合并。

于 2013-06-07T08:20:53.307 回答
1

您可以模拟您想要的行为,但是您对第三个文件所做的更改会发生什么?

第三个文件的更改保留在分支的提交中,但它们不会出现在合并的提交中,就像文件根本没有在分支上修改一样。

您可以这样做:

git checkout master
git merge bugfix --no-commit

--no-commit选项告诉git合并文件,但在提交之前停止。您现在可以检查文件,更改它们,做任何您想做的事情。为了取消您所做的更改,index.php您可以运行:

git checkout master -- index.php

运行git status您可以看到index.php它不再显示为已修改(无论是在索引中还是在工作树中)。你现在可以了git commit,仅此而已。

于 2015-08-24T00:46:10.230 回答
0

不,不存在直接的方法。尽管; 您可以从要合并的分支中选择文件并将它们覆盖在 master 分支中的现有文件上。按顺序排列的命令应为:

git checkout master
git show bugfix:login.php > login.php
git show bugfix:register.php > register.php
git add .
git commit -m "Select login and register from branch/bugfix"

好的,上述方法将“销毁”文件历史记录。在这个邮件列表中有一个关于相同的旧讨论。

从技术的角度来看,使历史变得重要的事情(以及为什么“按日期顺序提交的集合”是无用的)是因为它给了我们一个共同的祖先!这唯一重要的事情。

现在,做每个文件的历史有什么根本错误?

现在,如果你遵循了这个论点,你应该去“啊!明显!”。

忽略一大堆段落;你会找到解决方法:

git diff commit..othercommit filename | git-apply --index && git commit

在您的情况下,commit=您的 HEAD/master 分支的哈希值;和othercommit= 错误修复分支的哈希。

于 2013-06-07T08:29:20.000 回答