git - tutorial - একটি ভিন্ন পিতা বা মাতা পিতা বা মাতা পয়েন্টার সেট করা




gitlab (3)

যদি এটি সক্রিয় হয় যে পরবর্তী ক্রমটি পুনঃবিবেচনা করা থেকে বিরত থাকা দরকার (উদাহরণস্বরূপ একটি ইতিহাস পুনর্বিবেচনা অযোগ্য হতে পারে), তবে আপনি গিট প্রতিস্থাপন (গিট 1.6.5 এবং পরবর্তীতে উপলব্ধ) ব্যবহার করতে পারেন।

# …---o---A---o---o---…
#
# …---o---B---b---b---…
#
# We want to transplant B to be "on top of" A.
# The tree of descendants from B (and A) can be arbitrarily complex.

replace_first_parent() {
    old_parent=$(git rev-parse --verify "${1}^1") || return 1
    new_parent=$(git rev-parse --verify "${2}^0") || return 2
    new_commit=$(
      git cat-file commit "$1" |
      sed -e '1,/^$/s/^parent '"$old_parent"'$/parent '"$new_parent"'/' |
      git hash-object -t commit -w --stdin
    ) || return 3
    git replace "$1" "$new_commit"
}
replace_first_parent B A

# …---o---A---o---o---…
#          \
#           C---b---b---…
#
# C is the replacement for B.

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

প্রতিস্থাপন ডিফল্টরূপে সক্রিয় থাকে, তবে git (কমান্ডের নাম আগে) বা GIT_NO_REPLACE_OBJECTS পরিবেশ পরিবর্তনশীল সেট করে --no-replace-objects GIT_NO_REPLACE_OBJECTS বিকল্পটি ব্যবহার করে চালু করা যেতে পারে। প্রতিস্থাপন refs/replace/* (স্বাভাবিক refs/heads/* ছাড়াও refs/replace/* ধাক্কা দ্বারা ভাগ করা যেতে পারে।

আপনি যদি কমিটি-মুংংং (উপরের তদারকির সাথে সম্পন্ন) পছন্দ করেন না তবে উচ্চতর স্তরের কমান্ডগুলি ব্যবহার করে আপনি আপনার প্রতিস্থাপন করতে পারেন:

git checkout B~0
git reset --soft A
git commit -C B
git replace B HEAD
git checkout -

বড় পার্থক্য হল যে এই ক্রম অতিরিক্ত মাতাপিতা প্রচার করে না যদি বি একটি মার্জ কমিট হয়।

যদি আমার অতীতে এমন একটি কমিটি থাকে যা একটি পিতা-মাতার কাছে নির্দেশ করে, তবে আমি যে অভিভাবককে নির্দেশ করে সেটি পরিবর্তন করতে চাই, আমি কীভাবে এটি করব?


git rebase ব্যবহার করে। এটা জেনেটিক "গিট কমান্ড (গুলি) গ্রহণ এবং এটি একটি ভিন্ন পিতা বা মাতা (বেস) কমান্ড" এ কমান্ড।

কিছু জিনিস জানা, তবে:

  1. যেহেতু এসএএইচগুলি তাদের পিতামাতার সাথে জড়িত থাকে, যখন আপনি কোন নির্দিষ্ট কমিটির পিতা-মাতার পরিবর্তন করেন, তখন তার এসএএইচ পরিবর্তিত হবে - যেহেতু উন্নয়নের লাইনের পরে এটির পরে যা ঘটেছে তার সবগুলি SHA (এটির চেয়ে সাম্প্রতিক) পরিবর্তন হবে।

  2. আপনি যদি অন্য লোকেদের সাথে কাজ করেন এবং আপনি ইতিমধ্যেই যেখানে জনসাধারণের কাছে এটি টেনে নিয়েছেন সেখানে কমিটিটিকে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধরিয়ে দেওয়া হয়েছে। এটি # 1 এর কারণে, এবং এইভাবে বিভ্রান্তির ফলে অন্যান্য ব্যবহারকারীর সংগ্রহস্থলগুলি আপনার এসএইচএগুলির কারণে যা ঘটছে তা "একই" অভ্যাসগুলির জন্য মিলছে না সেগুলি সনাক্ত করার চেষ্টা করবে। (বিস্তারিত জানার জন্য সংযুক্ত ম্যান পৃষ্ঠাটির "পুনরুদ্ধারের পুনরুদ্ধার থেকে পুনরুদ্ধারের" বিভাগটি দেখুন।)

যেহেতু আপনি যদি বর্তমানে কোনও শাখায় আছেন তবে আপনি কোন নতুন অভিভাবকের কাছে যেতে চান, এটি এমন কিছু দেখতে চাইছেন:

git rebase --onto <new-parent> <old-parent>

যেহেতু বর্তমান শাখায় <old-parent> এর পরে <new-parent> উপরে বসার পরে সবকিছু সরাতে হবে।


উল্লেখ্য যে গিটে একটি কমিটি পরিবর্তন করার প্রয়োজন হলে এটি অনুসরণ করে এমন সমস্ত কাজ পাল্টে দিতে হবে। আপনি যদি ইতিহাসের এই অংশটি প্রকাশ করেছেন তবে এটি হতাশ হয়ে পড়ে এবং কেউ কেউ ইতিহাসে তাদের কাজটি গড়ে তুলতে পারে যে এটি পরিবর্তন হওয়ার আগেই ছিল।

অ্যাম্বারের প্রতিক্রিয়াতে উল্লিখিত git rebase বিকল্প সমাধান হল .git/info/grafts অভিভাবক পরিবর্তন করার জন্য .git/info/grafts মেকানিজম ( গিট শব্দকোষের গিট .git/info/grafts এবং গিট রেপোসিটার লেআউট ডকুমেন্টেশনের .git/info/grafts ফাইলের ডকুমেন্টেশন) দেখুন, এটি পরীক্ষা করে দেখুন কিছু ইতিহাস দর্শকের সাথে সঠিক জিনিস ( gitk , git log --graph , ইত্যাদি) এবং তারপরে স্থায়ী করতে (এবং তারপরে বিভ্রান্তি সরান এবং বিকল্পভাবে সরানোর জন্য git filter-branch (এর git log --graph "উদাহরণ" বিভাগে বর্ণিত) ব্যবহার করুন git filter-branch দ্বারা ব্যাক আপ করা মূল রেফারেন্স, বা রিপোজিটরি পুনরুদ্ধার):

echo "$commit-id $graft-id" >> .git/info/grafts
git filter-branch $graft-id..HEAD

বিঃদ্রঃ !!! এই সমাধানটি রিবেস সমাধান থেকে ভিন্ন , যে git rebase রিবেস / ট্রান্সপ্লান্ট পরিবর্তনগুলি করবে , যখন গ্রাফ্টস-ভিত্তিক সমাধানটি পুরোনো পিতা-মাতা এবং নতুন পিতা-মাতার মধ্যে অ্যাকাউন্ট পার্থক্যগুলি গ্রহণ না করে কেবলমাত্র পূর্বের মতই প্রতিনিধিত্ব করবে!







git