如何在git中合并特定文件

时间:2013-06-07 08:09:33

标签: git git-branch git-merge

假设我在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 个答案:

答案 0 :(得分:8)

有两种方法:

方法01

以下解决方案来自a blog post

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

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

# checkout specific files from specific branch
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

答案 1 :(得分:1)

无法在Git中记录部分合并,所有合并必须合并所有正在合并的提交的完整根树。

您当然可以选择通过从其中一个父项中选择一个文件的未更改副本来解决该合并,但这仍然是“完整”合并,并且该文件中的更改将被视为已合并它涉及后续的重组或相关分支之间的合并。

答案 2 :(得分: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以及所有这些。

答案 3 :(得分:0)

不,没有直接的方法。虽然;您可以从要合并的分支中选择文件,并将其覆盖在主分支中的现有文件中。顺序命令应为:

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"

好的,上面的方法将“破坏”文件历史记录。 this mailing list中有关于此问题的旧讨论。

  

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

     

现在,执行每个文件历史的根本原因是什么?

     

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

忽略了很多段落;你会找到解决方法:

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

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