Git - 将提交推送到新分支(重命名分支而不是强制推送?)

时间:2016-10-15 04:36:04

标签: git git-branch

还有另一个问题几乎完全描述了我的情况(Git - Moving Pushed Commits to a Different Branch)。唯一的区别是我想要移动的提交是在Develop分支而不是master(这应该不重要,因为master分支没有什么特别之处)。此外,我们将redmine链接到我们的git存储库。无论如何,用户Adam对接受的答案进行了评论:

  

不要使用push -force,这是一个坏主意。它将严重破坏已经撤离的任何其他用户的历史。更糟糕的是,如果你将Git日志集成到Redmine,Jira等其他系统中,那么它会严重破坏数据库并且很难清理。

我想回复评论以要求澄清,但我刚刚为此问题创建了一个帐户,并且没有足够的声誉点来发表评论。在我的情况下,只有一个其他开发人员参与该项目,所以我并不担心破坏他人的历史。我关心的是应该对“更糟糕”的情况做些什么?我希望在我的情况下可能没问题,因为之后没有输入任何redmine问题需要移动的第一个提交(在上面引用的帖子中提交C)。我不确定,因为我不知道如果更改了存储库的历史记录,所有这些都会被redmine搞砸了。

当我正在寻找答案时,我正在思考它,我想我可能有另一种解决方案(我对我的git知识没有足够的信心将其作为答案发布)。如果我将Develop重命名为NewBranch,然后从commit C创建一个新的Develop分支怎么办?

# rename branch
git branch -m Develop NewBranch     # Rename locally
git push origin :Develop NewBranch  # Delete remote Develop branch & push NewBranch
git push origin -u NewBranch        # Reset upstream branch

#create new Develop branch
git checkout -b Develop $SHA1_OF_C
git push -u origin Develop

看起来这样可行。有没有陷阱?历史会是什么样的?这会如何影响redmine(除了可能不得不将默认分支更改为新的Develop)?我认为它看起来与我想要的完全相同,只不过它会显示从NewBranch开始分支而不是相反。

2 个答案:

答案 0 :(得分:0)

这里的所有问题都是Redmine与Git在服务器端的集成(否则,强制推送完全没问题,提供其他用户通知并可以将自己的本地分支重置为新的远程分支)

作为此问题的说明,您有Redmine issue 9897:“ Git:Git存储库中删除的修订和分支以redmine“。

显示

过去8年在Redmine feature 1273 ...

中提出了一项增强请求
  

更明智的方法是让Redmine允许通过REST API更改提交消息   然后,可以在版本控制中设置提交后挂钩,以便仅修改单个更改的提交消息,而不是删除并重新导入整个历史记录。

可悲的是,其余的API不够完整,不允许这种与SCM相关的操作。

我只是创建一个新分支,在其上挑选正确的提交并推送所述新分支。

答案 1 :(得分:0)

我的建议是cherry-pick您对新分支的提交,而不是重命名现有分支。

然后你就可以push分支到远程,而无需用力推动它。

git branch -b BRANCHNAME #Create new branch
git cherry-pick HASHVALUE #Cherry pick all the commits one by one. (eg: HASHVALUE - 5e2ld9)