Como faço para selecionar uma estratégia de mesclagem para um rebase git?

Página man do git-rebase menciona -X pode ser passado para o git-merge . Quando / como exatamente?

Eu gostaria de rebase aplicando patches com estratégia recursiva e a opção deles (aplique o que quer que seja, em vez de ignorar commits conflitantes inteiros). Eu não quero mesclar, quero fazer a história linear.

Eu tentei:

 git rebase -Xtheirs 

e

 git rebase -s 'recursive -Xtheirs' 

mas git rejeita -X em ambos os casos.


git rebase -Xtheirs funciona em versões recentes, exceto que conflitos de tree precisam ser resolvidos manualmente. Você precisa executar git rebase -Xtheirs --continue (com -X repetido) depois de resolver esses conflitos.

Você pode usar isso com o Git v1.7.3 ou versões posteriores.

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

De Notas de Lançamento do Git v1.7.3:

git rebase --strategy aprendeu a opção -X para passar opções extras que são entendidas pela estratégia de mesclagem escolhida.

NB: “Nosso” e “deles” significam o oposto do que eles fazem durante uma mesclagem direta. Em outras palavras, “deles” favorece os commits no ramo atual .

Atualização: Editado para ficar mais claro.

Isso é para estratégias de mesclagem que vêm com seu próprio conjunto de opções

 git rebase  -s recursive -X theirs 

deve funcionar, embora este patch menciona (fevereiro de 2010):

A manpage diz que o git-rebase suporta estratégias de mesclagem, mas o comando rebase não sabe sobre -X , e dá o uso quando é apresentado a ele.

Então, se ainda não funcionar, está sendo debatido agora!
(suportado no recente git)


Atualizar a partir do commit db2b3b820e2b28da268cc88adff076b396392dfe (julho de 2013, git 1.8.4+),

Não ignore as opções de mesclagem no rebase interativo

A estratégia de mesclagem e suas opções podem ser especificadas no git rebase , mas com -- interactive , elas foram completamente ignoradas.

Assinado fora: Arnaud Fontaine

Isso significa que -X e estratégia agora funcionam com rebase interativo, bem como rebase simples.

Como disse o iCrazy , este recurso só está disponível para o git 1.7.3 em diante. Então, para as pobres almas (como eu) ainda usando 1.7.1, eu apresento uma solução que eu mesmo fiz:

git-rebase-their

É um script muito bem polido (e, portanto, longo), destinado ao uso em produção: opções ui, lida com vários arquivos, verifica se o arquivo possui marcadores de conflito, etc, mas o “core” pode ser resumido em 2 linhas:

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

E aqui está o roteiro completo:

 #!/bin/bash # # git-rebase-theirs - Resolve rebase conflicts by favoring 'theirs' version # # Copyright (C) 2012 Rodrigo Silva (MestreLion)  # # 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  #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  version (the branch being rebased, 'theirs' side in a rebase), instead of the  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)  License: GPLv3 or later. See  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