গিট রিবেসের জন্য আমি কীভাবে মার্জ কৌশল বেছে নিতে পারি?


147

git-rebaseম্যান পেজ উল্লেখ উল্লেখ করা -X<option>যেতে পারে git-merge। কখন / কিভাবে ঠিক?

আমি পুনরাবৃত্ত কৌশল এবং তাদের বিকল্পের সাথে প্যাচগুলি প্রয়োগ করে পুনরায় শোধ করতে চাই (সম্পূর্ণ বিবাদী কমিটগুলি এড়িয়ে যাওয়ার পরিবর্তে যা কিছু লাঠি প্রয়োগ করুন)। আমি একীভূত করতে চাই না, আমি ইতিহাসকে রৈখিক করতে চাই।

আমি চেষ্টা করেছিলাম:

git rebase -Xtheirs

এবং

git rebase -s 'recursive -Xtheirs'

কিন্তু গিট -Xউভয় ক্ষেত্রেই প্রত্যাখ্যান করে ।


git rebase -Xtheirsগাছের দ্বন্দ্বগুলি ম্যানুয়ালি সমাধান করা দরকার বাদে সাম্প্রতিক সংস্করণগুলিতে কাজ করে। এই দ্বন্দ্বগুলি সমাধান করার পরে আপনাকে git rebase -Xtheirs --continue( -Xপুনরাবৃত্তি সহ) চালানো দরকার ।


দ্রষ্টব্য: এটি এখন সাথে কাজ git rebase --interactiveকরে। আমার [নীচে আপডেট হওয়া উত্তর দেখুন ( stackoverflow.com/a/2945367/6309 )।
ভনসি

উত্তর:


229

আপনি এটি Git v1.7.3 বা পরবর্তী সংস্করণগুলির সাথে ব্যবহার করতে পারেন।

git rebase --strategy-option theirs ${branch} # Long option
git rebase -X theirs ${branch} # Short option

(যা ডকুমেন্টেশনেরgit rebase --strategy recursive --strategy-option theirs ${branch} দ্বারা বর্ণিত হিসাবে সংক্ষিপ্ত )

গিট v1.7.3 থেকে রিলিজ নোটগুলি:

git rebase --strategy <s>নির্বাচিত সংযুক্তি কৌশল দ্বারা বোঝার অতিরিক্ত বিকল্পগুলি পাস করার জন্য --strategy-option/ -Xবিকল্পটি শিখেছে ।

এনবি: "আমাদের" এবং "তাদের" এর অর্থ তারা সরাসরি মিশ্রণের সময় যা করেন তার বিপরীত। অন্য কথায়, "তাদের" বর্তমান শাখায় চুক্তির পক্ষে ।


6
স্পষ্ট করতে: it গিট রিবেস - স্টার্টজি রিকার্সিভ-এক্স তাদের
গ্রেগ লিন্ড

28
আমি যখন এটি চেষ্টা করি তখন এর অর্থ oursএবং theirsআমি প্রত্যাশার বিপরীত বলে মনে হয়। আমার theirsআমার বর্তমান শাখার পক্ষে থাকতে প্রয়োজন ।
ক্রেগ ম্যাককুইন

19
@ ক্রেইগম্যাকউইউন, রিবেস ব্যবহার করার সময়, আপনার অপ্রকাশিত (অপ্রকাশিত) কমিটগুলি একপাশে রেখে দেওয়া হয়, শাখাটি দূরবর্তী (দ্রুত-ফরওয়ার্ড) দিয়ে সারিবদ্ধ করা হয়, এবং আপনার কমিটগুলি আপনার শাখার শীর্ষে পুনরায় খেলানো হয়। । আপনার প্রতিশ্রুতিগুলি মার্জ অপারেশন অনুসারে "তাদের" এবং স্থানীয় শাখার বর্তমান (দ্রুত অগ্রগামী) অবস্থা "আমাদের"। বিপরীতমুখী মনে হতে পারে, তবে একবার আপনি বুঝতে পারছেন আসলে কী ঘটছে, তা বোঝা যায়।
দেশপ্রেমেনো

6
@ পাথরিকবেনো: ওবি-ওয়ান কেনোবিকে উদ্ধৃত করার জন্য, "সুতরাং আমি আপনাকে যা বলেছিলাম তা সত্য ছিল ... একটি নির্দিষ্ট দৃষ্টিকোণ থেকে।"
ক্রেগ ম্যাককুইন

5
আমি নিশ্চিত যে এটি যুক্ত করার মতো নয় তবে কমপক্ষে তুলনামূলকভাবে বর্তমান সংস্করণগুলিতে উপস্থিতির উপস্থিতি -Xবোঝায় -s recursive, আপনি এখন সঠিক ব্যবহার করতে পারেন git rebase ${branch} -X theirs। (উত্স git-scm.com/docs/git-rebase#git-rebase--Xltstrategy-optiongt )
ম্যাট প্যাসেল

20

এটি মার্জ কৌশলগুলির জন্য যা তাদের নিজস্ব বিকল্পগুলির সেট নিয়ে আসে

git rebase <branch> -s recursive -X theirs

কাজ করা উচিত, যদিও এই প্যাচটি উল্লেখ করেছে (ফেব্রুয়ারী ২০১০):

ম্যানপেজটি বলেছে যে git-rebaseমার্জ কৌশলগুলি সমর্থন করে তবে রিবেস কমান্ডটি জানে না -Xএবং এটি উপস্থাপিত হলে ব্যবহার দেয়।

সুতরাং যদি এটি এখনও কাজ না করে, এখনই এটি নিয়ে বিতর্ক চলছে!
(সাম্প্রতিক গিট সমর্থিত)


কমিট db2b3b820e2b28da268cc88adff076b396392dfe (জুলাই 2013, গিট 1.8.4+) থেকে আপডেট করুন ,

ইন্টারেক্টিভ রিবেসে মার্জ বিকল্পগুলি উপেক্ষা করবেন না

মার্জ কৌশল এবং এর বিকল্পগুলিতে নির্দিষ্ট করা যেতে পারে git rebaseতবে এর সাথে -- interactiveএগুলি সম্পূর্ণ উপেক্ষা করা হয়েছিল।

সাইন-অফ-বাই: আরনাড ফন্টেইন

এর অর্থ -Xএবং কৌশলটি এখন ইন্টারেক্টিভ রিবেস, পাশাপাশি প্লেইন রিবেস নিয়ে কাজ করে।


1
@ পার্নেল: আমিও তাই ভেবেছিলাম। সুতরাং প্যাচ প্রস্তাব আমার লিঙ্ক।
ভনসি

@ পার্নেল: হ্যাঁ, আমি এই বাগটিও লক্ষ্য করেছি - আমি আশা করি যে এটি খুব আগেই সম্বোধিত হয়ে উঠবে, যদিও সেই প্যাচটি ছিল না অন্যথায়, যেহেতু সমস্ত প্রাথমিক সুবিধা সেখানে রয়েছে; তাদের ঠিক ঠিক করতে হবে যে তারা কীভাবে পুনর্বাসনে একীভূত হওয়ার জন্য যোগাযোগ করতে চলেছে।
ক্যাসাবেল

@ পার্নেল: এটি গিট ১.7.৩ এ অন্তর্ভুক্ত ছিল। আপনি যদি এখনও আমার মতো একজন 1.7.1 ব্যবহারকারী হন তবে একটি সহজ সমাধান রয়েছে, আমার উত্তর নীচে চেক করুন
MestreLion

7

আইক্রাজি যেমন বলেছেন, এই বৈশিষ্ট্যটি কেবলমাত্র 1.7.3 গিটের জন্য উপলব্ধ। সুতরাং, দরিদ্রদের জন্য (আমার মতো) এখনও 1.7.1 ব্যবহার করে, আমি নিজেই একটি সমাধান উপস্থাপন করেছি:

Git-রি-বেসের ফলে-তাহাদেরই

এটি একটি খুব ভাল পালিশযুক্ত (এবং এইভাবে দীর্ঘ) স্ক্রিপ্ট, উত্পাদন ব্যবহারের জন্য বোঝানো হয়েছে: ইউআই বিকল্পগুলি, একাধিক ফাইল পরিচালনা করে, ফাইলটিতে আসলে দ্বন্দ্ব চিহ্নিতকারী রয়েছে কিনা তা পরীক্ষা করে দেখুন, তবে "কোর" সংক্ষেপে 2 টি লাইনে সংক্ষেপিত হতে পারে:

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

এবং এখানে সম্পূর্ণ স্ক্রিপ্ট:

#!/bin/bash
#
# git-rebase-theirs - Resolve rebase conflicts by favoring 'theirs' version
#
#    Copyright (C) 2012 Rodrigo Silva (MestreLion) <linux@rodrigosilva.com>
#
#    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) <linux@rodrigosilva.com>
    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

ধন্যবাদ @ ভনসি! আমি ঠিক নিশ্চিত নই যে এসও বাশ স্ক্রিপ্টটি রঙ-কোডেড করলেন না। এর মতো একটি বড় স্ক্রিপ্ট সর্বদা নিজেই
কুরুচিপূর্ণ

এটি স্ট্যাকওভারফ্লো / এডিটিং - হেল্প# সাইন্ট্যাক্স - হাই হাইলাইটিংয়ে ব্যাখ্যা করা হয়েছে । আমি আপনার কোড ব্লকের আগে উপযুক্ত প্রিটিটিফাই ভাষা কোড যুক্ত করেছি। এটি এখন আরও ভাল চেহারা উচিত।
ভনসি

ধন্যবাদ @ ভনসি! এস-এর সিনট্যাক্স হাইলাইট করা সত্যিই সাবপার, তবে এটি কিছুই অপেক্ষা ভাল। এবং আপনি অত্যন্ত চিন্তাশীল! এবং, এসও -তে গিট অথরিটি হওয়ার কারণে আপনি অন্য একটি সহায়ক স্ক্রিপ্টে আগ্রহী হতে পারেন: stackoverflow.com/a/10220276/624066 । সেই এবং আমার গিথুব অ্যাকাউন্টে এমন সরঞ্জাম রয়েছে যা আপনি উপভোগ করতে পারেন।
MestreLion

1.7.1 এর জন্য, এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে; উপরের স্ক্রিপ্টের দরকার নেই। git rebase --strategy="recursive --theirs" master
পাপডেল্টেসিয়ার

গিট আভিজাত্য হওয়ার জন্য দুঃখিত, তবে উপরে বর্ণিত গিট-রিবেস-থ্রি স্ক্রিপ্টটি কীভাবে ব্যবহার করবেন? এটি কি কোনও উপায়ে গিট-রিবেসে পাস হয়েছে বা ম্যানুয়ালি দ্বন্দ্বগুলি সমাধান করার জন্য প্রয়োজনীয় সময়টি হ্রাস করে?
প্যাপাডেলটিসিয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.