rebasing-and-merging.rst 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. .. SPDX-License-Identifier: GPL-2.0
  2. ====================
  3. Rebasing and merging
  4. ====================
  5. Maintaining a subsystem, as a general rule, requires a familiarity with the
  6. Git source-code management system. Git is a powerful tool with a lot of
  7. features; as is often the case with such tools, there are right and wrong
  8. ways to use those features. This document looks in particular at the use
  9. of rebasing and merging. Maintainers often get in trouble when they use
  10. those tools incorrectly, but avoiding problems is not actually all that
  11. hard.
  12. One thing to be aware of in general is that, unlike many other projects,
  13. the kernel community is not scared by seeing merge commits in its
  14. development history. Indeed, given the scale of the project, avoiding
  15. merges would be nearly impossible. Some problems encountered by
  16. maintainers result from a desire to avoid merges, while others come from
  17. merging a little too often.
  18. Rebasing
  19. ========
  20. "Rebasing" is the process of changing the history of a series of commits
  21. within a repository. There are two different types of operations that are
  22. referred to as rebasing since both are done with the ``git rebase``
  23. command, but there are significant differences between them:
  24. - Changing the parent (starting) commit upon which a series of patches is
  25. built. For example, a rebase operation could take a patch set built on
  26. the previous kernel release and base it, instead, on the current
  27. release. We'll call this operation "reparenting" in the discussion
  28. below.
  29. - Changing the history of a set of patches by fixing (or deleting) broken
  30. commits, adding patches, adding tags to commit changelogs, or changing
  31. the order in which commits are applied. In the following text, this
  32. type of operation will be referred to as "history modification"
  33. The term "rebasing" will be used to refer to both of the above operations.
  34. Used properly, rebasing can yield a cleaner and clearer development
  35. history; used improperly, it can obscure that history and introduce bugs.
  36. There are a few rules of thumb that can help developers to avoid the worst
  37. perils of rebasing:
  38. - History that has been exposed to the world beyond your private system
  39. should usually not be changed. Others may have pulled a copy of your
  40. tree and built on it; modifying your tree will create pain for them. If
  41. work is in need of rebasing, that is usually a sign that it is not yet
  42. ready to be committed to a public repository.
  43. That said, there are always exceptions. Some trees (linux-next being
  44. a significant example) are frequently rebased by their nature, and
  45. developers know not to base work on them. Developers will sometimes
  46. expose an unstable branch for others to test with or for automated
  47. testing services. If you do expose a branch that may be unstable in
  48. this way, be sure that prospective users know not to base work on it.
  49. - Do not rebase a branch that contains history created by others. If you
  50. have pulled changes from another developer's repository, you are now a
  51. custodian of their history. You should not change it. With few
  52. exceptions, for example, a broken commit in a tree like this should be
  53. explicitly reverted rather than disappeared via history modification.
  54. - Do not reparent a tree without a good reason to do so. Just being on a
  55. newer base or avoiding a merge with an upstream repository is not
  56. generally a good reason.
  57. - If you must reparent a repository, do not pick some random kernel commit
  58. as the new base. The kernel is often in a relatively unstable state
  59. between release points; basing development on one of those points
  60. increases the chances of running into surprising bugs. When a patch
  61. series must move to a new base, pick a stable point (such as one of
  62. the -rc releases) to move to.
  63. - Realize that reparenting a patch series (or making significant history
  64. modifications) changes the environment in which it was developed and,
  65. likely, invalidates much of the testing that was done. A reparented
  66. patch series should, as a general rule, be treated like new code and
  67. retested from the beginning.
  68. A frequent cause of merge-window trouble is when Linus is presented with a
  69. patch series that has clearly been reparented, often to a random commit,
  70. shortly before the pull request was sent. The chances of such a series
  71. having been adequately tested are relatively low - as are the chances of
  72. the pull request being acted upon.
  73. If, instead, rebasing is limited to private trees, commits are based on a
  74. well-known starting point, and they are well tested, the potential for
  75. trouble is low.
  76. Merging
  77. =======
  78. Merging is a common operation in the kernel development process; the 5.1
  79. development cycle included 1,126 merge commits - nearly 9% of the total.
  80. Kernel work is accumulated in over 100 different subsystem trees, each of
  81. which may contain multiple topic branches; each branch is usually developed
  82. independently of the others. So naturally, at least one merge will be
  83. required before any given branch finds its way into an upstream repository.
  84. Many projects require that branches in pull requests be based on the
  85. current trunk so that no merge commits appear in the history. The kernel
  86. is not such a project; any rebasing of branches to avoid merges will, most
  87. likely, lead to trouble.
  88. Subsystem maintainers find themselves having to do two types of merges:
  89. from lower-level subsystem trees and from others, either sibling trees or
  90. the mainline. The best practices to follow differ in those two situations.
  91. Merging from lower-level trees
  92. ------------------------------
  93. Larger subsystems tend to have multiple levels of maintainers, with the
  94. lower-level maintainers sending pull requests to the higher levels. Acting
  95. on such a pull request will almost certainly generate a merge commit; that
  96. is as it should be. In fact, subsystem maintainers may want to use
  97. the --no-ff flag to force the addition of a merge commit in the rare cases
  98. where one would not normally be created so that the reasons for the merge
  99. can be recorded. The changelog for the merge should, for any kind of
  100. merge, say *why* the merge is being done. For a lower-level tree, "why" is
  101. usually a summary of the changes that will come with that pull.
  102. Maintainers at all levels should be using signed tags on their pull
  103. requests, and upstream maintainers should verify the tags when pulling
  104. branches. Failure to do so threatens the security of the development
  105. process as a whole.
  106. As per the rules outlined above, once you have merged somebody else's
  107. history into your tree, you cannot rebase that branch, even if you
  108. otherwise would be able to.
  109. Merging from sibling or upstream trees
  110. --------------------------------------
  111. While merges from downstream are common and unremarkable, merges from other
  112. trees tend to be a red flag when it comes time to push a branch upstream.
  113. Such merges need to be carefully thought about and well justified, or
  114. there's a good chance that a subsequent pull request will be rejected.
  115. It is natural to want to merge the master branch into a repository; this
  116. type of merge is often called a "back merge". Back merges can help to make
  117. sure that there are no conflicts with parallel development and generally
  118. gives a warm, fuzzy feeling of being up-to-date. But this temptation
  119. should be avoided almost all of the time.
  120. Why is that? Back merges will muddy the development history of your own
  121. branch. They will significantly increase your chances of encountering bugs
  122. from elsewhere in the community and make it hard to ensure that the work
  123. you are managing is stable and ready for upstream. Frequent merges can
  124. also obscure problems with the development process in your tree; they can
  125. hide interactions with other trees that should not be happening (often) in
  126. a well-managed branch.
  127. That said, back merges are occasionally required; when that happens, be
  128. sure to document *why* it was required in the commit message. As always,
  129. merge to a well-known stable point, rather than to some random commit.
  130. Even then, you should not back merge a tree above your immediate upstream
  131. tree; if a higher-level back merge is really required, the upstream tree
  132. should do it first.
  133. One of the most frequent causes of merge-related trouble is when a
  134. maintainer merges with the upstream in order to resolve merge conflicts
  135. before sending a pull request. Again, this temptation is easy enough to
  136. understand, but it should absolutely be avoided. This is especially true
  137. for the final pull request: Linus is adamant that he would much rather see
  138. merge conflicts than unnecessary back merges. Seeing the conflicts lets
  139. him know where potential problem areas are. He does a lot of merges (382
  140. in the 5.1 development cycle) and has gotten quite good at conflict
  141. resolution - often better than the developers involved.
  142. So what should a maintainer do when there is a conflict between their
  143. subsystem branch and the mainline? The most important step is to warn
  144. Linus in the pull request that the conflict will happen; if nothing else,
  145. that demonstrates an awareness of how your branch fits into the whole. For
  146. especially difficult conflicts, create and push a *separate* branch to show
  147. how you would resolve things. Mention that branch in your pull request,
  148. but the pull request itself should be for the unmerged branch.
  149. Even in the absence of known conflicts, doing a test merge before sending a
  150. pull request is a good idea. It may alert you to problems that you somehow
  151. didn't see from linux-next and helps to understand exactly what you are
  152. asking upstream to do.
  153. Another reason for doing merges of upstream or another subsystem tree is to
  154. resolve dependencies. These dependency issues do happen at times, and
  155. sometimes a cross-merge with another tree is the best way to resolve them;
  156. as always, in such situations, the merge commit should explain why the
  157. merge has been done. Take a moment to do it right; people will read those
  158. changelogs.
  159. Often, though, dependency issues indicate that a change of approach is
  160. needed. Merging another subsystem tree to resolve a dependency risks
  161. bringing in other bugs and should almost never be done. If that subsystem
  162. tree fails to be pulled upstream, whatever problems it had will block the
  163. merging of your tree as well. Preferable alternatives include agreeing
  164. with the maintainer to carry both sets of changes in one of the trees or
  165. creating a topic branch dedicated to the prerequisite commits that can be
  166. merged into both trees. If the dependency is related to major
  167. infrastructural changes, the right solution might be to hold the dependent
  168. commits for one development cycle so that those changes have time to
  169. stabilize in the mainline.
  170. Finally
  171. =======
  172. It is relatively common to merge with the mainline toward the beginning of
  173. the development cycle in order to pick up changes and fixes done elsewhere
  174. in the tree. As always, such a merge should pick a well-known release
  175. point rather than some random spot. If your upstream-bound branch has
  176. emptied entirely into the mainline during the merge window, you can pull it
  177. forward with a command like::
  178. git merge v5.2-rc1^0
  179. The "^0" will cause Git to do a fast-forward merge (which should be
  180. possible in this situation), thus avoiding the addition of a spurious merge
  181. commit.
  182. The guidelines laid out above are just that: guidelines. There will always
  183. be situations that call out for a different solution, and these guidelines
  184. should not prevent developers from doing the right thing when the need
  185. arises. But one should always think about whether the need has truly
  186. arisen and be prepared to explain why something abnormal needs to be done.