কমিট আইডি দেওয়া, কীভাবে এটি নির্ধারণ করবেন যে বর্তমান শাখায় কমিট রয়েছে?


155

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



10
নির্দিষ্ট প্রতিশ্রুতি যুক্ত সমস্ত শাখা কীভাবে সন্ধান করতে হয় তার জন্য প্রস্তাবিত সদৃশটি দেখুন । বর্তমান শাখায় কমিট সি রয়েছে কিনা তা জানতে , "নদীর গভীরতানির্ণয়" কমান্ডটি ব্যবহার করুন git merge-base --is-ancestor। বর্তমান শাখায় সি রয়েছে যদি সি এর পূর্বপুরুষ হয় HEAD, তাই:if git merge-base --is-ancestor $hash HEAD; then echo I contain commit $hash; else echo I do not contain commit $hash; fi
21'17 এ 8.09

1
হাই, দয়া করে এটি একটি উত্তর হিসাবে জমা দিন যাতে এটি সঠিক উত্তর হিসাবে নির্বাচন করা যায় =)
বেন

1
@ বেন - আমি এটি একটি সম্প্রদায়ের উইকি উত্তর হিসাবে যুক্ত করেছি।
জিট্রাক্স

1
@ রিমোভার: শেল স্ক্রিপ্টগুলিতে শূন্য সত্য, ননজারো মিথ্যা: সি কনভেনশনের বিপরীত। /bin/trueমূলত exit 0এবং /bin/falseহিসাবে বাস্তবায়িত হয়েছিল exit 1। (আধুনিক শাঁস তারপর সালে নির্মিত করেছেন।)
torek

উত্তর:


217

এই ফলাফলটি অর্জনের একাধিক উপায় রয়েছে। প্রথম নিষ্পাপ বিকল্পটি ব্যবহার git logকরে নির্দিষ্ট প্রতিশ্রুতি ব্যবহার করে অনুসন্ধান করা grep, তবে এটি সর্বদা সুনির্দিষ্ট হয় না

git log | grep <commit_id>

আপনি ভাল ব্যবহার করতে হয় git branchসরাসরি সব শাখা দেওয়া ধারণকারী এটি COMMIT_IDব্যবহার

git branch --contains $COMMIT_ID

পরবর্তী পদক্ষেপটি বর্তমান শাখাটি সন্ধান করছে যা git 1.8.1ব্যবহারের পর থেকে করা সম্ভব

git symbolic-ref --short HEAD

এবং একত্রিত হিসাবে

git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID

তবে উপরের কমান্ডটি সত্য বা মিথ্যা প্রত্যাবর্তন করবে না এবং একটি সংক্ষিপ্ত সংস্করণ রয়েছে যা বর্তমান শাখায় থাকলে প্রস্থান কোড 0 ফেরত দেয় বা প্রস্থান কোড 1 না হলে

git merge-base --is-ancestor $COMMIT_ID HEAD

প্রস্থান কোডটি দুর্দান্ত, তবে আপনি যেমন স্ট্রিং চান trueবা falseউত্তর হিসাবে আপনাকে কিছুটা যোগ করতে হবে এবং তারপরে ifপাওয়া বাশ থেকে মিলিত হওয়া দরকার

if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi

9
এটি সঠিক নয়; grepমিথ্যা positives হতে পারে যদি git logউল্লেখ অন্যান্য কারণে রয়েছে SHA কমিট, যেমন এটি একটি উল্লেখ করেছে অন্য শাখা থেকে একটি বন্দর ফলে বার্তা কমিট।
অ্যাডাম স্পাইর্স 15

1
সংশোধন করা হয়েছে (বা বরং আরও একটি বিকল্প যুক্ত করা হয়েছে)।
জিরিস

3
প্রশ্নটিতে মন্তব্যটি দেখুন, যা অন্তর্নির্মিত গিট সরঞ্জামটি ব্যবহার করে। stackoverflow.com/questions/43535132/…
বেন

2
আমি প্রথম বিকল্পটি পছন্দ করি তবে অ্যাডামের আপত্তিটি বাতিল করতে আমি বিকল্পটি যুক্ত --format=format:%Hকরতে চাই git log
পিজেএসকোপল্যান্ড

71

শাখা (এস) এর একটি তালিকা পান যাতে নির্দিষ্ট প্রতিশ্রুতি থাকে।

# get all the branches where the commit exists
$ git branch --contains <commit-id>

কোনও শাখার নির্দিষ্ট প্রতিশ্রুতি রয়েছে কিনা তা পরীক্ষা করুন।

# output the branch-name if the commit exists in that branch
$ git branch --contains <commit-id> | grep <branch-name>

সঠিক মিলেরfeature সাথে শাখাটি (বলুন ) অনুসন্ধান করুন ।

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

যেমন আপনি 3 স্থানীয় শাখা বলা থাকে, তাহলে feature, feature1, feature2তারপর

$ git branch --contains <commit-id> | grep 'feature'

# output
feature
feature1
feature2

$ git branch --contains <commit-id> | grep -E '(^|\s)feature$'

# output
feature     

আপনি উভয় localএবং remoteশাখা (ব্যবহার -a) বা কেবল remoteশাখায় (ব্যবহার -r) অনুসন্ধান করতে পারেন ।

# search in both 'local' & 'remote' branches  
$ git branch -a --contains <commit-id> | grep -E '(^|\s)feature$'

# search in 'remote' branches  
$ git branch -r --contains <commit-id> | grep -E '(^|\s)feature$'

1
grepএখানে মিথ্যা positives হতে পারে যদি সেখানে ধারণকারী কমিট যাদের নাম এছাড়াও ধারণ অন্যান্য শাখা <branch-name>একটি সাবস্ট্রিং হিসাবে।
অ্যাডাম স্পায়ার্স

1
হ্যাঁ @ অ্যাডামস্পিয়ার্স, শাখার নামের সাথে সঠিক মিলের সাথে উত্তরটি আপডেট করেছেনgrep -E '(^|\s)branchname$'
সজিব খান

1
প্রতি সংশ্লিষ্ট প্রশ্নে এই মন্তব্যটি এটি যোগ করতে উপযোগী হতে পারে -r( "দূরবর্তী") বা -aবিকল্প ( "সব") git branchশাখা যে স্থানীয় রেপো ক্লোন প্রতিলিপি নাও হতে পারে জন্য চেহারা।
sxc731

এটি আমার পক্ষে কাজ করে নি, আমার দরকার ছিল git branch --all --contains <commit-id>
আর্থার ট্যাকা

7

উত্তর হিসাবে @ টোরেকের দ্বারা প্রাপ্ত মন্তব্য:

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

বর্তমান শাখায় কমিট সি রয়েছে কিনা তা জানতে , "নদীর গভীরতানির্ণয়" কমান্ডটি ব্যবহার করুন git merge-base --is-ancestor। বর্তমান শাখায় সি রয়েছে যদি সি হেডের পূর্বপুরুষ হয়, তাই:

if git merge-base --is-ancestor $hash HEAD; then
    echo I contain commit $hash
else
    echo I do not contain commit $hash
fi

(পার্শ্ব দ্রষ্টব্য: শেল স্ক্রিপ্টগুলিতে শূন্য থেকে বেরিয়ে আসা একটি কমান্ড "সত্য" এবং ননজারো থেকে প্রস্থান করা "মিথ্যা"।)


4

প্রতিশ্রুতিযুক্ত স্থানীয় শাখা তালিকাভুক্ত করতে:

git branch --contains <commit-id>

এবং কেবলমাত্র রিমোট সহ সমস্ত শাখা তালিকাবদ্ধ করতে কমিট রয়েছে:

git branch -a --contains <commit-id>

একইভাবে প্রতিশ্রুতিবদ্ধ নির্দিষ্ট শাখায় রয়েছে কিনা তা যাচাই করতে:

git log <branch> | grep <commit_id>

এবং যদি শাখা স্থানীয়ভাবে শাখার নাম সহ স্থানীয়ভাবে উপস্থিত না থাকে origin/


মন্তব্য করার জন্য ভোট দিয়েছেন -a। পরামর্শের জন্য ধন্যবাদ!
থারকিল ভার্জ

3

হ্যাঁ আরেকটি বিকল্প:

git rev-list <branch name> | grep `git rev-parse <commit>`

এটি আমার পক্ষে সবচেয়ে ভাল কাজ করে যেহেতু এটি স্থানীয়ভাবে ক্যাশেড দূরবর্তী শাখাগুলিতে যেমন কাজ করবে remotes/origin/master, যেগুলি git branch --containsকাজ করবে না।

এটি কেবল "বর্তমান শাখা" সম্পর্কে ওপির প্রশ্নের তুলনায় অনেক বেশি কভার করে তবে আমি এই প্রশ্নের "কোনও শাখা" সংস্করণ জিজ্ঞাসা করতে বোধ করি তাই আমি যেভাবেই এখানে পোস্ট করার সিদ্ধান্ত নিয়েছি।


1
git branch --contains <commit-id> --points-at <target branch name>

যদি সেই শাখায় কমিট আইডি উপস্থিত থাকে তবে এটি লক্ষ্য শাখার নাম ফিরিয়ে দেবে। অন্যথায় কমান্ড ব্যর্থ হবে।


error: malformed object name 'branch-name'
নাহ

1
আপনি এই ক্ষেত্রে ত্রুটিটি 2 টি ক্ষেত্রে পেতে পারেন 1. যখন প্রদত্ত <শাখার নাম> প্রদত্ত <
কম্যান্ড

0

যেহেতু এই প্রশ্নের কয়েকটি চমৎকার স্ক্রিপি উত্তর রয়েছে, তাই আমি আমার পছন্দগুলি যুক্ত করছি।

এটি আপনাকে দেখাবে, সর্বশেষ $nকমিটের জন্য $brযে শাখায় প্রতিটি রয়েছে:

br=mybranch
n=10
git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'

এটি একটি অনুরূপ তবে শাখাগুলির তালিকার জন্য একই:

br="mybranch yourbranch herbranch"
n=4
for br in $brs; do git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'; done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.