গিট কমিট কোন শাখা থেকে এসেছে তা সন্ধান করা


649

কোনও শাখা থেকে তার শাখা -১ হ্যাশ মূল্য দেওয়া হলে কোন শাখাটি আসে তা জানার কোনও উপায় আছে ?

বোনাস পয়েন্টস আপনি যদি আমাকে বলতে পারেন রুবি গ্রিট ব্যবহার করে এটি কীভাবে সম্পন্ন করতে হয়।


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

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

উত্তর:


864

যদিও ডেভ সঠিক যে তথ্যটি সরাসরি সংরক্ষণ করা হয় না, তার অর্থ এই নয় যে আপনি কখনই এটি সন্ধান করতে পারবেন না। এখানে আপনি করতে পারেন কয়েকটি জিনিস।

প্রতিশ্রুতিবদ্ধ শাখাগুলি সন্ধান করুন

git branch -a --contains <commit>

এটি আপনাকে সমস্ত শাখাকে জানিয়ে দেবে যা তাদের ইতিহাসে প্রদত্ত প্রতিশ্রুতিবদ্ধ। স্পষ্টতই যদি কমিটটি ইতিমধ্যে মার্জ হয়ে যায় তবে এটি কম কার্যকর।

রিফ্লাগগুলি অনুসন্ধান করুন

আপনি যদি সেই ভাণ্ডারটিতে কাজ করছেন যেখানে প্রতিশ্রুতিবদ্ধ হয়েছিল, আপনি সেই প্রতিশ্রুতিটির জন্য রেখাটি অনুসন্ধান করতে পারেন। 90 দিনের পুরানো রিফ্লাগগুলি গিট-জিসি দ্বারা ছাঁটাই করা হয়, সুতরাং যদি প্রতিশ্রুতিটি খুব পুরানো হয় তবে আপনি এটি খুঁজে পাবেন না। এটি বলেছিল, আপনি এটি করতে পারেন:

git reflog show --all | grep a871742

প্রতিশ্রুতিবদ্ধ a871742 খুঁজে। নোট করুন যে আপনাকে কমিটের সংক্ষিপ্ত 7 টি প্রথম সংখ্যা ব্যবহার করা উচিত। আউটপুটটি এমন কিছু হওয়া উচিত:

a871742 refs/heads/completion@{0}: commit (amend): mpc-completion: total rewrite

ইঙ্গিত করে যে প্রতিশ্রুতিটি "সমাপ্তি" শাখায় করা হয়েছিল। ডিফল্ট আউটপুট সংক্ষিপ্ত প্রতিশ্রুতিবদ্ধ হ্যাশগুলি দেখায়, তাই সম্পূর্ণ হ্যাশ অনুসন্ধান না করা নিশ্চিত করুন বা আপনি কোনও কিছুই পাবেন না।

git reflog showআসলে এটির জন্য কেবল একটি উপনাম git log -g --abbrev-commit --pretty=oneline, সুতরাং যদি আপনি আউটপুট ফর্ম্যাটটির সাথে বিভিন্ন জিনিস গ্রিপের জন্য উপলভ্য করতে চান তবে এটিই আপনার প্রারম্ভিক বিন্দু!

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

পরবর্তী মার্জ কমিট সন্ধান করুন

এটি ওয়ার্কফ্লো-নির্ভর, তবে ভাল কর্মপ্রবাহের সাথে, উন্নয়ন শাখাগুলিতে কমিট করা হয় যা পরে মার্জ করা হয় You আপনি এটি করতে পারেন:

git log --merges <commit>..

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

আপনি যদি এটি করে বিশ্বাস করতে সক্ষম হতে চান তবে আপনি দ্রুত-ফরওয়ার্ড ক্ষেত্রে এমনকি একীভূত প্রতিশ্রুতিবদ্ধ সৃষ্টিকে বাধ্য --no-ffকরার git mergeজন্য বিকল্পটি ব্যবহার করতে পারেন । (যদিও খুব উত্সাহী হবেন না over অতিরিক্ত ব্যবহার করা হলে তা বিস্মৃত হয়ে উঠতে পারে)) সম্পর্কিত প্রশ্নের সাথে ভনসির উত্তরটি এই বিষয়টিতে সহায়কভাবে ব্যাখ্যা করেছে।


5
+1 টি। নির্দিষ্ট সমস্যাটির জন্য তথ্যের নিখুঁত অনুপস্থিতি আপনাকে অবাক করে তোলে যে এটি আসলে কোনও সমস্যা কিনা? শাখাগুলি যে কোনও সময় পরিবর্তন করা, নামকরণ বা মুছতে পারে। হতে পারে git describeযথেষ্ট, জন্য (টিকা দেওয়া) ট্যাগগুলি শাখার চেয়ে বেশি উল্লেখযোগ্য হিসাবে দেখা যেতে পারে।
ভনসি

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

32
এফওয়াইআই, আপনি যদি কেবলমাত্র দূরবর্তী অঞ্চলে বিদ্যমান কমিটগুলি সন্ধান করতে চান -aতবে প্রথম কমান্ডে পতাকাটি যুক্ত করুনgit branch -a --contains <commit>
জোনাথন ডে

8
@ জোনাথনডায়: না, এটি কোনও শাখায় কমিট খুঁজে পাবে। যদি আপনি কেবল রিমোটে চান তবে ব্যবহার করুন -r
ক্যাসকেবেল

7
@ সিমোনটিউসি লাইক আমি বলেছিলাম, এটি সত্যিই যদি সমস্যা হয় merge --no-ffতবে আপনি মার্জ হওয়ার পরে শাখার নামটি নির্ভরযোগ্যভাবে রেকর্ড করুন। তবে অন্যথায়, শাখার নামগুলি অস্থায়ী শর্ট লেবেল হিসাবে ভাবেন এবং স্থায়ী নাম হিসাবে বর্ণনা করুন। "উন্নয়নের সময় আমরা কোন সংক্ষিপ্ত নামটি উল্লেখ করেছি?" "এই প্রতিশ্রুতিটি কী করে?" এর মতো সত্যই গুরুত্বপূর্ণ প্রশ্ন হওয়া উচিত নয়?
ক্যাসাবেল

154

এই সাধারণ কমান্ডটি কবজির মতো কাজ করে:

git name-rev <SHA>

উদাহরণস্বরূপ (যেখানে পরীক্ষা-শাখা শাখার নাম):

git name-rev 651ad3a
251ad3a remotes/origin/test-branch

এমনকি এটি জটিল পরিস্থিতিতে যেমন:

origin/branchA/
              /branchB
                      /commit<SHA1>
                                   /commit<SHA2>

এখানে শাখাটিgit name-rev commit<SHA2> ফেরত দেয়


3
আপনি আমার দিন বাঁচিয়েছেন। এই নিখুঁত সমাধান।
টাকো

7
এবং এই নিখুঁত সমাধানের জন্য এটি 8 বছর সময় নিয়েছে। ধন্যবাদ!
S1J0

6
আমি git name-rev --name-only <SHA>কেবল শাখার নাম পাওয়ার জন্য আরও দরকারী বলে মনে করেছি । আমার প্রশ্ন ... এটি কোনও পরিস্থিতিতে একাধিক শাখা ফেরত দিতে পারে?
ডিন কায়টন

1
এটি সেরা উত্তর হওয়া উচিত।
জোলক্লেয়ার

1
আপনার দয়াবান শব্দের জন্য আপনাকে @ জোলার ধন্যবাদ।
খিচর.নিল

47

ডিসেম্বর 2013 আপডেট করুন:

sschuberth মন্তব্য

git-what-branch(পার্ল স্ক্রিপ্ট, নীচে দেখুন) আর বজায় রাখা মনে হয় না। git-when-mergedপাইথনে লিখিত একটি বিকল্প যা আমার পক্ষে খুব ভাল কাজ করছে।

এটি " মার্জ কমিটস সন্ধান করুন যার মধ্যে একটি নির্দিষ্ট কমিট অন্তর্ভুক্ত রয়েছে " এর উপর ভিত্তি করে ।

git when-merged [OPTIONS] COMMIT [BRANCH...]

কমিট যখন এক বা একাধিক শাখায় একীভূত হয়েছিল তখন সন্ধান করুন। নির্দিষ্ট ব্রাঞ্চ (এসএস) এর মধ্যে
আনা একীভূত প্রতিশ্রুতি সন্ধান করুন COMMIT

বিশেষ করে, প্রাচীনতম জন্য বর্ণন কমিট প্রথম পিতা বা মাতা ইতিহাসের উপর BRANCHযে রয়েছে COMMITএকটি পূর্বপুরুষ হিসাবে।


আসল উত্তর সেপ্টেম্বর ২০১০:

সেবাস্তিয়ান ডুচে ঠিক টুইটারে (এই উত্তরের 16 মিনিটের আগে):

গিট-হোয়াট ব্রাঞ্চ : কোন শাখাটি কী শাখা চালু আছে বা এটি একটি নামী শাখায় কীভাবে পেয়েছে তা আবিষ্কার করুন

এই হল পার্ল স্ক্রিপ্ট থেকে শেঠ রবার্টসন যে খুব আকর্ষণীয় বলে মনে হয়:

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

git-what-branch [--allref] [--all] [--topo-order | --date-order ]
[--quiet] [--reference-branch=branchname] [--reference=reference]
<commit-hash/tag>...

এক নজরে

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

প্রথম দিকের কার্যপথ দ্বারা, আমরা সেই পথটিকে বোঝাই যা নামমাত্র শাখায় একত্রে মার্জ হয়েছিল, কমিট সময় দ্বারা ( --topo-orderনির্দিষ্ট না করা পর্যন্ত )।

কর্মক্ষমতা

যদি অনেকগুলি শাখা (যেমন শত শত) কমিট থাকে তবে সিস্টেমটি দীর্ঘ সময় নিতে পারে (লিনাক্স ট্রি একটি নির্দিষ্ট প্রতিশ্রুতি জন্য, একটি শাখা অন্বেষণে এটি 8 সেকেন্ড সময় নিয়েছিল, তবে 200 টিরও বেশি প্রার্থী শাখা ছিল) এই পথটি অনুসরণ করতে প্রতিটি প্রতিশ্রুতিবদ্ধ। পরীক্ষার
জন্য কোনও বিশেষের নির্বাচন --reference-branch --reference tagশত গুণ দ্রুত হবে (যদি আপনার শত প্রার্থীর শাখা থাকে)।

উদাহরণ

 # git-what-branch --all 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4
 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 first merged onto master using the following minimal temporal path:
   v2.6.12-rc3-450-g1f9c381 merged up at v2.6.12-rc3-590-gbfd4bda (Thu May  5 08:59:37 2005)
   v2.6.12-rc3-590-gbfd4bda merged up at v2.6.12-rc3-461-g84e48b6 (Tue May  3 18:27:24 2005)
   v2.6.12-rc3-461-g84e48b6 is on master
   v2.6.12-rc3-461-g84e48b6 is on v2.6.12-n
   [...]

এই প্রোগ্রামটি চেরি-বাছাইয়ের আগ্রহের প্রতিশ্রুতিগুলিকে বিবেচনা করে না, কেবল মার্জ অপারেশনগুলি।


4
git-what-branchআর রক্ষণাবেক্ষণ বলে মনে হয় না। গিট-উইল-মার্জ করা হল পাইথনে লিখিত একটি বিকল্প যা আমার পক্ষে খুব ভাল কাজ করছে।
স্কুবার্থ

@ এসছুবার্থ এই আপডেটের জন্য আপনাকে ধন্যবাদ। আরও দৃশ্যমানতার জন্য আমি আপনার মন্তব্যে উত্তরে অন্তর্ভুক্ত করেছি।
ভনসি

37

উদাহরণস্বরূপ, c0118faপ্রতিশ্রুতিটি কোথা থেকে এসেছে তা সন্ধান করতে redesign_interactions:

* ccfd449 (HEAD -> develop) Require to return undef if no digits found
*   93dd5ff Merge pull request #4 from KES777/clean_api
|\
| * 39d82d1 Fix tc0118faests for debugging debugger internals
| * ed67179 Move &push_frame out of core
| * 2fd84b5 Do not lose info about call point
| * 3ab09a2 Improve debugger output: Show info about emitted events
| *   a435005 Merge branch 'redesign_interactions' into clean_api
| |\
| | * a06cc29 Code comments
| | * d5d6266 Remove copy/paste code
| | * c0118fa Allow command to choose how continue interaction
| | * 19cb534 Emit &interact event

আপনার চালানো উচিত:

git log c0118fa..HEAD --ancestry-path --merges

এবং শেষ মার্জ কমিট সন্ধান করতে নীচে স্ক্রোল করুন । যা হলো:

commit a435005445a6752dfe788b8d994e155b3cd9778f
Merge: 0953cac a06cc29
Author: Eugen Konkov
Date:   Sat Oct 1 00:54:18 2016 +0300

    Merge branch 'redesign_interactions' into clean_api

হালনাগাদ

অথবা কেবল একটি আদেশ:

git log c0118fa..HEAD --ancestry-path --merges --oneline --color | tail -n 1

4
এটিই ছিল একমাত্র সমাধান যা আমাকে পছন্দসই ফলাফল দিয়েছে। আমি বাকি চেষ্টা করেছিলাম।
ক্রাফার

এটি কেবলমাত্র মার্জ কমিটের সংক্ষিপ্তগুলিতে মার্জগুলিতে ব্যবহৃত শাখার নামগুলি অন্তর্ভুক্ত থাকে, যা ডিফল্টরূপে তারা সাধারণত করে works তবে git merge -m"Any String Here"উত্স এবং লক্ষ্য শাখার তথ্যকে অস্পষ্ট করবে।
কুইনিল

@qneill: না, একত্রীকরণ সবসময় মার্জ শাখা সম্পর্কে তথ্য রয়েছে: Merge: f6b70fa d58bdcb। আপনি নিজের মতো করে আপনার মার্জ কমিটের নাম রাখতে পারেন। আমার কোনও ব্যাপার হবে না
ইউজেন কনকভ

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

ইউপিডি সংস্করণটি আমার পক্ষে কাজ করে, সরল কমান্ড যা মূল প্রতিশ্রুতি সন্ধান করে
vpalmu

9

git branch --contains <ref>এটি করার জন্য সবচেয়ে সুস্পষ্ট "চীনামাটির বাসন" কমান্ড command আপনি যদি কেবল "নদীর গভীরতানির্ণয়" কমান্ড দিয়ে অনুরূপ কিছু করতে চান:

COMMIT=$(git rev-parse <ref>) # expands hash if needed
for BRANCH in $(git for-each-ref --format "%(refname)" refs/heads); do
  if $(git rev-list $BRANCH | fgrep -q $COMMIT); then
    echo $BRANCH
  fi
done

( এই এসও উত্তর থেকে ক্রসপোস্ট )


6

খিচর.আনিল তার উত্তরে এর বেশিরভাগ অংশ জুড়েছিল

আমি কেবল পতাকাটি যুক্ত করছি যা সংশোধন নামের তালিকা থেকে ট্যাগগুলি সরিয়ে দেবে। এটি আমাদের দেয়:

git name-rev --name-only --exclude=tags/* $SHA

দ্বিতীয় বাক্যে কিছু অনুপস্থিত মনে হচ্ছে।
পিটার মর্টেনসেন

আমি বর্ণনাটি আপডেট করেছি। মতামত জন্য Thx।
ফায়াত

4

দরিদ্র ব্যক্তির বিকল্পটি হল সরঞ্জামটি tig1 টি ব্যবহার করা HEAD, প্রতিশ্রুতি সন্ধান করা এবং তারপরে কোনও মার্জ কমিট না দেখা পর্যন্ত দৃশ্যমানভাবে সেই প্রতিশ্রুতিটি থেকে লাইনটি অনুসরণ করুন। ডিফল্ট মার্জ বার্তায় কোন শাখাটি কোথায় মিশে যাচ্ছে তা নির্দিষ্ট করা উচিত :)

1 টিগিট গিটের জন্য একটি এনক্রাস ভিত্তিক পাঠ্য-মোড ইন্টারফেস। এটি মূলত একটি গিট সংগ্রহস্থল ব্রাউজার হিসাবে কাজ করে তবে এটি খণ্ড স্তরে কমিট করার জন্য পরিবর্তনগুলি মঞ্চে সহায়তা করতে এবং বিভিন্ন গিট কমান্ড থেকে আউটপুট জন্য পেজার হিসাবে কাজ করতে পারে।


3

পরীক্ষা হিসাবে, আমি একটি পোস্ট-কমিট হুক তৈরি করেছি যা কমিট মেটাডেটাতে বর্তমানে চেক আউট শাখার তথ্য সংরক্ষণ করে। আমি তথ্যটি দেখানোর জন্য গিটকে কিছুটা সংশোধন করেছি।

আপনি এটি এখানে পরীক্ষা করে দেখতে পারেন: https://github.com/pajp/branch-info-commits


1
তবে আপনি যদি মেটাডেটা যুক্ত করতে চান তবে কমিটের শিরোনামগুলির সাথে গণ্ডগোলের পরিবর্তে গিট নোট ব্যবহার করছেন না কেন? দেখুন stackoverflow.com/questions/5212957/... , stackoverflow.com/questions/7298749/... বা stackoverflow.com/questions/7101158/...
VonC

সত্যি কথা বলতে কি আমি জানি না যে গিট নোটের অস্তিত্ব ছিল যখন আমি এটি লিখি। হ্যাঁ, একই জিনিসটি অর্জনের জন্য গিট নোট ব্যবহার করা সম্ভবত আরও ভাল ধারণা।
pajp

3

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

এটিই আমি নিয়ে কাজ করি:

git rev-parse HEAD | xargs git name-rev

Ptionচ্ছিকভাবে আপনি আউটপুট স্ট্রিপ করতে পারেন:

git rev-parse HEAD | xargs git name-rev | cut -d' ' -f2 | sed 's/remotes\/origin\///g'

0

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

আপনি প্রথমে ভালভাবে টানতে চাই:

git pull --all

তারপরে শাখা অনুসন্ধান করুন:

git name-rev <SHA>

বা:

git branch --contains <SHA>

0

ওপি নির্ধারণ করার চেষ্টা করা হয়, তাহলে ইতিহাস যে একটি শাখা যখন একটি নির্দিষ্ট কমিট তৈরি করা হয়েছে দ্বারা ভেদকরেখার ছিল ( "জানতে কি শাখা একটি কমিট তার SHA-1 হ্যাশ মান দেওয়া থেকে আসে"), তারপর reflog ছাড়া নেই কোন গিট অবজেক্ট ডাটাবেসে রেকর্ডস যা দেখায় যে নামকরণ করা শাখাটি কোনটি ইতিহাসের প্রতিশ্রুতিবদ্ধ to

(আমি একটি মন্তব্যে জবাব হিসাবে এটি পোস্ট।)

আশা করি এই লিপিটি আমার বক্তব্য তুলে ধরে:

rm -rf /tmp/r1 /tmp/r2; mkdir /tmp/r1; cd /tmp/r1
git init; git config user.name n; git config user.email e@x.io
git commit -m"empty" --allow-empty; git branch -m b1; git branch b2
git checkout b1; touch f1; git add f1; git commit -m"Add f1"
git checkout b2; touch f2; git add f2; git commit -m"Add f2"
git merge -m"merge branches" b1; git checkout b1; git merge b2
git clone /tmp/r1 /tmp/r2; cd /tmp/r2; git fetch origin b2:b2
set -x;
cd /tmp/r1; git log --oneline --graph --decorate; git reflog b1; git reflog b2;
cd /tmp/r2; git log --oneline --graph --decorate; git reflog b1; git reflog b2;

আউটপুটটি 'অ্যাড এফ 1' এর সাথে কমিটগুলি ব্রাঞ্চ বি 1 বা বি 2 থেকে রিমোট ক্লোন / টিএমপি / আর 2 থেকে এসেছে কিনা তা জানার কোনও উপায়ের অভাব দেখায়।

(আউটপুট এর শেষ লাইন এখানে)

+ cd /tmp/r1
+ git log --oneline --graph --decorate
*   f0c707d (HEAD, b2, b1) merge branches
|\
| * 086c9ce Add f1
* | 80c10e5 Add f2
|/
* 18feb84 empty
+ git reflog b1
f0c707d b1@{0}: merge b2: Fast-forward
086c9ce b1@{1}: commit: Add f1
18feb84 b1@{2}: Branch: renamed refs/heads/master to refs/heads/b1
18feb84 b1@{3}: commit (initial): empty
+ git reflog b2
f0c707d b2@{0}: merge b1: Merge made by the 'recursive' strategy.
80c10e5 b2@{1}: commit: Add f2
18feb84 b2@{2}: branch: Created from b1
+ cd /tmp/r2
+ git log --oneline --graph --decorate
*   f0c707d (HEAD, origin/b2, origin/b1, origin/HEAD, b2, b1) merge branches
|\
| * 086c9ce Add f1
* | 80c10e5 Add f2
|/
* 18feb84 empty
+ git reflog b1
f0c707d b1@{0}: clone: from /tmp/r1
+ git reflog b2
f0c707d b2@{0}: fetch origin b2:b2: storing head

এবং উভয় ক্ষেত্রে আউটপুট git log 80c10e5..HEAD --ancestry-path --merges --oneline --color | tail -n 1এবং git log 086c9ce..HEAD --ancestry-path --merges --oneline --color | tail -n 1আদেশ কি ?
ইউজেন কনকভ

কমান্ডগুলি চালিত হওয়ার সময় অবশ্যই এসএএএগুলি পরিবর্তন করে আপনার কমান্ডগুলি রিসেল করার জন্য আমি একটি নতুন রানে হেড ^ 1 এবং হেড ^ 2 ব্যবহার করেছি । আদেশগুলি এবং আউটপুটটি হ'ল : $ git log HEAD^1..HEAD --ancestry-path --merges --oneline --color | tail -n 1যা ফলন করে 376142d merge branchesএবং $ git log HEAD^2..HEAD --ancestry-path --merges --oneline --color | tail -n 1কোন ফলন করে 376142d merge branches- যা মার্জ কমিটের সারসংক্ষেপ দেখায়, যা (আমি দৃ as়ভাবে বলছিলাম) মার্জটি তৈরি হওয়ার পরে ওভাররাইট করা যেতে পারে, সম্ভবত মার্জটির শাখা ইতিহাসকে অস্পষ্ট করে।
কুইনিল

0

টি এল; ডিআর:

শেল প্রস্থান স্থিতি সম্পর্কে যদি আপনার যত্ন থাকে তবে নীচেরটি ব্যবহার করুন:

  • branch-current - বর্তমান শাখার নাম
  • branch-names - পরিষ্কার শাখার নাম (প্রতি লাইনে একটি)
  • branch-name - নিশ্চিত করুন যে কেবল একটি শাখা থেকে ফিরে এসেছে branch-names

উভয় branch-nameএবং branch-namesআর্গুমেন্ট হিসাবে একটি প্রতিশ্রুতি গ্রহণ, এবং HEADকিছুই দেওয়া না হলে ডিফল্ট ।


স্ক্রিপ্টিংয়ে এলিয়াস দরকারী

branch-current = "symbolic-ref --short HEAD"  # https://stackoverflow.com/a/19585361/5353461
branch-names = !"[ -z \"$1\" ] && git branch-current 2>/dev/null || git branch --format='%(refname:short)' --contains \"${1:-HEAD}\" #"  # https://stackoverflow.com/a/19585361/5353461
branch-name = !"br=$(git branch-names \"$1\") && case \"$br\" in *$'\\n'*) printf \"Multiple branches:\\n%s\" \"$br\">&2; exit 1;; esac; echo \"$br\" #"

শুধুমাত্র একটি শাখা থেকে পৌঁছনীয় প্রতিশ্রুতিবদ্ধ

% git branch-name eae13ea
master
% echo $?
0
  • আউটপুট STDOUT এ চলেছে
  • প্রস্থান মান 0

একাধিক শাখা থেকে পৌঁছনীয় প্রতিশ্রুতিবদ্ধ

% git branch-name 4bc6188
Multiple branches:
attempt-extract
master%
% echo $?
1
  • আউটপুটটি এসটিডিআরআরে হয়
  • প্রস্থান মূল্য হয় 1

প্রস্থান স্থিতির কারণে এগুলি নিরাপদে নির্মিত হতে পারে। উদাহরণস্বরূপ, আনার জন্য রিমোটটি ব্যবহার করতে:

remote-fetch = !"branch=$(git branch-name \"$1\") && git config branch.\"$branch\".remote || echo origin #"

-1

স্থানীয় শাখা খুঁজে পেতে:

grep -lR YOUR_COMMIT .git/refs/heads | sed 's/.git\/refs\/heads\///g'

দূরবর্তী শাখাটি সন্ধান করতে:

grep -lR $commit .git/refs/remotes | sed 's/.git\/refs\/remotes\///g'

1
আপনার উদাহরণগুলির কিছু ব্যাখ্যা দুর্দান্ত থাকবে
ইউজেন কনকভ

-4

গাছের সমস্তটি অনুসন্ধান করা বাদ দিয়ে আপনি কোনও ম্যাচিং হ্যাশ না পাওয়া পর্যন্ত না।


7
আমি সত্যিই এটিকে হ্রাস করতে চাই না, কারণ কঠোরভাবে বলতে গেলে সত্য যে গিটটি স্থায়ীভাবে সেই তথ্য সংরক্ষণ করে না, তবে এটি সন্ধান করা খুব প্রায়শই সম্ভব। আমার উত্তর দেখুন।
ক্যাসাবেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.