我刚刚开始使用Git来熟悉它,同时也在使用Mercurial。
我经常使用Mercurial的mq扩展来管理本地补丁,现在想知道Git中有没有类似的功能?
是应该直接使用Git分支吗?或者有更好的方法来管理本地补丁方便地应用和删除补丁?
谢谢。
我刚刚开始使用Git来熟悉它,同时也在使用Mercurial。
我经常使用Mercurial的mq扩展来管理本地补丁,现在想知道Git中有没有类似的功能?
是应该直接使用Git分支吗?或者有更好的方法来管理本地补丁方便地应用和删除补丁?
谢谢。
声明:我不是 hg 用户,所以我了解 hg,但没有太多的实际使用经验。
git 提供了几个非常强大和灵活的工具来管理分支,采用“补丁队列”样式,因此对于许多基本(甚至一些相当复杂)的用例来说,原生 git 已足够强大。
通常,大多数项目都会保留一个中央稳定的主分支,它只获得新提交,从不“倒回”,因此主分支中的提交是固定的。
在此基础上,维护人员(或开发人员)可能会维护一个或多个流动的工作进展分支(即提交),这些分支基于稳定分支。
典型的补丁管理活动包括:
将补丁队列变基到最新的稳定分支 - 使用 git rebase
,
将补丁队列复制到旧的维护分支 - 使用 git branch
和 git rebase
,
重新排序队列中的补丁 - 使用 git rebase --interactive
(又名 git rebase -i
),使用文本编辑器重新排序队列。
压缩补丁 - 使用带有 squash 指令的 git rebase -i
更改补丁或补丁提交消息 - 使用带有 edit 指令的 git rebase -i
(发现一个主题了吗?)。
任何改变补丁的方式(即其内容、描述或父级)的活动都会为该补丁创建一个新的提交,带有新的提交 ID。在它们被推广到稳定主分支之前,旧的提交可能被抛弃并被替换是使它们成为“补丁队列”而不是分支的唯一因素,但这是一个项目约定,而不是组成提交的数据中的任何物理差异。对于 git 来说,它们是相同的对象。
将一个补丁推到“真正的”提交,只是将补丁移到队列前面,并将其合并到主分支中。将补丁移到队列前面后,它就像基于主分支的普通提交一样,因此将其合并只是快进主分支指针以指向补丁提交。git format-patch
,甚至可以将它们保存到 mbox 文件中,这样您就可以使用 git am
一次性应用所有补丁。 - remmyformat-patch
和 am
。我会去了解一下它们的。 - Paul Moore只需定期使用分支并将其与上游分支进行rebase。这比使用mq更容易管理和更安全(我曾经在mq中丢失过数据)。
Git本身并没有提供这个功能。根据您的使用情况,您可能可以通过“git stash”和/或分支来完成,但这将是相当基本的。如果人们在使用git时需要更高级的补丁管理需求,他们似乎会转向Quilt或StGit:请参见http://git.or.cz/gitwiki/PatchManagement
git rebase --interactive
已经基本上消除了像 Mq 这样的需求。 - kizzx2git rebase --interactive
命令强制你按顺序处理整个提交系列。使用补丁管理界面,你可以轻松地在不同的补丁之间来回切换以编辑它们。你还可以查看补丁的变更历史记录,在系列中间添加新的提交,挑选其他提交等。 - Jakub Narębskigit checkout
不是可以让你在不同的提交之间来回切换吗?管理补丁有什么难的呢?Git 的整个意义就在于轻松地遍历提交。 - Elazar Leibovich2,第一步你会进入“分离头指针”(未命名分支);第二步,如果你修改该提交,例如通过修订它,原先的后续提交(HEAD1、HEAD~0)将不再与之相邻(这是因为在Git中,对于“父节点”等引用提交链接的方式是基于其内容的SHA-1哈希值,如果提交更改,则其SHA-1也会改变)。 - Jakub Narębski