我想使用下一个典型的工作流程:
这是非常典型的用例。 然而,有一件事令我烦恼 - 我不想向公众展示我的分支机构。我只想推送合并提交,没有功能开发历史。
可以建议使用git rebase和提交压缩。但事实上,这种挤压只是解决方法,而不是真正的解决方案。我希望我的所有提交都是localy,合并图,用于历史目的。
我想通过git svn dcommit得到simmilar - 只有合并提交被推送到远程,但我看到localy完整的开发历史,具有功能提交,具有双父项合并节点和适当的合并图。 / p>
答案 0 :(得分:0)
你可以尝试
git merge --squash <feature branch>
除了分支实际上不被视为合并之外,那将会做你想要的一切。
答案 1 :(得分:0)
如果我理解正确,您希望有一个提交(即一个SHA1),但您希望它在您的存储库副本上看起来与在中央副本上的不同。
这样做是不可能的。 Git是这样做的,这样就不可能了。如果您知道存储库中提交的SHA1 id,则可以确定您知道其所有历史记录。
但是,有一种方法可以伪造:使用grafts。这样,您可以在不实际修改提交的情况下向提交添加父级。虽然我不确定这是个好主意。
答案 2 :(得分:0)
根据您的评论,这是另一种解决方案:您可以在功能分支中工作,就像正常一样。合并功能根据需要分支到master,就像正常一样。在您推送到遥控器之前,请将壁球合并到一个单独的分支,然后将那个分支推送到遥控器。例如:
# Create two repos for testing
mkdir test-git-merging
mkdir test-git-merging2
cd test-git-merging2
git init
# Have to set this flag to be able to push with master checked out
git config receive.denyCurrentBranch ignore
cd ../test-git-merging
git init
# Base commit in first repo
git commit --allow-empty -m "init"
# Create the branch that will be pushed to the remote
git branch remote-master
# Make some files and commit them in master
echo foo >> foo
echo bar >> bar
git add .
git commit -m "added files"
# Make a change on a branch
git checkout -b branch
echo 1 >> foo
git commit -am "Modified foo"
# Make a non-conflicting change in master
git checkout master
echo 2 >> bar
git commit -am "Modified bar"
# Do a normal merge from branch to master--normal history
git merge branch
# Squash merge from master to special remote branch
git checkout remote-master
git merge --squash master
git commit -m "Everything is squashed"
# Set up the remote and push config
git remote add other ../test-git-merging2
git config branch.remote-master.remote other
git config branch.remote-master.merge master
git config push.default tracking
# Push the branch
git push
我已经测试了一系列命令,看它是否有效。当然,分支远程主设备仍然永远不会有真实的历史,这意味着将它从它返回到你的工作分支总是很危险的,但这基本上就是你所要求的。