2010-05-31 21 views
105

git-rebase la página del manual menciona -X<option> se puede pasar al git-merge. Cuándo/cómo exactamente?¿Cómo selecciono una estrategia de combinación para una base de datos de git?

me gustaría rebase por la aplicación de parches con estrategia recursiva y opción de ellos (se aplica lo pega, en lugar de saltarse todo conflicto se compromete). No quiero fusionarme, quiero hacer que la historia sea lineal.

que he probado:

git rebase -Xtheirs 

y

git rebase -s 'recursive -Xtheirs' 

pero git rechaza -X en ambos casos.


git rebase -Xtheirs obras en las versiones recientes, excepto conflictos de árboles deben ser resueltas de forma manual. Debe ejecutar git rebase -Xtheirs --continue (con -X repetido) después de resolver esos conflictos.

+0

Nota: esto ahora también funciona con 'git rebase --interactive'. Ver mi [respuesta actualizada a continuación (http://stackoverflow.com/a/2945367/6309). – VonC

Respuesta

154

Puede usarlo con Git v1.7.3 o versiones posteriores.

git rebase -s recursive -X theirs ${branch} 

De Git v1.7.3 Release Notes:

git rebase --strategy <s> aprendieron la opción -X para pasar opciones adicionales que puedan ser entendidos por la estrategia de combinación elegida.

NB: "Ours" y "theirs" significan lo contrario de lo que hacen durante una fusión directa. En otras palabras, "theirs" favorece los commits en la rama actual.

Actualización: Editado para ser más claro.

+3

para aclarar: $ git rebase --strategy recursivo -X de ellos –

+0

@iCrazy: entonces, ¿es '-X el suyo? o '-Xtheirs'? Por lo general, los argumentos de las opciones de 1 letra se concatenan a la opción en sí ... ¿es git diferente a este respecto? – MestreLion

+0

Además, para desafortunados usuarios de git 1.7.1, verifique mi respuesta para una solución – MestreLion

13

Esto es para las estrategias de combinación que vienen con su propio conjunto de opciones

git rebase <branch> -s recursive -X theirs 

debería funcionar, aunque this patch mentions (febrero de 2010):

La página de manual dice que git-rebase soportes se unen estrategias, pero el comando rebase no sabe acerca de -X, y da el uso cuando se le presenta.

Así que si todavía no funciona, se está debatiendo en este momento!
(apoyado en los últimos GIT)


actualización de commit db2b3b820e2b28da268cc88adff076b396392dfe (julio de 2013, git 1.8.4+),

No ignore fusionar las opciones de rebase interactivo estrategia

Merge y sus opciones se pueden especificar en git rebase, pero con -- interactive, se ignoraron por completo.

Signed-off-by: Arnaud Fontaine

Eso significa -X y la estrategia ahora trabajan con rebase interactivo, así como de rebase sin formato.

+0

'-X theirs' (with space) tampoco funcionó en git 1.7.1. – Kornel

+1

@porneL: Eso creía. De ahí mi enlace a la propuesta de parche. – VonC

+0

@porneL: Sí, también he notado este error. Sin embargo, espero que se solucione pronto, ya sea con ese parche o de otro modo, ya que todas las instalaciones básicas están ahí; solo tienen que decidir exactamente cómo se van a comunicar desde rebase para fusionarse. – Cascabel

4

Como dijo iCrazy, esta función solo está disponible para git 1.7.3 en adelante. Por lo tanto, por las pobres almas (como yo) sigue utilizando 1.7.1, presento una solución que hice a mí mismo:

git-rebase-theirs

Es un guión muy bien pulida (y por tanto de largo), destinado a la producción uso: opciones de interfaz de usuario, se ocupa de varios archivos, compruebe si el archivo en realidad tiene marcas de conflicto, etc, pero el "núcleo" se podría resumir en 2 líneas:

cp file file.bak 
awk '/^<+ HEAD$/,/^=+$/{next} /^>+ /{next} 1' file.bak > file 

Y aquí está el guión completo:

#!/bin/bash 
# 
# git-rebase-theirs - Resolve rebase conflicts by favoring 'theirs' version 
# 
# Copyright (C) 2012 Rodrigo Silva (MestreLion) <[email protected]> 
# 
# This program is free software: you can redistribute it and/or modify 
# it under the terms of the GNU General Public License as published by 
# the Free Software Foundation, either version 3 of the License, or 
# (at your option) any later version. 
# 
# This program is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
# GNU General Public License for more details. 
# 
# You should have received a copy of the GNU General Public License 
# along with this program. If not see <http://www.gnu.org/licenses/gpl.html> 

#Defaults: 
verbose=0 
backup=1 
inplace=0 
ext=".bak" 

message() { printf "%s\n" "$1" >&2 ; } 
skip() { message "skipping ${2:-$file}${1:+: $1}"; continue ; } 
argerr() { printf "%s: %s\n" "$myname" "${1:-error}" >&2 ; usage 1 ; } 
invalid() { argerr "invalid option: $1" ; } 
missing() { argerr "missing${1:+ $1} operand." ; } 

usage() { 
    cat <<- USAGE 
    Usage: $myname [options] [--] FILE... 
    USAGE 
    if [[ "$1" ]] ; then 
     cat >&2 <<- USAGE 
     Try '$myname --help' for more information. 
     USAGE 
     exit 1 
    fi 
    cat <<-USAGE 

    Resolve git rebase conflicts in FILE(s) by favoring 'theirs' version 

    When using git rebase, conflicts are usually wanted to be resolved 
    by favoring the <working branch> version (the branch being rebased, 
    'theirs' side in a rebase), instead of the <upstream> version (the 
    base branch, 'ours' side) 

    But git rebase --strategy -X theirs is only available from git 1.7.3 
    For older versions, $myname is the solution. 

    It works by discarding all lines between '<<<<<<< HEAD' and '========' 
    inclusive, and also the the '>>>>>> commit' marker. 

    By default it outputs to stdout, but files can be edited in-place 
    using --in-place, which, unlike sed, creates a backup by default. 

    Options: 
     -h|--help   show this page. 
     -v|--verbose   print more details in stderr. 

     --in-place[=SUFFIX] edit files in place, creating a backup with 
          SUFFIX extension. Default if blank is ""$ext" 

     --no-backup   disables backup 

    Copyright (C) 2012 Rodrigo Silva (MestreLion) <[email protected]> 
    License: GPLv3 or later. See <http://www.gnu.org/licenses/gpl.html> 
    USAGE 
    exit 0 
} 
myname="${0##*/}" 

# Option handling 
files=() 
while (($#)); do 
    case "$1" in 
    -h|--help ) usage   ;; 
    -v|--verbose ) verbose=1  ;; 
    --no-backup ) backup=0   ;; 
    --in-place ) inplace=1  ;; 
    --in-place=* ) inplace=1 
        suffix="${1#*=}" ;; 
    -*   ) invalid "$1"  ;; 
    --   ) shift ; break ;; 
    *   ) files+=("$1") ;; 
    esac 
    shift 
done 
files+=("[email protected]") 

(("${#files[@]}")) || missing "FILE" 

ext=${suffix:-$ext} 

for file in "${files[@]}"; do 

    [[ -f "$file" ]] || skip "not a valid file" 

    if ((inplace)); then 
     outfile=$(tempfile) || skip "could not create temporary file" 
     trap 'rm -f -- "$outfile"' EXIT 
     cp "$file" "$outfile" || skip 
     exec 3>"$outfile" 
    else 
     exec 3>&1 
    fi 

    # Do the magic :) 
    awk '/^<+ HEAD$/,/^=+$/{next} /^>+ /{next} 1' "$file" >&3 

    exec 3>&- 

    ((inplace)) || continue 

    diff "$file" "$outfile" >/dev/null && skip "no conflict markers found" 

    ((backup)) && { cp "$file" "$file$ext" || skip "could not backup" ; } 

    cp "$outfile" "$file" || skip "could not edit in-place" 

    ((verbose)) && message "resolved ${file}" 
done 
+0

Gracias @VonC! No estoy seguro de por qué SO no codificó por colores el script bash. Un gran script como este siempre es feo por sí mismo ... pero al ser una gran cantidad de texto negro lo hace aún más feo: P – MestreLion

+0

Se explica en http://stackoverflow.com/editing-help#syntax-highlighting. He agregado el código de idioma apropiado antes del bloque de código. Debería verse mejor ahora. – VonC

+0

Gracias @VonC! El resaltado de sintaxis de SO es realmente insatisfactorio, pero es mejor que nada. ¡Y eres extremadamente considerado! Y, al ser * THE * git authorithy en SO, puede que le interese otro script de ayuda: http://stackoverflow.com/a/10220276/624066. Esa y mi cuenta de github tienen herramientas que puedes disfrutar. – MestreLion

Cuestiones relacionadas