চেকআউটগুলি ব্যবহার না করে গিট শাখাগুলি মার্জ করুন, আপডেট করুন এবং টানুন


627

আমি এমন একটি প্রকল্পে কাজ করি যার ২ টি শাখা, এ এবং বি রয়েছে I আমি সাধারণত শাখা A তে কাজ করি এবং শাখা বি থেকে স্টাফ মার্জ করি the মার্জ করার জন্য, আমি সাধারণত:

git merge origin/branchB

তবে আমি শাখা বি এর একটি স্থানীয় কপিও রাখতে চাই, কারণ আমি মাঝেমধ্যে আমার শাখা এ এর ​​সাথে প্রথম যুক্ত না হয়ে শাখাটি পরীক্ষা করে দেখতে পারি this এজন্য আমি এটি করব:

git checkout branchB
git pull
git checkout branchA

উপরের এক কমান্ডে করার কোনও উপায় আছে, এবং শাখাটি পিছনে পিছনে স্যুইচ না করে? আমি কি তার git update-refজন্য ব্যবহার করা উচিত? কিভাবে?



1
প্রথম লিঙ্কযুক্ত প্রশ্নের জাকুবের উত্তর ব্যাখ্যা করে যে এটি কেন সাধারণভাবে অসম্ভব। আরেকটি (একটি পোস্টেরিয়েরি) ব্যাখ্যা হ'ল আপনি একটি খালি রেপোতে মার্জ করতে পারবেন না, সুতরাং স্পষ্টতই এর জন্য কাজের গাছ প্রয়োজন।
ক্যাসকেবেল

3
@ এরিক: সাধারণ কারণগুলি হ'ল চেকআউটগুলি বড় স্টোরের জন্য সময় সাপেক্ষ এবং আপনি একই সংস্করণে ফিরে আসার পরেও তারা টাইমস্ট্যাম্পগুলি আপডেট করেন, তাই মনে করুন যে সবকিছু পুনর্নির্মাণ করা দরকার।
ক্যাসকেবেল

আমি যুক্ত দ্বিতীয় প্রশ্নটি একটি অস্বাভাবিক কেস সম্পর্কে জিজ্ঞাসা করছি - মার্জগুলি যা দ্রুত-ফরওয়ার্ড হতে পারে, তবে যেটি ওপি --no-ffঅপশনটি ব্যবহার করে মার্জ করতে চেয়েছিল , যার ফলে কোনও মার্জ কমিটিকে যেভাবেই রেকর্ড করা হতে পারে। আপনি যদি তাতে আগ্রহী হন, আমার উত্তরটি সেখানে দেখায় যে আপনি কীভাবে এটি করতে পারেন - আমার পোস্টের উত্তর হিসাবে এখানে এতটা দৃ not় নয়, তবে দুজনের শক্তি অবশ্যই একত্রিত হতে পারে।
ক্যাসকেবেল

উত্তর:


971

সংক্ষিপ্ত উত্তর

যতক্ষণ আপনি দ্রুত-ফরোয়ার্ড মার্জ করছেন , ততক্ষণ আপনি কেবল ব্যবহার করতে পারবেন

git fetch <remote> <sourceBranch>:<destinationBranch>

উদাহরণ:

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

যদিও অ্যাম্বারের উত্তর দ্রুত-ফরওয়ার্ড ক্ষেত্রেও কাজ করবে, git fetchপরিবর্তে এইভাবে ব্যবহার করা কেবল শাখার রেফারেন্সকে জোর করে চালানোর চেয়ে কিছুটা নিরাপদ, যেহেতু git fetchআপনি যতক্ষণ না ব্যবহার +করেন ততক্ষণ স্বয়ংক্রিয়ভাবে দুর্ঘটনাজনিত অ-ফাস্ট-ফরওয়ার্ডগুলি রোধ করবে refspec।

দীর্ঘ উত্তর

আপনি প্রথমে একটি পরীক্ষা না করেই একটি শাখা বি একটি শাখায় মার্জ করতে পারবেন না যদি এটির ফলে-দ্রুত-ফরওয়ার্ড একীকরণের ফলাফল হয়। এটি কারণ যে কোনও সম্ভাব্য বিবাদগুলি সমাধান করার জন্য একটি ওয়ার্কিং কপি প্রয়োজন।

তবে দ্রুত-ফরোয়ার্ড মার্জগুলির ক্ষেত্রে এটি সম্ভব , কারণ এই জাতীয় সংশ্লেষ কখনই সংঘাত সৃষ্টি করতে পারে না, সংজ্ঞা অনুসারে। প্রথমে কোনও শাখা পরীক্ষা না করে এটি করার জন্য, আপনি git fetchএকটি রেফস্পেক দিয়ে ব্যবহার করতে পারেন ।

masterআপনার যদি আরও একটি শাখা featureচেক আউট করে থাকে তবে আপডেট করার (দ্রুত-অগ্রসর হওয়া পরিবর্তনগুলি অস্বীকার করে) উদাহরণের উদাহরণ এখানে দেওয়া হয়েছে:

git fetch upstream master:master

এই ব্যবহারের কেসটি এত সাধারণ, আপনি সম্ভবত এটির মতো আপনার গিট কনফিগারেশন ফাইলে এর জন্য একটি উপাত্ত তৈরি করতে চান:

[alias]
    sync = !sh -c 'git checkout --quiet HEAD; git fetch upstream master:master; git checkout --quiet -'

এই ওরফে যা করে তা নিম্নলিখিত:

  1. git checkout HEAD: এটি আপনার কার্যকরী অনুলিপিটিকে বিচ্ছিন্ন অবস্থায় রাখে into এটি দরকারী যদি আপনি আপডেট করতে চান masterযখন এটি চেক-আউট হওয়ার সময় ঘটে। আমি মনে করি এটি করা দরকার ছিল কারণ অন্যথায় শাখার উল্লেখটি masterসরবে না, তবে আমার মাথার উপরের অংশটি সত্যই ঠিক আছে কিনা তা আমার মনে নেই।

  2. git fetch upstream master:master: এটি আপনার স্থানীয়কে masterএকই জায়গায় দ্রুত ফরোয়ার্ড করে upstream/master

  3. git checkout -আপনার পূর্ববর্তী চেক-আউট শাখাটি পরীক্ষা করে দেখুন (এটি -এই ক্ষেত্রে কী করে)।

git fetch(অ-) দ্রুত-ফরোয়ার্ড মার্জগুলির সিনট্যাক্স

আপনি fetchযদি আপডেটটি দ্রুত-ফরওয়ার্ড না করে কমান্ডটি ব্যর্থ করতে চান তবে আপনি কেবলমাত্র ফর্মটির একটি রেসপেক ব্যবহার করুন

git fetch <remote> <remoteBranch>:<localBranch>

আপনি যদি নন-ফাস্ট-ফরওয়ার্ড আপডেটগুলি অনুমতি দিতে চান তবে আপনি +রেফস্পেকের সামনের অংশে একটি যুক্ত করুন:

git fetch <remote> +<remoteBranch>:<localBranch>

মনে রাখবেন যে আপনি আপনার স্থানীয় রেপো ব্যবহার করে "রিমোট" পরামিতি হিসাবে পাস করতে পারেন .:

git fetch . <sourceBranch>:<destinationBranch>

ডকুমেন্টেশন

git fetchএই সিনট্যাক্সটি (জোর দিয়ে খনি) ব্যাখ্যা করে এমন ডকুমেন্টেশন থেকে :

<refspec>

<refspec>প্যারামিটারের বিন্যাস হ'ল optionচ্ছিক প্লাস +, উত্স রেফের পরে <src>, পরে একটি কোলন :, গন্তব্য রেফের পরে <dst>

দূরবর্তী রেফ যে ম্যাচগুলি <src>আনা হয় এবং যদি <dst>খালি স্ট্রিং না হয় তবে স্থানীয় রেফ এটি মিলিয়ে দ্রুত ব্যবহার করে<src> । Alচ্ছিক প্লাস+ব্যবহার করা হলে, স্থানীয় রেফ আপডেট করা হয় এমনকি যদি এটি দ্রুত-ফরওয়ার্ড আপডেট না করে।

আরো দেখুন

  1. কাজের গাছের ছোঁয়া ছাড়াই গিট চেকআউট এবং মার্জ করুন

  2. কার্যকরী ডিরেক্টরি পরিবর্তন না করে মার্জ করা


3
git checkout --quiet HEADহয় git checkout --quiet --detachগীত 1.7.5 হিসাবে।
রাফা

6
আমি দেখতে পেয়েছি যে git fetch . origin/foo:fooআমার করতে হয়েছে: আমার স্থানীয় উত্সকে আমার স্থানীয় উত্স /
ওয়েস্টন

3
"গিট চেকআউট হেড - ক্যুইট" এবং "গিট চেকআউট - কোয়েট -" অংশগুলি দীর্ঘ উত্তরের অন্তর্ভুক্ত করার কোনও কারণ আছে, তবে সংক্ষিপ্ত উত্তর নয়? আমি অনুমান করি কারণ স্ক্রিপ্টটি চালিত হতে পারে যখন আপনি মাস্টার চেক আউট করেছেন, যদিও আপনি কেবল গিট টানতে পারেন?
শন

8
কেন এখানে 'একীভূত' করার আদেশটি 'আনয়ন' করা হচ্ছে ... এটি সহজভাবে বোঝায় না; যদি 'টান' 'আনয়ন' এর পরে 'মার্জ' হয় তবে অবশ্যই আরও যুক্তিসঙ্গত 'মার্জ - কেবলমাত্র' সমতুল্য থাকতে হবে যা স্থানীয়ভাবে 'উত্স / শাখা' থেকে 'শাখা' আপডেট করে, যদি একটি 'আনয়ন' থাকে ইতিমধ্যে চালানো হয়েছে।
এড র‌্যান্ডাল

1
git checkout -কৌতুক জন্য ধন্যবাদ ! ঠিক যেমন সহজ cd -
স্টেড

84

কোন নেই. লক্ষ্যযুক্ত শাখার একটি চেকআউট আপনাকে অন্যান্য বিষয়গুলির মধ্যেও বিরোধগুলি সমাধানের জন্য অনুমতি দিতে প্রয়োজনীয় (যদি গিট এগুলি স্বয়ংক্রিয়ভাবে মার্জ করতে অক্ষম হয়)।

যাইহোক, যদি মার্জটি দ্রুত-ফরওয়ার্ড হতে পারে তবে আপনাকে লক্ষ্য শাখাটি পরীক্ষা করে দেখার দরকার নেই, কারণ আপনাকে আসলে কোনও কিছুই মার্জ করার দরকার নেই - আপনাকে যা করতে হবে তা কেবল নির্দেশ করতে শাখাটি আপডেট করতে হবে নতুন মাথা রেফ আপনি এটি দিয়ে এটি করতে পারেন git branch -f:

git branch -f branch-b branch-a

branch-bএর মাথা নির্দেশ করতে আপডেট হবে branch-a

-fবিকল্প ঘোরা --force, যার মানে আপনি সতর্কতা অবলম্বন এটি ব্যবহার করা আবশ্যক।

আপনি একত্রীকরণটি দ্রুত অগ্রসর হওয়ার বিষয়ে নিশ্চিত না হলে এটি ব্যবহার করবেন না।


46
এটি না করার জন্য খুব সতর্কতা অবলম্বন করুন আপনি যদি না পুরোপুরি নিশ্চিত না করে থাকেন যে মার্জটি দ্রুত-অগ্রসর হতে পারে! পরে আপনি বুঝতে চান না যে আপনি কমিটগুলি ভুল জায়গায় রেখেছেন।
ক্যাসাবেল

@ ফুয়াদসৌদ হুবহু নয় git resetশুধুমাত্র বর্তমানে চেক-আউট শাখায় কাজ করে।
আম্বর

9
একই ফলাফল (দ্রুত-ফরওয়ার্ডিং) দ্বারা অর্জন করা হয় git fetch upstream branch-b:branch-b( এই উত্তর থেকে নেওয়া )।
অলিভার

6
অলিভারের মন্তব্যে প্রসারিত করতে, আপনি এটিও করতে পারেন git fetch <remote> B:A, যেখানে বি এবং এ সম্পূর্ণ আলাদা শাখা রয়েছে, তবে বি দ্রুত-ফরোয়ার্ড এ এ রূপান্তর করতে পারে আপনি .দূরবর্তী উপন্যাস হিসাবে ব্যবহার করে আপনার স্থানীয় সংগ্রহস্থলটিকে "রিমোট" হিসাবে পাস করতে পারেন : git fetch . B:A

8
ওপির প্রশ্নটি এটিকে মোটামুটি পরিষ্কার করে দিয়েছে যে মার্জটি সত্যই দ্রুত এগিয়ে যাবে। নির্বিশেষে, branch -fবিপজ্জনক হতে পারে, আপনি উল্লেখ হিসাবে। সুতরাং এটি ব্যবহার করবেন না! ব্যবহার করুন fetch origin branchB:branchB, যা মার্জটি দ্রুত অগ্রসর না হলে নিরাপদে ব্যর্থ হবে।
বেনেট ম্যাকএলউই

30

অ্যাম্বার যেমন বলেছিলেন, দ্রুত-ফরোয়ার্ড মার্জগুলি হ'ল একমাত্র ক্ষেত্রে আপনি সম্ভবত এই কাজটি করতে পারেন। অন্য যে কোনও মার্জটি কল্পিতভাবে পুরো ত্রি-মুখী সংশ্লেষের মধ্য দিয়ে যেতে হবে, প্যাচগুলি প্রয়োগ করতে হবে, দ্বন্দ্বের সমাধানকে সমাধান করতে হবে - এবং এর অর্থ এর চারপাশে ফাইল থাকা দরকার।

আমার ঠিক এই জন্য ব্যবহার করার জন্য আমার কাছে একটি স্ক্রিপ্ট রয়েছে: কাজের গাছটিকে স্পর্শ না করে দ্রুত-ফরোয়ার্ড মার্জ করা (যদি আপনি হেডে মার্জ না করেন)। এটি সামান্য দীর্ঘ, কারণ এটি কমপক্ষে কিছুটা শক্তিশালী - এটি মার্জটি দ্রুতগতির হবে তা নিশ্চিত করে পরীক্ষা করে, তারপরে শাখাটি পরীক্ষা না করেই এটি সম্পাদন করে, তবে আপনার যেমন ফলাফল তৈরি করে - আপনি দেখুন diff --statপরিবর্তনের সংক্ষিপ্তসার এবং রিফ্লোগের এন্ট্রি হ'ল দ্রুত ফরোয়ার্ড মার্জের মতো, আপনি যদি ব্যবহার করেন তবে "রিসেট" করার পরিবর্তে branch -f। আপনি এটির নাম যদি git-merge-ffএবং আপনার bin ডিরেক্টরীতে ছেড়ে দিন, আপনি এটি একটি Git কমান্ড যেমন কল করতে পারেন: git merge-ff

#!/bin/bash

_usage() {
    echo "Usage: git merge-ff <branch> <committish-to-merge>" 1>&2
    exit 1
}

_merge_ff() {
    branch="$1"
    commit="$2"

    branch_orig_hash="$(git show-ref -s --verify refs/heads/$branch 2> /dev/null)"
    if [ $? -ne 0 ]; then
        echo "Error: unknown branch $branch" 1>&2
        _usage
    fi

    commit_orig_hash="$(git rev-parse --verify $commit 2> /dev/null)"
    if [ $? -ne 0 ]; then
        echo "Error: unknown revision $commit" 1>&2
        _usage
    fi

    if [ "$(git symbolic-ref HEAD)" = "refs/heads/$branch" ]; then
        git merge $quiet --ff-only "$commit"
    else
        if [ "$(git merge-base $branch_orig_hash $commit_orig_hash)" != "$branch_orig_hash" ]; then
            echo "Error: merging $commit into $branch would not be a fast-forward" 1>&2
            exit 1
        fi
        echo "Updating ${branch_orig_hash:0:7}..${commit_orig_hash:0:7}"
        if git update-ref -m "merge $commit: Fast forward" "refs/heads/$branch" "$commit_orig_hash" "$branch_orig_hash"; then
            if [ -z $quiet ]; then
                echo "Fast forward"
                git diff --stat "$branch@{1}" "$branch"
            fi
        else
            echo "Error: fast forward using update-ref failed" 1>&2
        fi
    fi
}

while getopts "q" opt; do
    case $opt in
        q ) quiet="-q";;
        * ) ;;
    esac
done
shift $((OPTIND-1))

case $# in
    2 ) _merge_ff "$1" "$2";;
    * ) _usage
esac

পিএস যদি কেউ এই স্ক্রিপ্টের সাথে কোনও সমস্যা দেখেন, দয়া করে মন্তব্য করুন! এটি একটি লেখার এবং ভুলে যাওয়া কাজ ছিল তবে আমি এটির উন্নতি করতে পেরে খুশি হব।


আপনার তুলনায় তুলনায় stackoverflow.com/a/5148202/717355
ফিলিপ ওকলি

ফিলিপ ওকলি একটি তাত্ক্ষণিক দৃষ্টি থেকে দেখুন যে মূলটি আমার মতো একই কাজ করে। তবে খনিটি একক শাখায় শক্তভাবে কোডিং করা হয়নি, এটির পরিচালনা করার ক্ষেত্রে আরও অনেক ত্রুটি রয়েছে, এটি গিট-মার্জয়ের আউটপুট অনুকরণ করে, এবং আপনি যখন শাখায় আসলে আপনি এটি কল করেন তবে এটি আপনার অর্থ কি তা বোঝায়।
ক্যাসাবেল

আমার আমার \ বিন ডিরেক্টরিতে আপনার আছে ;-) আমি কেবল এটি সম্পর্কে ভুলে গিয়েছিলাম এবং চারপাশে খুঁজছিলাম, সেই স্ক্রিপ্টটি দেখেছিলাম এবং এটি আমার পুনরায় স্মরণ করার অনুরোধ জানায়! আমার অনুলিপিটিতে এই লিঙ্কটি রয়েছে এবং # or git branch -f localbranch remote/remotebranchউত্স এবং বিকল্পগুলি সম্পর্কে মনে করিয়ে দিতে। অন্য লিঙ্কটিতে আপনার মন্তব্যটি +1 করেছে।
ফিলিপ ওকলে

3
+1, "$branch@{u}"আপস্ট্রিম শাখাটি পাওয়ার জন্য সংশ্লেষ করতে প্রতিশ্রুতিবদ্ধ হিসাবে ডিফল্টও হতে পারে ( কর্নেল.org
pub

ধন্যবাদ! উত্তরের জন্য আপনি কোনও সাধারণ উদাহরণ-ব্যবহার করতে পারেন এমন কোনও সুযোগ?
এনএমআর

20

আপনি কেবল তখনই এটি করতে পারবেন যদি মার্জটি দ্রুত-অগ্রসর হয়। যদি তা না হয়, তবে গিটকে ফাইলগুলি চেক আউট করা দরকার যাতে এটি সেগুলিকে একীভূত করতে পারে!

কেবল দ্রুত-ফরওয়ার্ডের জন্য এটি করতে :

git fetch <branch that would be pulled for branchB>
git update-ref -m "merge <commit>: Fast forward" refs/heads/<branch> <commit>

<commit>আনা প্রতিশ্রুতিটি কোথায় , আপনি যার কাছে দ্রুত এগিয়ে যেতে চান one এটি মূলত git branch -fশাখাটি সরানোর জন্য ব্যবহার করার মতো , এটি ছাড়াও এটি এটি রিফ্লগে রেকর্ড করে যেন আপনি প্রকৃতভাবে মার্জ করেছিলেন।

দয়া করে, দয়া করে, দয়া করে এমন কোনও কাজের জন্য করবেন না যা দ্রুতগামী নয়, বা আপনি কেবল নিজের শাখাটিকে অন্য প্রতিশ্রুতিতে পুনরায় সেট করবেন। (পরীক্ষা করতে দেখুন, git merge-base <branch> <commit>শাখার SHA1 দেয় কিনা দেখুন ))


4
দ্রুত অগ্রসর না করতে পারলে এটিকে ব্যর্থ করার কী উপায় আছে?
gman

2
@gman আপনি ব্যবহার করতে পারেন git merge-base --is-ancestor <A> <B>। "খ" এমন একটি জিনিস যা "এ" তে একত্রীকরণ করা দরকার। উদাহরণটি হবে এ = মাস্টার এবং বি = বিকাশ, এটি নিশ্চিত করে যে বিকাশটি মাস্টারে দ্রুত এগিয়ে যেতে পারে। দ্রষ্টব্য: এটি 0 এফএফ-সক্ষম না থাকলে এটির সাথে বিদ্যমান, 1 থাকলে এটি বিদ্যমান with
এডিওমোয়ায়

1
গিট-স্কেমে নথিভুক্ত নয়, তবে এটি কার্নাল.আর.গ্রে রয়েছে। kernel.org/pub/software/scm/git/docs/git-
विसरा-

আমি যে বিষয়ে কথা বলছি তা গুটিয়ে নেওয়ার জন্য একটি দ্রুত গিস্ট তৈরি করেছেন (আসলে এটি পরীক্ষা করে দেখেনি, তবে আপনাকে বেশিরভাগ সেখানেই পাওয়া উচিত)। gist.github.com/eddiemoya/ad4285b2d8a6bdabf432 ---- পার্শ্ব নোট হিসাবে, আমার বেশিরভাগ সহজলভ্য ছিল, আমি একটি স্ক্রিপ্ট পেয়েছি যা ff পরীক্ষা করে এবং যদি আপনাকে প্রথমে পছন্দসই শাখাটি পুনরায় চালু করতে না দেয় - তবে এফএফ সংযুক্তি - কিছু পরীক্ষা না করে সব।
এডিমেমায়া

12

আপনার ক্ষেত্রে আপনি ব্যবহার করতে পারেন

git fetch origin branchB:branchB

যা আপনি যা চান তা করেন (একীভূতকারীটি দ্রুত এগিয়ে রয়েছে বলে ধরে নেওয়া)। যদি শাখাটি আপডেট করা যায় না কারণ এটির জন্য দ্রুত-ফরওয়ার্ড একীকরণের প্রয়োজন হয়, তবে এটি একটি বার্তা সহ নিরাপদে ব্যর্থ।

আনার এই ফর্মটিতে আরও কিছু দরকারী বিকল্প রয়েছে:

git fetch <remote> <sourceBranch>:<destinationBranch>

নোট করুন যে <remote> স্থানীয় সংগ্রহস্থল<sourceBranch> হতে পারে এবং একটি ট্র্যাকিং শাখা হতে পারে। সুতরাং আপনি কোনও স্থানীয় শাখাটি আপডেট করতে পারেন, এটি যদি অ্যাক্সেস না করেও চেক আউট হয় না ।

বর্তমানে, আমার আপস্ট্রিম সার্ভার অ্যাক্সেসটি একটি ধীর ভিপিএন এর মাধ্যমে, সুতরাং আমি git fetchসমস্ত রিমোটগুলি আপডেট করতে এবং তারপরে সংযোগ বিচ্ছিন্ন করে পর্যায়ক্রমে সংযোগ করি connect তারপরে, যদি বলুন, রিমোট মাস্টার বদলে গেছে, আমি করতে পারি

git fetch . remotes/origin/master:master

আমার স্থানীয় মাস্টারকে নিরাপদে আপ টু ডেট আনতে, যদিও বর্তমানে আমার আরও কিছু শাখা চেক আউট রয়েছে। কোনও নেটওয়ার্ক অ্যাক্সেস প্রয়োজন।


11

অন্যটি, স্বীকারোক্তিজনকভাবে বেশ জঘন্য উপায় হল কেবল শাখাটি পুনরায় তৈরি করা:

git fetch remote
git branch -f localbranch remote/remotebranch

এটি স্থানীয় পুরানো শাখাটি ফেলে দেয় এবং একই নামের সাথে একটি পুনরায় তৈরি করে, তাই যত্ন সহ ব্যবহার করুন ...


আমি এখনই দেখেছি যে আসল উত্তরটিতে ইতিমধ্যে শাখা -২-এর উল্লেখ রয়েছে ... তবুও, আমি বর্ণিত ব্যবহারের ক্ষেত্রে রিফ্লোগে একীভূত হওয়ার কোনও সুবিধা দেখতে পাচ্ছি না।
kkoehne

7

আপনি রেপো ক্লোন করতে পারেন এবং নতুন রেপোতে মার্জ করতে পারেন। একই ফাইল সিস্টেমে এটি বেশিরভাগ ডেটা অনুলিপি করার পরিবর্তে হার্ডলিঙ্ক করবে। ফলাফলটি মূল রেপোতে টান দিয়ে শেষ করুন।


4

গিট-ফরোয়ার্ড-মার্জটি প্রবেশ করান :

গন্তব্য চেকআউট করার প্রয়োজন ছাড়াই git-forward-merge <source> <destination>গন্তব্য শাখায় উত্সকে একত্রিত করে।

https://github.com/schuyler1d/git-forward-merge

কেবলমাত্র স্বয়ংক্রিয় মার্জগুলির জন্যই কাজ করে, যদি আপনার নিয়মিত মার্জটি ব্যবহার করার প্রয়োজন হয় তবে কোনও দ্বন্দ্ব রয়েছে।


2
আমি মনে করি এটি গিট আনার চেয়ে ভাল <emote> <সোর্স>: <বিস্তৃতি>, কারণ দ্রুত ফরোয়ার্ড হ'ল সংশ্লেষের ক্রিয়া নয় এবং এটি লেখা সহজ write খারাপ জিনিস যদিও এটি ডিফল্ট গিট নয়।
বাইনারি

4

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

[core]
    logallrefupdates=true

তারপরে টাইপ করুন

git reflog show mybranch

আপনার শাখার সাম্প্রতিক ইতিহাস দেখতে to


আমি মনে করি বিভাগটি অবশ্যই হবে [core]না [user]? (এবং এটি ডিফল্টরূপে ওয়ার্কস্পেসের (যেমন নন-বেয়ার)
রিপোর জন্য রয়েছে

3

আমি প্রতিদিন প্রকল্পগুলিতে আমার মুখোমুখি অনুরূপ ব্যবহারের জন্য শেল ফাংশন লিখেছিলাম। এটি মূলত একটি সাধারণ শাখা যেমন পিআর খোলার আগে বিকাশ ইত্যাদির সাথে স্থানীয় শাখাগুলি আপডেট রাখার জন্য একটি শর্টকাট etc.

আপনি ব্যবহার করতে না চাইলেও এটি পোস্ট করা checkout, অন্যরা যাতে এই সীমাবদ্ধতার বিষয়টি মনে করেন না।

glmh( "Git টান এবং একত্রীকরণ এখানে") স্বয়ংক্রিয়ভাবে হবে checkout branchB, pullসর্বশেষ, পুনরায় checkout branchA, এবং merge branchB

শাখাএর একটি স্থানীয় অনুলিপি রাখার প্রয়োজনীয়তাকে সম্বোধন করে না, তবে শাখা বি পরীক্ষা করার আগে একটি পদক্ষেপ যুক্ত করে সহজেই এটি পরিবর্তন করা যেতে পারে। কিছুটা এইরকম...

git branch ${branchA}-no-branchB ${branchA}

সাধারণ দ্রুত-ফরোয়ার্ড মার্জগুলির জন্য, কমিট বার্তা প্রম্পটে এই এড়িয়ে যায়।

দ্রুত-ফরোয়ার্ড একীভূত হওয়ার জন্য, এটি আপনার শাখাকে দ্বন্দ্বের সমাধানের রাজ্যে রাখে (আপনার সম্ভবত হস্তক্ষেপ করা দরকার)।

সেটআপ করতে, যোগ করুন .bashrcবা .zshrcইত্যাদি:

glmh() {
    branchB=$1
    [ $# -eq 0 ] && { branchB="develop" }
    branchA="$(git branch | grep '*' | sed 's/* //g')"
    git checkout ${branchB} && git pull
    git checkout ${branchA} && git merge ${branchB} 
}

ব্যবহার:

# No argument given, will assume "develop"
> glmh

# Pass an argument to pull and merge a specific branch
> glmh your-other-branch

দ্রষ্টব্য: শাখার নাম ছাড়িয়ে আরগগুলি হ্যান্ড-অফ করার পক্ষে এটি যথেষ্ট শক্তিশালী নয়git merge


2

কার্যকরভাবে এটি করার আরেকটি উপায় হ'ল:

git fetch
git branch -d branchB
git branch -t branchB origin/branchB

কারণ এটি একটি নিম্ন কেস -d, এটি কেবল তখনই মুছে ফেলা হবে যদি ডেটা এখনও কোথাও উপস্থিত থাকে। এটি @ Kkoehne এর উত্তরের মতো যা এটি জোর করে না। কারণ -tএটি আবার রিমোট সেট আপ করবে।

আমার ওপি-র তুলনায় কিছুটা আলাদা প্রয়োজন ছিল, যা ছিল টান অনুরোধটি মার্জ করার পরে develop(বা master) নতুন বৈশিষ্ট্য শাখা তৈরি করা । এটি জোর করে ওয়ান-লাইনারে সম্পন্ন করা যায়, তবে এটি স্থানীয় developশাখা আপডেট করে না । এটি কেবল একটি নতুন শাখা পরীক্ষা করে দেখার এবং এটি ভিত্তিক স্থাপনের বিষয় origin/develop:

git checkout -b new-feature origin/develop

1

আমি যে মাস্টার ব্যবহার করি তা পরীক্ষা না করেই মাস্টারকে টানতে

git fetch origin master:master


1

যেকোন সংহত করা, এমনকি অ-দ্রুত ফরোয়ার্ড মার্জগুলি করা একেবারেই সম্ভব git checkoutworktree@ গ্রেগো দ্বারা উত্তর একটি ভাল ইঙ্গিত। এটি প্রসারিত করতে:

cd local_repo
git worktree add _master_wt master
cd _master_wt
git pull origin master:master
git merge --no-ff -m "merging workbranch" my_work_branch
cd ..
git worktree remove _master_wt

আপনি এখন masterআপনার চেকআউটটি স্যুইচ না করে স্থানীয় কর্ম শাখাকে স্থানীয় শাখায় মার্জ করে দিয়েছেন ।


1

আপনি যে শাখাকে মার্জ করতে চান তার মধ্যে একই গাছটি রাখতে চাইলে (অর্থাত্ প্রকৃত "মার্জ" নয়), আপনি এটি এটি করতে পারেন।

# Check if you can fast-forward
if git merge-base --is-ancestor a b; then
    git update-ref refs/heads/a refs/heads/b
    exit
fi

# Else, create a "merge" commit
commit="$(git commit-tree -p a -p b -m "merge b into a" "$(git show -s --pretty=format:%T b)")"
# And update the branch to point to that commit
git update-ref refs/heads/a "$commit"

1
git worktree add [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>]

আপনি git worktreeপাশাপাশি দুটি শাখা খোলার চেষ্টা করতে পারেন, এটি আপনি যা চান তা হতে পারে তবে আমি এখানে দেখেছি এমন উত্তরগুলির থেকে কিছুটা আলাদা।

এইভাবে একই গিট রেপোতে আপনার দুটি পৃথক শাখা ট্র্যাকিং করতে পারে যাতে উভয় কাজের গাছগুলিতে আপডেট পেতে আপনাকে একবারে আনতে হবে (বরং দু'বার ক্লোন করতে হবে এবং প্রতিটিটিতে গিট টানবেন)

ওয়ার্ক্ট্রি আপনার কোডের জন্য একটি নতুন ওয়ার্কিং ডিরেক্টরি তৈরি করবে যেখানে আপনি শাখাগুলি স্থানে অদলবদলের পরিবর্তে একসাথে একটি আলাদা শাখা পরীক্ষা করে দেখতে পারেন।

আপনি এটি সরাতে চাইলে আপনি পরিষ্কার করতে পারেন

git worktree remove [-f] <worktree>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.