2017-07-14 34 views
1

好了,所以git diff --name-status branch1..branch2给了我这样的:复制文件更改或添加到一个新的孤儿分支(GIT)

M  .gitignore 
M  README.md 
A  README_orig.md 
M  deps/npm/lib/cache/add-remote-git.js 
M  deps/npm/lib/fetch-package-metadata.js 
M  deps/npm/lib/utils/git.js 
A  git_wrapper.bat 

我就从喜欢副本那些文件(没有补丁的git diff生产) branch2成为一个全新的孤儿(空)分支并在那里落实。

是否有实现与混帐的一些succint方式,或者它git checkout branch2 -- path1...path2,等的时间?

UPDATE

OK,我知道我应该解释的上下文。

这是一个相当不寻常的情况。我正在为该公司打包一些精心制作的公司软件(即node.js,Visual Studio Code)。这需要在每个新版本传入时重现相同的效果。

现在,例如Visual Studio代码编译的工作原理是,它不会提供编译应用程序所需的全部源代码。它在编译过程中下载吨和吨的东西(克隆几十甚至几百个Github仓库),重新生成一些东西等,而我们需要将我们的定制和修复应用到下载的东西上;某些节点模块的维护人员没有反应,重新修复这些东西,甚至应用我制定并已尽职报告的修复程序,但我们仍然需要应用这些修补程序,并且出于显而易见的原因,不希望创建那些会及时陈旧的模块的分支。

我显然不能仅仅使用通常的git diff来应用我们在v1.12.2acmev1.14.0asshippedbymicrosoft之间的特定修复和定制,因为很多不相关的文件都会改变。现在,我想我可以只存储在产品的过去一定/定制分支或标签的变化:

git diff commit_acme_fixed..commit_v1.14.0 -- file1.js 
git diff commit_acme_fixed..commit_v1.14.0 -- file2.js 

但是...我真的不希望这样做。我的想法是拥有不相关的(孤儿)acme_customisations分支,其中存储所有带有其版本的文件仅用于修补后续传入的新版本。然后,我可以在该分支中创建一个提交或标记,它只会简洁地封装我在传入的v1.14.0asshippedbymicrosoft版本中重播的更改,因为我们的定制迟早会因基本产品的更改而必须修改。

对于其他人来说,更容易找出哪些文件是由我们在基本产品版本之间变化的过多文件之间进行更改(我想您可以通过提交者找到该文件,但那是在你必须做的这个级别,以及你会错过某人作为提交者并且失去一些视线变化的风险,同时使用2个分支/标签/提交更自然并且得到git的良好支持)。

+0

什么是你在这个新的孤儿分支做规划:确实,对于一次性取得这样,你可以添加远程分发? – jthill

+0

@jthill请参阅更新 – LetMeSOThat4U

回答

0

你的意思是你想只有这些文件在新的提交?

我认为,思考“分支文件”是不明智的; Git的分支机构太灵活了,你有什么提交,每个提交都有一些父提交和一个完整的快照,而不是一个补丁。但是在那里的孤儿分支状态,目前没有提交。当前分支只是一个名称和概念,而不是实际的分支。这也是您在新初始化完全为空的存储库中所处的状态:当前分支仅为名称master; master实际上还没有存在。

处于这种状态时,git commit将创建一个提交像往常一样,但这种新的承诺将没有父提交,这是一个新的根犯 -and只有这样,新的分支存在,指向这个新承诺。无论您在运行git commit时索引中的文件是什么,这些文件都将一如既往地处于新提交中。因此,只需从索引中删除所有不需要的文件,然后将这些文件的所需版本放入索引中即可。工作树的内容是无关紧要的,但是在下面的步骤中,我们会让他们前来参加。 (我们要破坏任何未保存的工作 - 未跟踪的文件基本安全,但明智的是不依赖于它)。

现在我认为要做到这一点最简单的方法就是继续前进,就是为了让新的分支,其新单根承诺:

cd $(git rev-parse --show-toplevel) # if not already there 
git checkout --orphan newbr   # prepare to create new branch 

现在空出来的指标:

git read-tree --reset -u $(git hash-object -t tree --stdin </dev/null) 

这计算了the empty tree的哈希ID并将其用作索引内容。相应的工作树文件被删除(-u),只留下未跟踪的文件(您可以根据需要将其删除或保留)。

然后,用你的建议正是,git checkout branch2 --,但DIFF管道输送到xargs的将其自动化:

git diff --name-only -z branch1 branch2 | xargs -0 git checkout branch2 -- 

,现在你准备提交...和只有文件中的新commit将被git checkout branch2 --添加到索引和工作树中。

(您可能要添加--diff-filter=AMgit diff,从而得到仅AM文件。此外,如果你反复和automatedly这样做,可以考虑使用git diff-tree,一个管道命令,而不是git diff,这作为瓷面向用户的命令可以根据用户的设置,其变化从一个人到另一个或随时间而改变其行为。)

0

回购的体积被口角和VSC做这一切在幕后隐藏事实上,你在这里得到的是一个完美的普通git工作流程:你是马在供应商基础上修复acme分支。

你有一个acme分支你的工作,你变基上新的供应商发布,他们到达,修复了任何需要修复,标记中的发布提交,谁希望自己的版本,可以拉你的版本标签的人,可能在他们已经收购的供应商基础之上。

对于VSC已经克隆任何一个回购协议,

git remote add acme u://r/l 
git fetch acme v1.14acme 
git checkout v1.14acme 

就大功告成了。获取的结果与您所期望的完全不同,完全按照您的意愿启动,显示您发布的历史结构,而不仅仅是孤立的提示,无法将其自动绑定到特定的供应商基础。

编辑:

git fetch u://r/l v1.14acme 
git checkout v1.14acme 
相关问题