我的dev分支有来自所有开发人员的几个文件和提交,但我只想合并来自一个特定文件的更改
File-A
File-B
File-C
我需要合并从File-B(在dev分支)到master的所有内容 使File-B在master中与dev-branch中的File-B相同,(保留所有提交日志)
答案 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
中的某些文件可能与H
,B
和D
中的某些文件相同,但如果是这样,那是因为结合了两组变化的结果。
如果您运行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
的其他更改,那么您将为自己做更多的事情。