ধরে নিই যে দূরবর্তী সংগ্রহস্থলের বিকাশকারী শাখার একটি অনুলিপি রয়েছে (আপনার প্রাথমিক বিবরণটি স্থানীয় সংগ্রহস্থলে এটি বর্ণনা করে তবে এটি রিমোটে উপস্থিত রয়েছে বলে মনে হয়), আপনি যা চান তা আপনি অর্জন করতে সক্ষম হবেন, তবে পদ্ধতিটি আপনি যা কল্পনা করেছেন তার থেকে কিছুটা আলাদা।
গিটের ইতিহাস কমিটের একটি ডাগের উপর ভিত্তি করে। শাখা (এবং সাধারণভাবে "রেফ") কেবলমাত্র ক্ষণস্থায়ী লেবেল যা ক্রমাগত ক্রমবর্ধমান কমিট ডিএজি-তে নির্দিষ্ট কমিটগুলির প্রতি নির্দেশ করে। সেই হিসাবে, শাখাগুলির মধ্যে সম্পর্ক সময়ের সাথে সাথে পরিবর্তিত হতে পারে তবে কমিটগুলির মধ্যে সম্পর্কটি হয় না।
---o---1 foo
\
2---3---o bar
\
4
\
5---6 baz
দেখে মনে baz
হচ্ছে এটি (পুরানো সংস্করণ) ভিত্তিক bar
? তবে আমরা যদি মুছতে bar
পারি?
---o---1 foo
\
2---3
\
4
\
5---6 baz
এখন দেখে মনে হচ্ছে baz
এটি ভিত্তিক foo
। তবে পূর্বপুরুষের baz
কোনও পরিবর্তন হয়নি, আমরা কেবল একটি লেবেল সরিয়েছি (এবং ফলস্বরূপ ঝুঁকির প্রতিশ্রুতি)। এবং যদি আমরা একটি নতুন লেবেল যুক্ত করি 4
?
---o---1 foo
\
2---3
\
4 quux
\
5---6 baz
এখন দেখে মনে হচ্ছে baz
এটি ভিত্তিক quux
। তবুও পূর্বপুরুষের কোনও পরিবর্তন হয়নি, কেবলমাত্র লেবেলগুলির পরিবর্তন হয়েছে।
তবে, আমরা যদি জিজ্ঞাসা করতাম যে "প্রতিশ্রুতির 6
বংশধর প্রতিশ্রুতিবদ্ধ 3
?" (ধরে নিলাম 3
এবং 6
সম্পূর্ণ SHA-1 প্রতিশ্রুতিবদ্ধ নামগুলি রয়েছে), তারপরে উত্তরটি "হ্যাঁ" হবে, এটি bar
এবং quux
লেবেল উপস্থিত রয়েছে কি না।
সুতরাং, আপনি প্রশ্নগুলি জিজ্ঞাসা করতে পারেন যেমন "ধাক্কা দেওয়া কি বিকাশকারী শাখার বর্তমান নূরের বংশধরকে প্রতিশ্রুতিবদ্ধ?", তবে আপনি নির্ভরযোগ্যভাবে জিজ্ঞাসা করতে পারবেন না "ধাক্কা দেওয়ার প্রতিশ্রুতির মূল শাখাটি কি?"
বেশিরভাগ নির্ভরযোগ্য একটি প্রশ্ন যা আপনি যা চান তার কাছে চলে আসে বলে মনে হচ্ছে:
সমস্ত ধাক্কা কমিটের পূর্বপুরুষদের জন্য ( বিকাশের বর্তমান টিপ এবং এর পূর্বপুরুষদের বাদে ), যার পিতামাতার হিসাবে বিকাশের বর্তমান টিপ রয়েছে :
- কমপক্ষে এরকম একটি প্রতিশ্রুতি আছে কি?
- এই জাতীয় সবকটি কি একক-পিতামাতার কমিট করে?
যা প্রয়োগ করা যেতে পারে:
pushedrev=...
basename=develop
if ! baserev="$(git rev-parse --verify refs/heads/"$basename" 2>/dev/null)"; then
echo "'$basename' is missing, call for help!"
exit 1
fi
parents_of_children_of_base="$(
git rev-list --pretty=tformat:%P "$pushedrev" --not "$baserev" |
grep -F "$baserev"
)"
case ",$parents_of_children_of_base" in
,) echo "must descend from tip of '$basename'"
exit 1 ;;
,*\ *) echo "must not merge tip of '$basename' (rebase instead)"
exit 1 ;;
,*) exit 0 ;;
esac
এটি আপনি সীমাবদ্ধ রাখতে চান এমন কিছুকে কভার করবে, তবে সব কিছুই হতে পারে না।
রেফারেন্সের জন্য, এখানে একটি বর্ধিত উদাহরণ ইতিহাস:
A master
\
\ o-----J
\ / \
\ | o---K---L
\ |/
C--------------D develop
\ |\
F---G---H | F'--G'--H'
| |\
| | o---o---o---N
\ \ \ \
\ \ o---o---P
\ \
R---S
উপরের কোড প্রত্যাখ্যান করার ব্যবহার করা যেতে পারে H
এবং S
যখন গ্রহণ H'
, J
, K
, অথবা N
, কিন্তু এটি মেনে নেবেন L
এবং P
(তারা মার্জ জড়িত, কিন্তু তারা ডগা একত্রীকরণ না বিকাশ )।
এছাড়াও প্রত্যাখ্যান করতে L
এবং P
, আপনি প্রশ্নটি পরিবর্তন করে জিজ্ঞাসা করতে পারেন
সমস্ত ধাক্কা কমিটের পূর্বপুরুষদের জন্য ( বিকাশের বর্তমান টিপ এবং এর পূর্বপুরুষদের বাদে ):
- দু'জন বাবা-মায়ের সাথে কি কোনও কমিট আছে?
- যদি তা না হয় তবে কমপক্ষে একটি কমিটের কি তার (একমাত্র) পিতামাতাকে বিকাশের বর্তমান টিপ আছে ?
pushedrev=...
basename=develop
if ! baserev="$(git rev-parse --verify refs/heads/"$basename" 2>/dev/null)"; then
echo "'$basename' is missing, call for help!"
exit 1
fi
parents_of_commits_beyond_base="$(
git rev-list --pretty=tformat:%P "$pushedrev" --not "$baserev" |
grep -v '^commit '
)"
case "$parents_of_commits_beyond_base" in
*\ *) echo "must not push merge commits (rebase instead)"
exit 1 ;;
*"$baserev"*) exit 0 ;;
*) echo "must descend from tip of '$basename'"
exit 1 ;;
esac