summaryrefslogtreecommitdiffstats
path: root/git-rerere.html
diff options
context:
space:
mode:
authorJunio C Hamano <junio@hera.kernel.org>2006-02-07 08:04:39 +0000
committerJunio C Hamano <junio@hera.kernel.org>2006-02-07 08:04:39 +0000
commit40f2f8dd79c1622a7986e2ff2faa15c72860c79f (patch)
tree8caad58489c0d80a936d8185c85f45f19cf0703e /git-rerere.html
parent5e461f9764f680aa78a7c16f1c9182dc36961662 (diff)
downloadgit-htmldocs-40f2f8dd79c1622a7986e2ff2faa15c72860c79f.tar.gz
Autogenerated HTML docs for v1.1.6-g5a79
Diffstat (limited to 'git-rerere.html')
-rw-r--r--git-rerere.html438
1 files changed, 438 insertions, 0 deletions
diff --git a/git-rerere.html b/git-rerere.html
new file mode 100644
index 000000000..cfb530718
--- /dev/null
+++ b/git-rerere.html
@@ -0,0 +1,438 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 7.0.2" />
+<style type="text/css">
+/* Debug borders */
+p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
+/*
+ border: 1px solid red;
+*/
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a { color: blue; }
+a:visited { color: fuchsia; }
+
+em {
+ font-style: italic;
+}
+
+strong {
+ font-weight: bold;
+}
+
+tt {
+ color: navy;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ font-family: sans-serif;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ border-bottom: 2px solid silver;
+ padding-top: 0.5em;
+}
+
+div.sectionbody {
+ font-family: serif;
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+pre {
+ padding: 0;
+ margin: 0;
+}
+
+span#author {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+span#email {
+}
+span#revision {
+ font-family: sans-serif;
+}
+
+div#footer {
+ font-family: sans-serif;
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+div#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+div#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+div#preamble,
+div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-right: 10%;
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.5em;
+ margin-bottom: 2.5em;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ font-family: sans-serif;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock > div.content {
+ padding-left: 2.0em;
+}
+div.quoteblock .attribution {
+ text-align: right;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 2px solid silver;
+}
+
+div.exampleblock > div.content {
+ border-left: 2px solid silver;
+ padding: 0.5em;
+}
+
+div.verseblock div.content {
+ white-space: pre;
+}
+
+div.imageblock div.content { padding-left: 0; }
+div.imageblock img { border: 1px solid silver; }
+span.image img { border-style: none; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: italic;
+}
+dd > *:first-child {
+ margin-top: 0;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.olist2 {
+ list-style-type: lower-alpha;
+}
+
+div.tableblock > table {
+ border-color: #527bbd;
+ border-width: 3px;
+}
+thead {
+ font-family: sans-serif;
+ font-weight: bold;
+}
+tfoot {
+ font-weight: bold;
+}
+
+div.hlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+td.hlist1 {
+ vertical-align: top;
+ font-style: italic;
+ padding-right: 0.8em;
+}
+td.hlist2 {
+ vertical-align: top;
+}
+
+@media print {
+ div#footer-badges { display: none; }
+}
+include::./stylesheets/xhtml11-manpage.css[]
+/* Workarounds for IE6's broken and incomplete CSS2. */
+
+div.sidebar-content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+div.sidebar-title, div.image-title {
+ font-family: sans-serif;
+ font-weight: bold;
+ margin-top: 0.0em;
+ margin-bottom: 0.5em;
+}
+
+div.listingblock div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock-content {
+ padding-left: 2.0em;
+}
+
+div.exampleblock-content {
+ border-left: 2px solid silver;
+ padding-left: 0.5em;
+}
+</style>
+<title>git-rerere(1)</title>
+</head>
+<body>
+<div id="header">
+<h1>
+git-rerere(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>git-rerere -
+ Reuse recorded resolve
+</p>
+</div>
+</div>
+<h2>SYNOPSIS</h2>
+<div class="sectionbody">
+<p><em>git-rerere</em></p>
+</div>
+<h2>DESCRIPTION</h2>
+<div class="sectionbody">
+<p>In a workflow that employs relatively long lived topic branches,
+the developer sometimes needs to resolve the same conflict over
+and over again until the topic branches are done (either merged
+to the "release" branch, or sent out and accepted upstream).</p>
+<p>This command helps this process by recording conflicted
+automerge results and corresponding hand-resolve results on the
+initial manual merge, and later by noticing the same automerge
+results and applying the previously recorded hand resolution.</p>
+<div class="admonitionblock">
+<table><tr>
+<td class="icon">
+<div class="title">Note</div>
+</td>
+<td class="content">You need to create <tt>$GIT_DIR/rr-cache</tt> directory to enable this
+command.</td>
+</tr></table>
+</div>
+</div>
+<h2>DISCUSSION</h2>
+<div class="sectionbody">
+<p>When your topic branch modifies overlapping area that your
+master branch (or upstream) touched since your topic branch
+forked from it, you may want to test it with the latest master,
+even before your topic branch is ready to be pushed upstream:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt> o---*---o topic
+ /
+ o---o---o---*---o---o master</tt></pre>
+</div></div>
+<p>For such a test, you need to merge master and topic somehow.
+One way to do it is to pull master into the topic branch:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt> $ git checkout topic
+ $ git pull . master
+
+ o---*---o---+ topic
+ / /
+ o---o---o---*---o---o master</tt></pre>
+</div></div>
+<p>The commits marked with <tt>*</tt> touch the same area in the same
+file; you need to resolve the conflicts when creating the commit
+marked with <tt>+</tt>. Then you can test the result to make sure your
+work-in-progress still works with what is in the latest master.</p>
+<p>After this test merge, there are two ways to continue your work
+on the topic. The easiest is to build on top of the test merge
+commit <tt>+</tt>, and when your work in the topic branch is finally
+ready, pull the topic branch into master, and/or ask the
+upstream to pull from you. By that time, however, the master or
+the upstream might have been advanced since the test merge <tt>+</tt>,
+in which case the final commit graph would look like this:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt> $ git checkout topic
+ $ git pull . master
+ $ ... work on both topic and master branches
+ $ git checkout master
+ $ git pull . topic
+
+ o---*---o---+---o---o topic
+ / / \
+ o---o---o---*---o---o---o---o---+ master</tt></pre>
+</div></div>
+<p>When your topic branch is long-lived, however, your topic branch
+would end up having many such "Merge from master" commits on it,
+which would unnecessarily clutter the development history.
+Readers of the Linux kernel mailing list may remember that Linus
+complained about such too frequent test merges when a subsystem
+maintainer asked to pull from a branch full of "useless merges".</p>
+<p>As an alternative, to keep the topic branch clean of test
+merges, you could blow away the test merge, and keep building on
+top of the tip before the test merge:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt> $ git checkout topic
+ $ git pull . master
+ $ git reset --hard HEAD^ ;# rewind the test merge
+ $ ... work on both topic and master branches
+ $ git checkout master
+ $ git pull . topic
+
+ o---*---o-------o---o topic
+ / \
+ o---o---o---*---o---o---o---o---+ master</tt></pre>
+</div></div>
+<p>This would leave only one merge commit when your topic branch is
+finally ready and merged into the master branch. This merge
+would require you to resolve the conflict, introduced by the
+commits marked with <tt>*</tt>. However, often this conflict is the
+same conflict you resolved when you created the test merge you
+blew away. <tt>git-rerere</tt> command helps you to resolve this final
+conflicted merge using the information from your earlier hand
+resolve.</p>
+<p>Running <tt>git-rerere</tt> command immediately after a conflicted
+automerge records the conflicted working tree files, with the
+usual conflict markers <tt>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</tt>, <tt>=======</tt>, and <tt>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</tt> in
+them. Later, after you are done resolving the conflicts,
+running <tt>git-rerere</tt> again records the resolved state of these
+files. Suppose you did this when you created the test merge of
+master into the topic branch.</p>
+<p>Next time, running <tt>git-rerere</tt> after seeing a conflicted
+automerge, if the conflict is the same as the earlier one
+recorded, it is noticed and a three-way merge between the
+earlier conflicted automerge, the earlier manual resolution, and
+the current conflicted automerge is performed by the command.
+If this three-way merge resolves cleanly, the result is written
+out to your working tree file, so you would not have to manually
+resolve it. Note that <tt>git-rerere</tt> leaves the index file alone,
+so you still need to do the final sanity checks with <tt>git diff</tt>
+(or <tt>git diff -c</tt>) and <tt>git update-index</tt> when you are
+satisfied.</p>
+<p>As a convenience measure, <tt>git-merge</tt> automatically invokes
+<tt>git-rerere</tt> when it exits with a failed automerge, which
+records it if it is a new conflict, or reuses the earlier hand
+resolve when it is not. <tt>git-commit</tt> also invokes <tt>git-rerere</tt>
+when recording a merge result. What this means is that you do
+not have to do anything special yourself (Note: you still have
+to create <tt>$GIT_DIR/rr-cache</tt> directory to enable this command).</p>
+<p>In our example, when you did the test merge, the manual
+resolution is recorded, and it will be reused when you do the
+actual merge later with updated master and topic branch, as long
+as the earlier resolution is still applicable.</p>
+<p>The information <tt>git-rerere</tt> records is also used when running
+<tt>git-rebase</tt>. After blowing away the test merge and continuing
+development on the topic branch:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt> o---*---o-------o---o topic
+ /
+ o---o---o---*---o---o---o---o master
+
+ $ git rebase master topic
+
+ o---*---o-------o---o topic
+ /
+ o---o---o---*---o---o---o---o master</tt></pre>
+</div></div>
+<p>you could run <tt>git rebase master topic</tt>, to keep yourself
+up-to-date even before your topic is ready to be sent upstream.
+This would result in falling back to three-way merge, and it
+would conflict the same way the test merge you resolved earlier.
+<tt>git-rerere</tt> is run by <tt>git rebase</tt> to help you resolve this
+conflict.</p>
+</div>
+<h2>Author</h2>
+<div class="sectionbody">
+<p>Written by Junio C Hamano &lt;junkio@cox.net&gt;</p>
+</div>
+<h2>GIT</h2>
+<div class="sectionbody">
+<p>Part of the <a href="git.html">git(7)</a> suite</p>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 07-Feb-2006 08:04:31 UTC
+</div>
+</div>
+</body>
+</html>