GithubHelp home page GithubHelp logo

peff / git-imerge Goto Github PK

View Code? Open in Web Editor NEW

This project forked from mhagger/git-imerge

3.0 2.0 1.0 196 KB

Incremental merge for git

License: GNU General Public License v2.0

Python 97.04% Shell 2.96%

git-imerge's Introduction

git-imerge -- incremental merge and rebase for git

Perform the merge between two branches incrementally. If conflicts are encountered, figure out exactly which pairs of commits conflict, and present the user with one pairwise conflict at a time for resolution.

git-imerge has two primary design goals:

  • Reduce the pain of resolving merge conflicts to its unavoidable minimum, by finding and presenting the smallest possible conflicts: those between the changes introduced by one commit from each branch.
  • Allow a merge to be saved, tested, interrupted, published, and collaborated on while it is in progress.

The theory and benefits of incremental merging are described in minute detail in a series of blog posts [1], as are the benefits of retaining history when doing a rebase [2].

Multiple incremental merges can be in progress at the same time. Each incremental merge has a name, and its progress is recorded in the Git repository as references under refs/imerge/NAME. The current state of an incremental merge can (crudely) be visualized using the diagram command.

An incremental merge can be interrupted and resumed arbitrarily, or even pushed to a server to allow somebody else to work on it.

git-imerge is experimental! If it breaks, you get to keep the pieces. For example, it is strongly recommended that you make a clone of your git repository and run the script on the clone rather than the original. Feedback and bug reports are welcome!

Using results

When an incremental merge is finished, you can discard the intermediate merge commits and create a simpler history to record permanently in your project repository using either the finish or simplify command. The incremental merge can be simplified in one of three ways:

merge

keep only a simple merge of the second branch into the first branch, discarding all intermediate merges. The result is similar to what you would get from

git checkout BRANCH1
git merge BRANCH2
rebase

keep the versions of the commits from the second branch rebased onto the first branch. The result is similar to what you would get from

git checkout BRANCH2
git rebase BRANCH1
rebase-with-history
like rebase, except that each of the rebased commits is recorded as a merge from its original version to its rebased predecessor. This is a style of rebasing that does not discard the old version of the branch, and allows an already-published branch to be rebased. See [2] for more information.

Simple operation

For basic operation, you only need to know three git-imerge commands. To merge BRANCH into MASTER or rebase BRANCH onto MASTER,

git checkout MASTER
git-imerge start --name=NAME --goal=GOAL --first-parent BRANCH
while not done:
    <fix conflict presented to you>
    git commit
    git-imerge continue
git-imerge finish

where

NAME
is the name for this merge (and also the default name of the branch to which the results will be saved)
GOAL

describes how you want to simplify the results:

  • merge for a simple merge

  • rebase for a simple rebase

  • rebase-with-history for a rebase that retains history. This is equivalent to merging the commits from BRANCH into MASTER, one commit at a time. In other words, it transforms this:

    o---o---o---o          MASTER
         \
          A---B---C---D    BRANCH
    

    into this:

    o---o---o---o---A'--B'--C'--D'    MASTER
         \         /   /   /   /
          --------A---B---C---D       BRANCH
    

    This is like a rebase, except that it retains the history of individual merges. See [2] for more information.

License

git-imerge is released as open-source software under the GNU General Public License (GPL), version 2 or later.

[1]
[2](1, 2, 3)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.