একটি প্রতিশ্রুতি অন্য অঙ্গীকারের বংশধর কিনা তা আমি কীভাবে বলতে পারি?


146

গিটের সাথে, আমি কীভাবে বলতে পারি যে আমার শাখায় যদি কোনও প্রতিশ্রুতিবদ্ধ অন্য কোনও প্রতিশ্রুতির বংশধর হয়?


2
একই প্রশ্নের বিপরীতে জিজ্ঞাসা করা হয়েছিল: stackoverflow.com/questions/18345157/…
ক্রিস ক্লিল্যান্ড

11
আপনি কি আপনার গৃহীত উত্তর পরিবর্তন করতে পারেন? সংখ্যাগরিষ্ঠ --is-ancestorসমাধান সমাধান পছন্দ করে ।
রবার্ট সিমার

উত্তর:


51

আপনি যদি এই প্রোগ্রামটিমেটিকভাবে পরীক্ষা করতে চান (যেমন স্ক্রিপ্টে), আপনি git merge-base A Bএটি সমান কিনা তা পরীক্ষা করতে পারেন git rev-parse --verify A(তবে A বি থেকে পৌঁছনীয়), বা যদি এটি হয় git rev-parse --verify B(তবে বি এ থেকে পৌঁছনীয়)। git rev-parseএখানে প্রতিশ্রুতিবদ্ধ নাম থেকে SHA-1 / কমিট আইডিতে রূপান্তর করা প্রয়োজন।

ভনসির উত্তরেরgit rev-list মতো ব্যবহার করাও সম্ভাবনা।

সম্পাদনা করুন: আধুনিক গিটের আকারে এই কোয়েরির জন্য সুস্পষ্ট সমর্থন রয়েছে git merge-base --is-ancestor


আপনি যে কমান্ডগুলির বিষয়ে জিজ্ঞাসা করছেন সেগুলির মধ্যে যদি কোনও শাখার টিপ হয় , তবে git branch --contains <commit>বা git branch --merged <commit>আরও প্রোগ্রামহীন সমাধান হতে পারে।


1
সম্ভবত দ্রুততম উপায়টি হবে git checkout -b quickcheck <more-recent-commit-ID>এবং তারপরে git branch --contains <older-commit-ID>(এবং তারপরে git branch -D quickcheckঅস্থায়ী শাখা থেকে মুক্তি পাওয়ার জন্য)।
ক্লি

2
দুটি সম্ভাব্য পন্থা, উভয়ই @ ম্যাটআর জবাবের চেয়ে অনেক খারাপ।
jwg

6
@jwg: ম্যাটআর উত্তরটি আরও ভাল তবে এই উত্তরটি (এবং সম্ভবত এটি গৃহীত হবে) গিটটি 1.8.0 এবং git merge-base --is-ancestor2 বছর দ্বারা পূর্বাভাস দেয় ।
জাকুব নারেবস্কি

@ জাকুবনারাইবস্কি মেলা যথেষ্ট, দুঃখিত।
jwg

2
বড় সংগ্রহস্থলে (2 মিলিয়ন কমিট), আমি গতি git branch --contains <commit>এবং git merge-base --is-ancestor ...3m40s বনাম 0.14 এস তুলনা করেছি
হেজেলো

259

গিট ১.৮.০ থেকে এটি বিকল্প হিসাবে সমর্থিত merge-base:

git merge-base --is-ancestor <maybe-ancestor-commit> <descendant-commit>

ম্যান পৃষ্ঠা থেকে:

--is-পূর্বপুরুষ

প্রথমটি দ্বিতীয়টির পূর্বপুরুষ কিনা তা পরীক্ষা করে দেখুন এবং মানটি যদি 0 হয় তবে স্ট্যাটাস 1 বা প্রস্থান না করে প্রস্থান করুন। ত্রুটিগুলি একটি শূন্য নয় এমন স্থিতি দ্বারা সংকেতিত হয় যা 1 নয়।

উদাহরণ স্বরূপ:

git merge-base --is-ancestor origin/master master; echo $?

4
নিস! এখানে একটি শেল স্ক্রিপ্ট রয়েছে যা এই উত্তরটি মানব-সক্ষমযোগ্য আউটপুট সহ কিছুতে গুটিয়ে রাখে
সাইমন হুইটেকার

1
অন্য কথায়: git merge-base THING --is-ancestor OF_THING && echo yes || echo noযেমন:git merge-base my-feature-branch --is-ancestor master && echo yes || echo no
ব্যবহারকারী 1735594

2
@ স্মারবার git merge-base --is-ancestor -- commit commitআমার পাশের হ্যাশগুলির জন্য git২.১.৪ (ডেবিয়ান / ডিভুয়ান 7..১০ জেসি) এবং ১.৯.১ (উবুন্টু ১৪.০৪ বিশ্বস্ত) নিয়ে কাজ করে যা এখন প্রাচীন are এটি ডেবিয়ান হুইজি এমনকি আপনার জন্য কাজ করে sudo apt-get install git/wheezy-backports
টিনো

15

এই ধরণের ক্রিয়াকলাপ এসও প্রশ্নে বিশদ সংশোধিত পরিসীমা ধারণার উপর নির্ভর করে : " 'গিট লগ উত্স / মাস্টার' বনাম 'গিট লগ উত্স / মাস্টার ..' "।

git rev-list যদি পৌঁছনীয় হয় তবে অন্য একটি প্রতিশ্রুতি থেকে ফিরে হাঁটাতে সক্ষম হওয়া উচিত।

সুতরাং আমি চেষ্টা করব:

git rev-list --boundary 85e54e2408..0815fcf18a
0815fcf18a19441c1c26fc3495c4047cf59a06b9
8a1658147a460a0230fb1990f0bc61130ab624b2
-85e54e240836e6efb46978e4a1780f0b45516b20

(সীমানা সংক্রান্ত কমিটিগুলির সাথে উপসর্গ রয়েছে -)

যদি প্রদর্শিত শেষ প্রতিশ্রুতি git rev-listকমান্ডের প্রথম কমিটের সমান হয় , তবে এটি দ্বিতীয় প্রতিশ্রুতি থেকে পৌঁছনীয় একটি প্রতিশ্রুতি।

যদি প্রথম প্রতিশ্রুতি দ্বিতীয়টি থেকে পৌঁছনীয় না হয় তবে git rev-listকিছুই ফিরিয়ে দেওয়া উচিত নয়।

git rev-list --boundary A..B

Aযদি Aপৌঁছতে পারে তবে এর মাধ্যমে শেষ হবে B
এটি একই হিসাবে:

git rev-list --boundary B --not A

, Bএকটি ইতিবাচক উল্লেখ এবং Aএকটি নেতিবাচক রেফারেন্স সহ
এটা শুরু হয় এ হবে Bএবং গ্রাফ মাধ্যমে ফিরে পদচারনা পর্যন্ত এটি একটি পুনর্বিবেচনা থেকে যোগাযোগ করা যাবে encounters A
আমি যুক্তি দিয়ে বলব যে যদি Aসরাসরি পৌঁছতে Bপারে তবে এটির মুখোমুখি হবে (এবং প্রদর্শিত কারণ, --boundaryবিকল্পটির কারণে ) A


এটি একটি প্রচলিত যথেষ্ট পরিমাণে ব্যবহারের ক্ষেত্রে শোনাচ্ছে যা আমি অবাক হয়েছি যে গিটটি এখনও "পোরসিলাইন" কমান্ড প্রকাশ করে নি যা ঠিক এটি করে।
লরেন্স আই সিডেন

1
@ এলসিডেন: সত্য। পার্শ্ব-নোট: ভুলে যাবেন না যে প্রোগ্রামিয়ালি কিছু পরীক্ষা করতে , আপনার চীনামাটির বাসন কমান্ড, ( স্ট্যাকওভারফ্লো / সিকিউশনস / 769764737373/২ হিসাবে ) ব্যবহার করার কথা নয় , তবে নদীর গভীরতানির্ণয় কমান্ড ( স্ট্যাকওভারফ্লো / ক্রোয়েশনে চিত্রিত হিসাবে) / 3878624 /… )
ভনসি

ওহ, লোক, দেখে মনে হচ্ছে আমাকে ফিরে যেতে হবে এবং আমার শেল স্ক্রিপ্টিং চপগুলিতে কাজ করতে হবে!
লরেন্স আই। সিডেন

1
প্রশ্ন: -85e54e2...স্নিপেটে একটি বিয়োগ কেন হয় ? একটি সম্ভাব্য টাইপও: "... প্রথম প্রতিশ্রুতি তুলনায় একই ..."
sdaau

1
@ sdaau এর -অর্থ এটি একটি সীমানা অঙ্গীকার। আমি আরও পরিষ্কার করে দেওয়ার জন্য উত্তরটি সম্পাদনা করেছি, পাশাপাশি ডক লিঙ্কগুলি রিফ্রেশ করতে এবং এই 5 বছরের পুরানো উত্তরের জন্য টাইপও ঠিক করেছি।
ভোনসি

11

অন্য উপায় ব্যবহার git logএবং হবে grep

git log --pretty=format:%H abc123 | grep def456

প্রতিশ্রুতি Def456 কমিট abc123 এর পূর্বপুরুষ, বা অন্যথায় আউটপুট না থাকলে এটি আউটপুটের এক লাইন উত্পাদন করে।

আপনি সাধারণত --prettyযুক্তি বাদ দিয়ে দূরে সরে যেতে পারেন , তবে আপনি যদি নিশ্চিত হয়ে থাকেন যে আপনি কেবল আসল প্রতিশ্রুতিবদ্ধ হ্যাশগুলির মাধ্যমে অনুসন্ধান করেছেন তবে লগ মন্তব্য এবং এর মাধ্যমে নয়।


আমি আশা করেছি এই সমাধানটি ধীর হয়ে যাবে, তবে এটি আসলে প্রায় দ্রুত, এমনকি 20 কে +
কমিটের

2
--prettyআমি পরিবর্তেgit log --oneline ce2ee3d | grep ec219cc
জিনগুলি

3

https://stackoverflow.com/a/13526591/895245 এটিকে আরও মানব বান্ধব করে তুলতে এখন উল্লেখ করেছে:

git-is-ancestor() (
  if git merge-base --is-ancestor "$1" "$2"; then
      echo 'ancestor'
  elif git merge-base --is-ancestor "$2" "$1"; then
      echo 'descendant'
  else
      echo 'unrelated'
  fi
)
alias giia='git-is-ancestor'

যদি উভয় পরামিতি একই প্রতিশ্রুতিতে নির্দেশ করে তবে এটি 'সম্পর্কযুক্ত' ফিরে আসবে
মিক

1

গিট শো-শাখা শাখা- sha1 কমিট- sha1

কোথায়:

  • শাখা-শ 1: আপনার শাখায় যে শা 1 টি আপনি যাচাই করতে চান
  • কমিট- sha1: আপনি যে প্রতিশ্রুতিটির বিরুদ্ধে পরীক্ষা করতে চান তার sha1

0

আপনি যদি ব্যবহার করছেন git merge-base --is-ancestor ব্যবহার করছেন তবে গিট ২.২৮ (Q3 2020) ব্যবহার নিশ্চিত করুন

গিট 2.28 (কিউ 32020) এর সাথে, " struct commit" এর কয়েকটি ক্ষেত্র যা সর্বদা উপস্থিত থাকতে হবে না স্ল্যাব দেওয়ার জন্য সরানো হয়েছে।

দেখুন প্রতিশ্রুতি c752ad0 , প্রতিশ্রুতি c49c82a , প্রতিশ্রুতি 4844812 , প্রতিশ্রুতি 6da43d9 (17 জুন 2020) অভিষেক কুমারabhishekkumar2718 দ্বারা ( )
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে কমিট d80bea4 , 06 জুলাই 2020)

commit-graph: পরিচয় করিয়ে দিন commit_graph_data_slab

স্বাক্ষরিত: অভিষেক কুমার

কাঠামোবদ্ধ প্রতিশ্রুতি অনেক প্রসঙ্গে ব্যবহৃত হয়। তবে, সদস্য generationএবংgraph_pos কেবল প্রতিশ্রুতি গ্রাফ সম্পর্কিত ক্রিয়াকলাপ এবং অন্যথায় মেমরির অপচয় করতে ব্যবহৃত হয়।

এই বর্জ্যটি আরও স্পষ্ট হয়ে উঠত কারণ আমরা প্রজন্মের নম্বর ভি 2 তে স্থানান্তরিত করেছি, যা বর্তমান 32-বিটের পরিবর্তে 64-বিট জেনারেশন নম্বর ব্যবহার করে।

যেহেতু এগুলি প্রায়শই একসাথে অ্যাক্সেস করা হয়, আসুন আমরা স্ট্রাক্টটি প্রবর্তন করি commit_graph_dataএবং এগুলিকে একটি commit_graph_dataস্ল্যাবে স্থানান্তর করি ।

সামগ্রিক পরীক্ষার স্যুট যেমন চলবে তত দ্রুত masterচলেছে (সিরিজ: 26 মি 48 master,: 27 এম 34 এস, দ্রুত 2.87%), সেশেদর গ্যাবার আবিষ্কার করে কিছু নির্দিষ্ট কমান্ড git merge-base --is-ancestor40% ধীর করে দিয়েছিল
কমিট-স্ল্যাব অ্যাক্সেস হ্রাস করার পরে, ধীর গতি অব্যাহত থাকে তবে 20% এর কাছাকাছি থাকে।

ডেরিক স্টোলি বিশ্বাস করেন যে স্লো ডাউন ডাউনটি অন্তর্নিহিত অ্যালগরিদমকে দায়বদ্ধ করে তুলবে কমিট স্ল্যাব অ্যাক্সেসের স্লোনেসের চেয়ে এবং আমরা পরবর্তী সিরিজে ফলো-আপ করব।


-1

আপনার যদি সংগ্রহস্থলের সমস্ত ট্যাগের জন্য এটি করতে হয় তবে এটির উত্তরের উপর ভিত্তি করে তৈরি করুন:

for i in `git tag` ; do echo -ne $i "\t" ; git log --pretty=format:%H $i | (grep <commit to find> || echo ""); done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.