- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这看起来应该是一个简单的问题,但我整个早上都在苦苦寻找,却找不到令我满意的答案。我能找到的最接近的是这个问题,Git merge squash repeatedly ,但这个问题是 11 年前的问题了,所以希望“除非创建临时分支,否则你根本无法做到这一点”的共识已经改变。
我正在从事一个长期项目,我基本上是唯一的贡献者。理想情况下,我希望有一个长期持续的开发
分支,我可以继续一点一点地修补和工作,并定期对master
进行压缩 merge 每当我达到稳定的、可发布的状态时就分支。我不想在 master
上提供/可见完整的提交历史记录,因为我希望能够轻松地向后浏览稳定的官方版本的历史记录。但是,我确实希望完整的提交历史记录可以在某个地方可用,以便它变得相关。
问题是,如果我尝试按照直觉上认为应该有效的方式执行此操作,但事实并非如此。 squash-merge-commit 在 master
上创建了一个与 development
中的任何内容都不匹配的提交,因此下次我尝试执行 squash-merge 时,它会说是一个冲突,我需要从 master
merge 到 development
...并且随着我越来越多地重复这个过程,这个问题不断增长,我已经有一半了十几个提交在两个分支之间来回跳动,实际上并没有更改任何文件,但我似乎无法摆脱。
我想要制作的图形看起来像这样,如果这有意义的话:
B-------------------G-----------J master
/ / /
a---b---c---d---e---f---g---h---i---j development
到目前为止我一直在使用的解决方案非常丑陋:我使用版本号创建一个新分支,例如 development_601
,然后我从该分支向 master 发出 pull 请求我再次稳定下来并压缩 merge 提交,然后在压缩 merge 后从 master
创建另一个新分支 development_602
。 development_601
被封存。这看起来很困惑、烦人,而且是错误的,特别是因为 Git 似乎暗示我应该在 merge pull 请求后删除我的分支,但就像我说的,我想在某个地方记录我完整的困惑历史,我只是不这样做不希望它(轻易)从外部可见。
我一直在使用 Github Desktop 应用程序和 Github 网站;我一直试图避免将控制台命令放入我的工作流程中。
这是一种奇怪的行为吗?我觉得“拥有一个长期的开发分支和一个定期但不完全镜像它的主分支/发布分支”是一种非常常见的系统,但不知怎的,我就是找不到任何地方解释如何实现它。
最佳答案
这个问题在Git FAQ中得到了解答。 ,您遇到的问题是一个常见问题:
In general, there are a variety of problems that can occur when using squash merges to merge two branches multiple times. These can include seeing extra commits in git log output, with a GUI, or when using the
...
notation to express a range, as well as the possibility of needing to re-resolve conflicts again and again.When Git does a normal merge between two branches, it considers exactly three points: the two branches and a third commit, called the merge base, which is usually the common ancestor of the commits. The result of the merge is the sum of the changes between the merge base and each head. When you merge two branches with a regular merge commit, this results in a new commit which will end up as a merge base when they’re merged again, because there is now a new common ancestor. Git doesn’t have to consider changes that occurred before the merge base, so you don’t have to re-resolve any conflicts you resolved before.
When you perform a squash merge, a merge commit isn’t created; instead, the changes from one side are applied as a regular commit to the other side. This means that the merge base for these branches won’t have changed, and so when Git goes to perform its next merge, it considers all of the changes that it considered the last time plus the new changes. That means any conflicts may need to be re-resolved. Similarly, anything using the
...
notation in git diff, git log, or a GUI will result in showing all of the changes since the original merge base.
这种方法总是会导致问题。如果您有两个长时间运行的分支,则需要使用常规 merge 提交。否则,您可以创建短期分支,并将其分别 merge 到每个长期运行的分支中,或者使用 rebase 策略。如果您像 Git 鼓励您那样花时间创建具有良好提交消息的独立、逻辑提交,那么所有这些方法都会更有吸引力。
作为 Git 开发人员,我个人的建议是编写合理的提交,然后使用常规的 merge 提交。如果您的历史记录不错,那么就没有理由 stash 它。
但是,Git 和 merge 工作的基本原理并没有随着时间的推移而改变,因此对于长时间运行的分支和压缩 merge 的答案“不要这样做”也没有改变。
关于GIT:我可以在 merge 到 master 的同时维护一个正在进行的开发分支吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68512951/
我为我的一些问题设置了标签。当搜索 labels="ab"时,我得到了相关的标签,但我似乎找不到询问标签的正确语法!="ab"。如何查询不等于ab的? 最佳答案 != 对我有用,尽管它只显示带有标签的
我最近使用 Visual Studio 2013 Express 配置了 GITHUB 和 Demo GITHub 帐户,即用于练习目的。 Good News is that : I have con
我有一个用于播放和暂停的切换按钮。 这是代码: export default (props) => { let [soundState, setSoundState] = useState({ s
一个 XML 文件被发布到我的 spring mvc 正在响应的 URL。 在 .NET 中,我可以这样做: request.Form[0] request.Form["abc"] 或 request
我们的监控脚本遇到问题。 程序流程为 客户将文件(.csv 格式)ftp/sftp 到“源”目录 Bash 脚本将完成的 .csv 文件重命名为 .aaa 文件 另一个 Bash 脚本将“.aaa”文
如果我开始一个线程: new Thread(() -> { while (running) { try { Thread.sl
我正在制作一个看起来像真正的书的 PDF 阅读器。 我在 ScrollView 中有一个 UIImageView 作为书的背景(想象一本打开的书,有空页)。 UIImageView 的层有 2 个子层
创建 Accordion - 在幻灯片上 - 正在滑动的元素下方的元素似乎向下移动了 px,然后又向上移动,从而产生了颤动效果。 $(document).ready(function() { //Pr
我有一个非常奇怪的问题,但只有在运行 Ubuntu 时才会出现(在 CentOS 上一切正常)。我用 Perl 编写了一个脚本并使用了 Mail::IMAPClient模块。 当我运行以下命令时: p
我知道我可以检查 UITextView 是否正在使用 textViewDidBeginEditing: 进行编辑,但我想检查它是否正在使用 if 语句进行编辑? 最佳答案 使用方法isFirstRes
我正在制作一个简单的点击器类型的游戏。问题是,我的 JPanel 忽略了我设置为每秒更新的 Swing 计时器,而是每毫秒更新一次,即使我删除了计时器也是如此。除了计时器的监听器之外,不会在任何地方调
我有以下代码,应该通过组织列表对每个组织进行 td,对每个组织调用 toString 方法,并将结果打印到控制台和名为 Debug1.tab 的文件。 try { StreamWriter p
我有以下代码用于将文件从 url 下载到 sdcard 。此代码适用于小文件,但当文件大时,我下载的文件大小为 0。任何帮助将不胜感激。 Java 代码 setContentView(R.layout
我有一个必须使用 tomcat 部署的 Angular 项目。 Angular 文件在 dist/project-ui/ 中构建文件夹。我复制了 project-ui文件夹到 webapps tomc
我有一堆切换按钮,下面有标签。如果按钮的标签变得太长,那么下一行的第一个按钮将卡在该标签上。 这是我的代码: https://jsfiddle.net/Android272/c150305z/ 我查了
具有特殊字符的 InnerHTML 正在 trim 数据。 elem.innerHTML = displayedObjects.name; 这里的 displayedObjects.name 包含一个
我已经成功地设置了我的证书和 key ,并使用了在这里找到的 mysql 文档: http://dev.mysql.com/doc/refman/5.1/en/replication-solution
在为游戏制作动画和更新计时器时,我读到任何与 GUI 相关的 Activity 都应该在 EDT 上运行,包括重新绘制屏幕。我正在使用单个 ScheduledExecutorService 来更新和绘
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Large numbers erroneously rounded in Javascript 我正在使用
我已经为 .NET RyuJit 安装了新的 Jit 编译器,并按照安装文档中的说明在 regedit 的 .NetFramework 中设置了 AltJit=* 键。 http://blogs.ms
我是一名优秀的程序员,十分优秀!