是否可以仅将子目录的更改从本地git分支合并到远程git分支,还是"全有或全无"?
例如,我有:
branch-a
- content-1
- dir-1
- content-2
Run Code Online (Sandbox Code Playgroud)
和
branch-b
- content-1
- dir-1
- `content-2
Run Code Online (Sandbox Code Playgroud)
我只想将branch-a dir-1的内容与branch-b dir-1的内容合并.
Von*_*onC 73
正如替代SO问题" 如何使用git-merge合并选择性文件? ",我刚刚发现这个GitHub线程可以更适合于合并整个子目录,基于git read-tree:
我的存储库=>
cookbooks
我的存储库目标目录=>cookbooks/cassandra
远程存储库=>
infochimps
远程存储库源我希望合并到cookbooks/cassandra
=>infochimps/cookbooks/cassandra
这是我用来合并它们的命令
- 添加存储库并获取它
git remote add -f infochimps git://github.com/infochimps/cluster_chef.git
- 执行合并
git merge -s ours --no-commit infochimps/master
- 仅合并
infochimps/cookbooks/cassandra
到cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
- 承诺改变
git commit -m 'merging in infochimps cassandra'
这很奇怪,[编辑我] - 但这read-tree
一步可能会失败:
error: Entry 'infochimps/cookbooks/cassandra/README' overlaps with 'cookbooks/cassandra/README'. Cannot bind.
......即使两个文件都相同.这可能有所帮助:
git rm -r cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
Run Code Online (Sandbox Code Playgroud)
但是当然,请手动验证这是否符合您的要求.
Chr*_*ena 25
对于我的示例,假设您有一个分支"源"和一个分支"目标",它们都反映了它们自身的上游版本(或者不是,如果只是本地版本)并且被拉到最新的代码.假设我希望repo中的子目录名为newFeature,它只存在于'source'分支中.
git checkout destination
git checkout source newFeature/
git commit -am "Merged the new feature from source to destination branch."
git pull --rebase
git push
Run Code Online (Sandbox Code Playgroud)
比我见过的其他所有东西都要复杂得多,这对我来说很有效,在这里找到.
请注意,这不是"真正的合并",因此您不会在目标分支中拥有有关newFeature的提交信息,只会修改该子目录中的文件.但是,由于你可能会稍后将整个分支合并,或者丢弃它,这可能不是问题.
xno*_*xno 12
鉴于 OP 的场景,他们有两个分支,但只想将dir-1的历史从branch-a合并到branch-b:
# Make sure you are in the branch with the changes you want
git checkout branch-a
# Split the desired folder into its own temporary branch
# This replays all commits, so it could take a while
git subtree split -P dir-1 -b temp-branch
# Enter the branch where you want to merge the desired changes into
git checkout branch-b
# Merge the changes from the temporary branch
git subtree merge -P dir-1 temp-branch
# Handle any conflicts
git mergetool
# Commit
git commit -am "Merged dir-1 changes from branch-a"
# Delete temp-branch
git branch -d temp-branch
Run Code Online (Sandbox Code Playgroud)
我从Eclipse 的论坛帖子中得到了这个,它就像一个魅力:
git checkout source-branch
git checkout target-branch <directories-or-files-you-do-**NOT**-want>
git commit
git checkout target-branch
git merge source-branch
Run Code Online (Sandbox Code Playgroud)
用于git cherry-pick
选择所需的提交并仅合并这些提交。这里的关键技巧是以简单的方式获取这些提交(这样您就不必通过手动检查 Git 日志并手动输入来找出它们)。方法如下:用于git log
打印提交的SHA-1 id,如下所示:
git log ^<commit-a> <commit-b> --pretty=format:"%h" --reverse -- <subdir>
Run Code Online (Sandbox Code Playgroud)
“commit-a”是要合并的分支起点之前的提交,“commit-b”是要合并的分支上的最后一个提交。“--reverse”以相反的顺序打印这些提交,以便稍后进行挑选。
然后这样做:
git cherry-pick $(git log ^<commit-a> <commit-b> --pretty=format:"%h" --reverse -- <subdir>)
Run Code Online (Sandbox Code Playgroud)
两步,简单又稳定!
归档时间: |
|
查看次数: |
62803 次 |
最近记录: |