将“特定”文件(从dev分支)合并到master(分支)

时间:2017-11-13 18:58:08

标签: git

我的dev分支有来自所有开发人员的几个文件和提交,但我只想合并来自一个特定文件的更改

File-A 
File-B
File-C

我需要合并从File-B(在dev分支)到master的所有内容 使File-B在master中与dev-branch中的File-B相同,(保留所有提交日志)

1 个答案:

答案 0 :(得分:2)

即使有澄清,仍然缺少某些东西。但是你可以使用git merge-file得到你想要的东西。或许不是。

  

我需要合并从File-B(在dev分支)到master

的所有内容

(目前为止确定)

  

使文件-B在主服务器上与文件-B在dev-branch相同,(保留所有提交日志)

这部分毫无意义。

首先,“合并”并不意味着“与之相同”。

其次,git log显示提交。存储库中的提交存储库中的历史记录。每次提交都是源树的完整快照。提交19afc3d可以包含23个文件,后续或以前的提交b099ca2可以包含23个相同名称的文件,其中22个具有相同的内容。但它们只是两个单独的提交,每个提交23个文件。

向存储库添加新提交就是这样做:使用新快照添加新提交。

运行git merge会使事情变得更复杂。根据您运行git merge时提供的现有提交图和选项,它可以进行真正的合并。它通过遍历提交图来查找合并基础提交,这是图表的两个部分重新加入的第一个提交:

...--A--B--C--D   <-- master (HEAD)
         \
          E--F--G   <-- dev

此处,合并基础是提交B。然后Git可以弄清楚我们改变了什么:

git diff --find-renames <hash-of-B> <hash-of-D>

并找出他们改变了什么:

git diff --find-renames <hash-of-B> <hash-of-G>
然后然后合并这些更改,以获得两组更改。因此,如果就提交B而言,我们更改了File-B以添加三行,他们File-B更改为删除不相关的三条线组,总变化将是:添加我们的三条线并删除它们的三条线。

如果Git能够将所有更改组合到所有文件中,Git将创建一个新的合并提交,其中包含两个父项而不是一个:

...--A--B--C--D---H   <-- master (HEAD)
         \       /
          E--F--G   <-- dev

合并提交(合并为形容词)或合并(合并为名词),使用 all <作为其快照我们的更改(B - 到 - B)及其更改({{1})的组合更改了基础D中的/ em>文件} -to - B

G 中的某些文件可能HBD中的某些文件相同,但如果是这样,那是因为结合了两组变化的结果。

如果您运行G,则必须提供该文件的基本版本以及该文件的两个分支提示版本。 Git会将更改组合到一个文件中,就像Git通常对实际合并一样。 Git将从结果中进行新的提交,如果这样做,它将不是合并提交,它只是一个普通的提交:

git merge-file

如果你真的希望文件相同 -ie,忽略我们在提交...--A--B--C--D---H <-- master (HEAD) \ E--F--G <-- dev C中所做的任何更改,以及只需直接从提交D获取文件的版本 - 您可以使用G执行此操作。同样,提交结果将进行普通的非合并提交。

如果你想进行合并提交,正确合并git checkout dev -- File-B但是忽略了对所有文件的更改,除了那个特定文件,这需要稍微复杂一点Git命令:

File-B

(或者,相当于,将合并后的版本保存到某处,使用git merge --no-commit dev git checkout master -- [all files except for FileB] 检查master中的所有内容,然后将合并后的文件放回原位并git checkout master -- .)。但请注意,将此记录为合并提交会告诉Git执行完整合并的正确结果是您刚才提交的内容。如果您希望稍后合并来自git add FileB的其他更改,那么您将为自己做更多的事情。