如何在不需要强制推送的情况下使用git rebase?

Roy*_*ove 80 git git-rebase

为了实现git nirvana,我花了一天时间学习如何在我目前合并的情况下利用rebase.

当我通过我认为是git 101流程(我在下面拼写出来)时,我必须push --force将我的更改推回原点.

我不是唯一的一个-我知道这是覆盖的地面(见图1,2,3,4,5),我理解的技术原因,为什么力是必要的.我的问题是这样的---有歌声底垫的赞美很多(多)发表的博客以及它如何改变他们的生活(见1,2,3,4,列出了几个),但他们没有提到push --force是的一部分他们的流量.然而,几乎现有的stackoverflow问题的每一个答案都说"是的,如果你要改变,你必须使用push --force".

鉴于rebase倡导者的数量和宗教信仰,我不得不相信使用'push -force'并不是rebase流的固有部分,如果经常不得不强迫他们推动,他们就会做错事.

push --force是一件坏事.

所以这是我的流程. 在没有武力的情况下,我能以何种方式获得相同的结果?

简单的例子

两个分支:

  • v1.0 - 发布分支,仅包含补丁
  • 大师 - 下一个主要版本的一切.

我有一些补丁提交和一些提交下一个版本.

premerge

我想将这些补丁合并到我的主人中,以便他们在下一个版本中不会丢失.启蒙前我简单地说:

git checkout master
git merge v1.0
Run Code Online (Sandbox Code Playgroud)

但现在我正在努力

git checkout master
git rebase v1.0
Run Code Online (Sandbox Code Playgroud)

所以现在我在这里:

在此输入图像描述

的时间:

git push
Run Code Online (Sandbox Code Playgroud)

没有骰子.

Tod*_*obs 39

重新绑定是一个很好的工具,但是当您使用它来创建主题分支到主服务器的快进合并时,它最有效.例如,您可以针对master重新添加add-new-widget分支:

git checkout add-new-widget
git rebase -i master
Run Code Online (Sandbox Code Playgroud)

在执行分支快速合并到主服务器之前.例如:

git checkout master
git merge --ff-only add-new-widget
Run Code Online (Sandbox Code Playgroud)

这样做的好处是您的历史记录不会有很多复杂的合并提交或合并冲突,因为所有更改都将在合并之前重新定位到master的tip.第二个好处是你已经重新定位,但你不必使用,git push --force因为你没有破坏主分支的历史.

这当然不是rebase的唯一用例,也不是唯一的工作流程,但它是我见过的更明智的用途之一.因人而异.

  • 谢谢CG,我认为"用它来创建快进合并"是关键.它不适用于我上面的情况,我有两个实时分支 - 一个开发分支和一个发布分支,但它似乎非常适用于临时主题分支,这只是有限的时间内所必需的,然后可以他们合并后删除.再次感谢. (3认同)
  • 那么,你仍然需要强制推动1.0分支,不是吗?至少,这就是事情往往对我而言的结果.Fabiens方法可以防止这种情况发生. (3认同)

Fab*_*aux 22

@CodeGnome是对的.你不应该在v1.0分支上修改master而在master上修改v1.0分支,这将使一切变得不同.

git checkout -b integrate_patches v1.0
git rebase master
git checkout master
git merge integrate_patches
Run Code Online (Sandbox Code Playgroud)

创建一个指向v1.0的新分支,将该新分支移到master之上,然后将新版本的V1.0补丁集成到master分支.你会得到类似的东西:

o [master] [integrate_patches] Another patch on v1.0
o A patch on v1.0
o Another change for the next major release
o Working on the next major release
|  o [v1.0] Another path on v1.0
|  o A patch on v1.0
| /
o Time for the release
Run Code Online (Sandbox Code Playgroud)

这种使用rebase的方法是官方git文档推荐的.

我认为你是对的git push --force:如果你犯了一个错误而推了一些你不想要的东西,你应该只使用它.


Dan*_*man 16

你必须力推,如果你重订,并且您已经发布的更改,对不对?

我使用了一大堆rebase,但是我要么发布一个私有的东西,其中强制推送无关紧要(例如:我自己的克隆在GitHub上,作为拉取请求的一部分),或者我在第一次推送之前进行rebase.

这是您使用rebase的工作流程的核心,但不要强迫推送:在它们准备好之前不要发布内容,在推送之后不要重新发布.

  • 如果您将所有工作隔离到主题分支,那么它会为重新定位设置一个好方案.你可以在你的主题分支中"改变"新的更改,但是当你完成了那个分支的更改时,你将该分支"合并"回主开发分支. (2认同)

8fo*_*rty 5

我认为,这种重基础然后强制推送模式有一个很好的用例,它不是错误推入的结果:您可以从多个位置(计算机)自己进行功能分支。我经常这样做,因为有时我在台式机上的办公室里工作,有时又在笔记本电脑上的家庭/客户现场工作。我偶尔需要调整基准以跟上主分支和/或使合并更整洁,但是当我离开一台机器以在另一台机器上工作时(在我刚刚拉动的地方),我还需要强制推动。只要我是该分支机构中唯一的一名,就可以像魅力一样工作。

  • 我有相同的工作流程(在多台计算机/位置工作)。因此,假设您正在开发一个名为“ mytopic”的主题分支。只要您始终将本地可丢弃分支(仅是mytopic的分支)重新建立为“ master”,然后将其合并回mytopic,那么您就不必强制推送。OP的情况稍有不同,因此在类似情况下可能需要强制推动。但是,我认为OP正以错误的方式改头换面-如果他按照我的描述进行了操作,则无需强行推动。 (2认同)