(এটি একটি সদৃশ প্রশ্নের উত্তর হিসাবে শুরু হয়েছিল it এটি পরিষ্কার করার জন্য আমি হালকা হালকা সম্পাদনা করেছি))
গিটের সমস্ত অভ্যন্তরীণ তীরগুলি একমুখী, পিছনের দিকে ইশারা করে। সামনের দিকে এগিয়ে যাওয়ার জন্য কোনও সংক্ষিপ্ত সুবিধাজনক বাক্য গঠন নেই: এটি কেবল সম্ভব নয়।
এটা তোলে হয় যদি আপনি এটি আগে পরে দেখা যায় না, এবং তারপর সুস্পষ্ট "তীর বিরুদ্ধে পদক্ষেপ", কিন্তু যেভাবে এটা বিস্ময়কর করতে সম্ভব। যাক আমাদের আছে:
A <-B <-C <-D <-E <-- last
^
|
\--------- middle
ব্যবহার middle~2করে তীর দুটি Cপিছনে পিছনে অনুসরণ করে A। সুতরাং আমরা কিভাবে থেকে সরানো Cনা D? উত্তর: আমরা এ শুরু E, নাম ব্যবহার করে last, এবং কাজের পিছন যতক্ষণ না আমরা পেতে middle, পয়েন্ট আমরা পথ ধরে ভিজিট রেকর্ডিং । তারপরে আমরা কেবল যতদূর যেতে চাই তার দিকে lastযেতে: এক ধাপে Dবা দু'এক দিকে যেতে E।
আমাদের শাখা থাকলে এটি বিশেষত গুরুত্বপূর্ণ:
D--E <-- feature1
/
...--B--C <-- master
\
F--G <-- feature2
কোন প্রতিশ্রুতি এক ধাপ পরে C? আপনি প্রশ্নটিতে যোগ না করা পর্যন্ত সঠিক কোনও উত্তর নেই: বৈশিষ্ট্যটির দিকে___ ( পূরণ করুন)।
নিজেই Cবাদ দিয়ে (বাদ দিয়ে C) কমিটগুলি গণনা করতে এবং বলে G, আমরা ব্যবহার করি:
git rev-list --topo-order --ancestry-path master..feature2
--topo-orderতোলে নিশ্চিত যে এমনকি জটিল শাখাবিন্যাস-এবং-মার্জ উপস্থিতিতে করে আউট topologically-সাজানো ক্রম আসা। চেইনটি রৈখিক না হলে এটি কেবল প্রয়োজন। --ancestry-pathবাধ্যতা মানে যখন আমরা থেকে পিছনের দিকে কাজ যে feature2, have যে আমরা কেবল তালিকা করে কমিট Cতাদের নিজস্ব পূর্বপুরুষদের এক হিসাবে। এটি হ'ল, যদি গ্রাফ — বা যাইহোক এটির প্রাসঙ্গিক অংশ — আসলে দেখতে এটির মতো লাগে:
A--B--C <-- master
\ \
\ F--G--J <-- feature2
\ /
H-------I <-- feature3
ফর্মটির একটি সাধারণ অনুরোধটি feature2..masterকমিট করে J, Gএবং Iএবং Fএবং Hকিছু ক্রমে গণনা করে । সঙ্গে --ancestry-pathআমরা কোপ আউট Hএবং Iতারা বংশধর নয় Cশুধুমাত্র, A। সঙ্গে --topo-orderআমরা যে প্রকৃত শুমার অর্ডার নিশ্চিত J, তারপর G, তারপরF ।
git rev-listকমান্ড তার মান আউটপুট, প্রতি লাইনে একটি আউট এই হ্যাশ ID- র উপচে পড়ার। feature2এরপরে এক ধাপ এগিয়ে যাওয়ার জন্য , আমরা কেবল শেষটি চাই লাইনটি চাই।
এটি যুক্ত করা সম্ভব (এবং লোভনীয় এবং দরকারী হতে পারে) --reverseযাতে git rev-listসেগুলি উত্পন্ন করার পরে বিপরীত ক্রমে কমিটগুলি মুদ্রণ করে। এটি কাজ করে, তবে আপনি যদি এটির মতো পাইপলাইনে এটি ব্যবহার করেন:
git rev-list --topo-order --ancestry-path --reverse <id1>...<id2> | head -1
স্রেফ "আইডি 2 এর নির্দেশে পরবর্তী প্রতিশ্রুতি" পেতে এবং কমিট করার একটি দীর্ঘ তালিকা রয়েছে, git rev-listকমান্ডটি একটি ভাঙা পাইপ পেতে পারে যখন এটি লেখার চেষ্টা করে headযা এর ইনপুটটি পড়া বন্ধ করে দিয়েছিল এবং প্রস্থান করেছে। যেহেতু ভাঙা-পাইপের ত্রুটিগুলি সাধারণত শেল দ্বারা উপেক্ষা করা হয়, এটি বেশিরভাগ ক্ষেত্রেই কাজ করে। আপনার ব্যবহারে এগুলি অবহেলিত হয়েছে তা নিশ্চিত করুন ।
এছাড়া যোগ করার জন্য প্রলুব্ধ -n 1করার git rev-listকমান্ড সহ --reverse। এটা করবেন না! এটি git rev-listএক ধাপ পিছনে হাঁটার পরে থামিয়ে দেয় এবং তারপরে পরিদর্শনকৃত কমিটগুলির (এক-প্রবেশ) তালিকাটি উল্টে দেয়। সুতরাং এটি <id2>প্রতিটি সময় উত্পাদন করে।
গুরুত্বপূর্ণ দিক নোট
মনে রাখবেন যে "হীরা" বা "বেনজিন রিং" গ্রাফের টুকরো সহ:
I--J
/ \
...--H M--... <-- last
\ /
K--L
চলন্ত এক "এগিয়ে" থেকে কমিট Hপ্রতি lastআপনি পাবেন পারেন I বা K । এটির জন্য আপনি কিছুই করতে পারবেন না: উভয়ই কমিট এক ধাপ এগিয়ে! তারপরে যদি আপনি ফলাফলটি প্রতিশ্রুতিবদ্ধতা থেকে শুরু করেন এবং অন্য পদক্ষেপে যান তবে আপনি এখন যে কোনও পথে শুরু করেছেন to
এর প্রতিকার হ'ল একবারে এক ধাপ সরে যাওয়া এবং পথ-নির্ভর শৃঙ্খলে আটকে যাওয়া। পরিবর্তে, যদি আপনি অন্য কোনও কিছু করার আগে একটি পুরো পৈতৃক-পথ চেইনটি দেখার পরিকল্পনা করেন তবে শৃঙ্খলে সমস্ত কমিটের একটি সম্পূর্ণ তালিকা তৈরি করুন:
git rev-list --topo-order --reverse --ancestry-path A..B > /tmp/list-of-commits
তারপরে, এই তালিকার প্রতিটি প্রতিশ্রুতি একবারে একবার দেখুন এবং আপনি সম্পূর্ণ শৃঙ্খলাটি পাবেন। --topo-orderনিশ্চিত করুন যে আপনি আঘাত করতে হবে I-and- Jযাতে আর K-and- Lযাতে (যদিও সেখানে কোন সহজ উপায় ভবিষ্যদ্বাণী করা হবে কিনা তা আপনি আগে বা কেএল যুগল পর অপব্যবহার যুগল চেষ্টা করবো এর)।