tipos tag repositorio qué existen etiquetas crear git git-rebase

tag - qué tipos de etiquetas existen en git



¿Cómo selecciono una estrategia de fusión para una base de datos de git? (3)

git-rebase manual de git-rebase mencionan -X<option> se pueden pasar a git-merge . Cuándo / cómo exactamente?

Me gustaría volver a establecer la base mediante la aplicación de parches con estrategia recursiva y la opción de ellos (aplicar los palos, en lugar de omitir compromisos completos conflictivos). No quiero fusionarme, quiero hacer que la historia sea lineal.

He intentado:

git rebase -Xtheirs

y

git rebase -s ''recursive -Xtheirs''

pero git rechaza -X en ambos casos.

git rebase -Xtheirs funciona en versiones recientes, excepto que los conflictos de árbol deben resolverse manualmente. Necesita ejecutar git rebase -Xtheirs --continue (con -X git rebase -Xtheirs --continue ) después de resolver esos conflictos.


Como dijo iCrazy , esta función solo está disponible para git 1.7.3 en adelante. Entonces, para las pobres almas (como yo) que todavía usan 1.7.1, presento una solución que hice yo mismo:

git-rebase-theirs

Es un script muy bien pulido (y por lo tanto extenso), destinado para uso de producción: opciones de ui, maneja múltiples archivos, verifica si el archivo tiene marcadores de conflicto, etc., pero el "núcleo" se puede 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+=( "$@" ) (( "${#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


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

git rebase <branch> -s recursive -X theirs

debería funcionar, aunque este parche menciona (febrero de 2010):

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

Entonces, si todavía no funciona, se está debatiendo ahora mismo.
(soportado en git reciente)

Actualización desde la confirmación db2b3b820e2b28da268cc88adff076b396392dfe (julio de 2013, git 1.8.4+),

No ignore las opciones de combinación en la rebase interactiva

La estrategia de combinación y sus opciones se pueden especificar en git rebase , pero con -- interactive , se ignoraron por completo.

Firmado por: Arnaud Fontaine

Eso significa que -X y la estrategia ahora funcionan con una rebase interactiva, así como una rebase simple.


Puede usar esto con Git v1.7.3 o versiones posteriores.

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

De las notas de la versión de Git v1.7.3:

git rebase --strategy <s> aprendió la opción -X para pasar opciones adicionales que sean entendidas por la estrategia de fusión elegida.

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

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