GiH*_*GiH 336 git merge rebase git-rebase squash
我是git的新手,我正在努力理解壁球和篮板之间的区别.根据我的理解,你做一个篮板时做一个壁球.
Von*_*onC 340
双方git merge --squash并git rebase --interactive能产生"挤压"承诺.
但它们有不同的用途.
将在目标分支上生成压缩提交,而不标记任何合并关系.
(注意:它不会立即产生提交:你需要一个额外的git commit -m "squash branch")
如果你想完全丢弃源分支,那么这很有用(从SO问题中获取的模式):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
Run Code Online (Sandbox Code Playgroud)
至:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
Run Code Online (Sandbox Code Playgroud)
然后删除tmp分支.
在新的基础上重放你的部分或全部提交,允许你压缩(或者最近"修复",看到这个SO问题),直接进入:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
Run Code Online (Sandbox Code Playgroud)
如果你选择压缩所有提交--commit(但是,相反--squash,你可以选择重播一些,并压缩其他人).
所以差异是:
--commit不会触及您的源分支(--squash此处)并在您想要的位置创建单个提交.reloadbrain允许你继续使用相同的源分支(仍然gitster):
Md *_*ker 151
合并提交:保留分支中的所有提交,并将它们与基本分支上的提交交错
Merge Squash:保留更改但省略历史记录中的各个提交

Rebase:这将整个功能分支从主分支的尖端开始,有效地将所有新提交合并到master中
更多关于这里
Mau*_*fer 77
合并壁球将树(一系列提交)合并为一个提交.也就是说,它会将n次提交中所做的所有更改压缩到一次提交中.
重新定位是重新基础,即为树选择新的基础(父提交).也许这个多变的术语更清楚:他们称之为移植,因为它就是这样:为一棵树选择一个新的基础(父提交,根).
在进行交互式rebase时,您可以选择压缩,选择,编辑或跳过要进行rebase的提交.
希望很清楚!
让我们从下面的示例开始:
现在,我们有3个选项将功能分支的更改合并到主分支:
合并提交
将保留功能分支的所有提交历史记录,并将它们移入主分支。
将添加额外的虚拟提交。
Rebase和merge
将在master分支的前面附加Feature分支的所有提交历史记录。
不会添加额外的虚拟提交。
压入并合并
将所有功能分支的提交分组为一个提交,然后将其追加到master分支的前面,
将添加额外的虚拟提交。
您可以在下面找到master分支如何照顾每个分支。
在所有情况下:
我们都可以安全地删除功能分支。
我学会理解squash、merge等之间的价值和区别的方法是为自己编写这个简短的教程。
\n假设您在起源处有一个 Main分支,具有提交历史记录,A。
\n\n您从Main拉取,并创建一个新分支FeatureA,以便您拥有提交历史记录:
\n您希望将更改推送到 Origin 并合并到Main中。由于Origin 上的Main尚未更改,您也可以快进。
\n将FeatureA分支的所有提交历史记录应用到Main\xe2\x80\x99s提交历史记录之上。
\n\n当您的分支有多个提交时,可用的选项是压缩。与Main合并时,压缩将FeatureA分支的历史记录合并到单个提交中。
\n\n如果 Main 上有其他更改,则无法快进\xe2\x80\x99。
\n如果您对FeatureA分支进行了更改,同时其他人已推送到Main中,则 Commits 的 Origin 历史记录现在为:A、B、C
\n\n您想要将更改推送到Origin 上的主分支,并且您有几个不同的选项:
\n如果您要获取 Origin\xe2\x80\x99s Main分支的本地副本并将其合并到本地FeatureA分支中,您将为该合并创建一个提交 M。您在FeatureA上的本地历史记录将是:A、F1、 F2、F3、M,其中 M 是合并提交。
\n\n然后你可以合并到Main(如果你愿意的话可以压缩)。请注意,如果您不压缩\xe2\x80\x99t,您将在主提交历史记录中引入合并提交:
\n您可以通过在合并到Main时挤压分支来避免这种情况,如上面挤压部分所述,结果是: ABCF,如下所示:
\n\nRebase 是避免将合并提交引入历史记录的另一种选择。它本质上会接受您的更改,并使您好像已经开始使用最新的 Main,而不是开始使用过时版本的Main。例如,在变基后,您的功能分支将从 A、B、C 分支(而不是最初的 A)。结果:
\n注意,没有合并提交,M
\nGit 实现此目的的方法是系统地(逐次提交)将 origin\xe2\x80\x99s Main中的更改应用到您的分支。最终结果就好像您过去没有基于提交 A启动您的FeatureA分支,但就好像您在最新的Main之上开始了所有更改。
\n问题在于这样做的方式。对于必须应用于您的FeatureA分支的每个提交,git都会检查合并冲突,并且您必须解决它们。如果自您的FeatureA分支以来,Origin上的Main发生了多次更改,您可以一次又一次地解决合并冲突。
\n也许隐藏和拉动更容易?
\n存储您的FeatureA ,从 Origin 获取/拉取Main的最新本地副本,然后创建一个新分支并应用您的存储。(或者将新的主分支合并到您的分支中,并应用您的存储。如果执行后者,请挤压以避免在提交历史记录中合并。)然后您可以推送到 Origin / 创建拉取请求。
\n| 归档时间: |
|
| 查看次数: |
130292 次 |
| 最近记录: |