我想自动清理远程分支机构.我希望能够检查分支是否已经合并为主分支.最初,我的计划是使用git merge-base来查看最后一次常见提交.
然而,事实证明,当我们将它们合并为master时,我们压缩所有分支.由于这会创建一个新的提交哈希,我无法找到master和我的分支之间的常见提交.
如果我们在合并时将它们全部压扁,我怎么能确定分支是否已合并?
提前致谢!
如果多个人一起在一个功能分支上工作,当你将其压缩并合并到主分支时会发生什么?git Blame 会跟踪谁参与了该功能的哪一部分吗?或者点击压缩和合并的人会被指责为所有 git 的罪魁祸首吗?即使该功能位于同一个 PR 中,如何显示谁负责该功能的哪一部分?
我有一个分支,我从主分支.我们称之为整合.
在集成分支中,我做了各种提交(C1,C2,C3).当我完成后,我向主分支发出了拉取请求.在master分支中,我做了一个"Squash and Merge",因此只能在master中进行一次提交.这一切看起来都很棒.
但后来,我对集成分支进行了一些额外的更改,当我再次发出pull请求时,我看到了我已经提交的先前更改(C1,C2,C3,C4)的所有提交注释.如果我在之前的提交中使用默认的"创建合并提交",则不会出现此问题.我做错了什么?
我正在使用git flow方式管理我的仓库中的分支,如下所述:http: //nvie.com/posts/a-successful-git-branching-model/
因此,我应该使用的命令序列如下:
git checkout mybranch
git pull --rebase origin develop
git checkout develop
git merge --no-ff mybranch
Run Code Online (Sandbox Code Playgroud)
但是,有些事情我想以不同的方式做,在某些情况下:
我想保留我的功能分支(mybranch)上的所有提交,但是在合并时将它们混合在一起(或压扁)成一个差异develop.
所以这就是我认为命令序列应该是:
git checkout mybranch
git pull --rebase origin develop
git checkout develop
git merge --no-ff --squash mybranch
Run Code Online (Sandbox Code Playgroud)
如果我要--no-ff与之结合,我会做错事--squash吗?
我犹豫是否尝试这样做源于"挤压"和"保存历史"是如何正交的要求 - 请参阅将我的所有提交(包括合并)压缩到一个提交而不改变历史记录
我的理由是,我想在一个分支(mybranch)上保存历史记录,并在另一个分支(develop)上继续suqash - >因为这些动作是在不同的分支中执行的,这是可以的.
我合并了一个长期存在的分支,由于冲突的解决,我花了很多时间来完成合并.
我发现我无法发布我的工作git-svn:git svn rebase将重新绑定合并分支的所有提交,而不是提交一个单独的合并提交.我发现git merge --squash有点太晚了......
是否有可能将合并提交(rebase interractive?)更改为"squash merge"提交而不会丢失已经完成的所有冲突解决工作(即没有触发新的合并,因为我没有启用该rerere工具)?
底色
嗨,我正在研究一个本地功能分支.这个本地分支搞砸了许多小提交.在将分支推到遥控器之前,我想整理一下.
为此,我会做一个交互式的rebase:
git rebase -i
Run Code Online (Sandbox Code Playgroud)
到目前为止没问题.
问题
现在这里是困难的部分:在功能开发过程中,我做了几次重构,包括重命名和文件移动.重命名文件的历史记录可用,因为它们使用以下命令重命名:
git -mv
Run Code Online (Sandbox Code Playgroud)
但是当我在重命名提交之前和之后压缩提交时,历史记录就消失了,git会将更改通知为删除和添加文件.
问题是什么?
如何在不丢失文件历史记录的情况下压缩包括重命名在内的提交?
有时我需要从 Eclipse 合并南瓜。我知道我可以在命令行中完成此操作,但是在 Eclipse 中集成图形选项将非常有用。你知道该怎么做吗?
I use an optimistic work-flow in Gitlab, which assumes the majority of my merge requests will be accepted without change. The flow looks like this:
cool-feature-Acool-feature-A, called cool-feature-B. Begin developing on this branch.cool-feature-A.cool-feature-B反对master(这是无痛的)并继续开发。如果同事在第 3 步进行壁球合并,就会出现问题。这会重写cool-feature-B. 当我到达第 4 步时,我面前是一个合并痛苦的世界。
我怎样才能避免这种情况发生?
有些人喜欢git merge --squash的原因如下:
压缩到单个提交让您有机会清理杂乱的 WIP 提交,并为您正在合并的更改提供一个很好的理由。
https://coderwall.com/p/qkrmjq/git-merge-squash
但是,我认为有一些缺点超出了制作干净历史的优点。
git merge --squash产生一个非合并提交。因此,Git 不会将您正在合并的提交识别为合并基础。当 1) 在分支 X 上将 A 更改为 B,2)git merge --squash从分支 X 到分支 Y,以及 3) 在分支 X 上将 B 更改为 A(还原),以及 4) 将 X 合并到 Y
时,这会导致不需要的合并结果。
在第 4 步之后,在分支 Y 上,从 A 到 B 的更改不会恢复。这里,这是 3 路合并,因此比较从分支 X 到合并基的差异和从分支 Y 到合并基的另一个差异。前者包括没有变化,后者包括从A到B的变化,所以合并结果包括从A到B的变化。
提交作者被覆盖,这会丢弃贡献。git merge --squash产生一个名为 who did 的新提交git merge --squash。当然,提交内容来自原始提交。这听起来像是在窃取贡献。这成为https://github.com/Microsoft/winfile/pull/42#issuecomment-380681627 中的一个问题
什么是正确的用例git merge --squash?
在我们使用 GitLab 的开发中,当功能分支合并到主分支中时,我们通常会压缩它们的提交(如果重要的话,我们使用变基策略而不是合并)。
但是,如果来自功能分支的提交被压缩为单个提交(稍后合并到主分支中)并且分支本身被删除,GitLab 如何仍然显示原始提交?它们是永远保留在存储库中还是最终被删除只是时间问题?
我相信 GitLab 在存储库上做了一些垃圾收集,但我想知道为什么它不影响 MR 的提交。
squash ×10
git ×9
merge ×6
github ×3
branch ×2
git-squash ×2
3-way-merge ×1
eclipse ×1
egit ×1
fast-forward ×1
git-merge ×1
git-rebase ×1
git-svn ×1
gitlab ×1
merge-base ×1
rename ×1