git tutorial একটি গিট কমিট কি শাখা থেকে পাওয়া




gitlab (10)

কোন শাখা কোন শাখা থেকে তার শাখা দেওয়া হয় তা খুঁজে বের করার কোন উপায় আছে?

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


অন্য সব গাছের মধ্য দিয়ে অনুসন্ধান না হওয়া পর্যন্ত আপনি একটি মিলযুক্ত হ্যাশ খুঁজে পাবেন না।


উদাহরণস্বরূপ যে 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

UPD
অথবা শুধু একটি কমান্ড:

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

টি এল; ডিআর:

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

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

উভয় branch-name এবং branch-names উভয় যুক্তি হিসাবে একটি অঙ্গীকার গ্রহণ, এবং কেউ দেওয়া যদি HEAD থেকে ডিফল্ট।

স্ক্রিপ্টিং দরকারী alias

branch-current = "symbolic-ref --short HEAD"  # https://.com/a/19585361/5353461
branch-names = !"[ -z \"$1\" ] && git branch-current 2>/dev/null || git branch --format='%(refname:short)' --contains \"${1:-HEAD}\" #"  # https://.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\" #"

Commit শুধুমাত্র এক শাখা থেকে পৌঁছানোর

% git branch-name eae13ea
master
% echo $?
0
  • আউটপুট STDOUT হয়
  • প্রস্থান মান 0

একাধিক শাখা থেকে পৌঁছানোর commit

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

প্রস্থান অবস্থা থেকে, এই উপর নিরাপদে নির্মিত যেতে পারে। রিমোটের জন্য রিমোট ব্যবহার করার জন্য:

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

git branch --contains <ref> জন্য সর্বাধিক সুস্পষ্ট "চীনামাটির বাসন" কমান্ড। আপনি কেবলমাত্র "প্লাম্বিং" কমান্ডের মতো কিছু করতে চান তবে:

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

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


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

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> শাখা B প্রদান করে


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

sschuberth comments

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

এটা " একটি নির্দিষ্ট কমিট অন্তর্ভুক্ত যা একত্রিত কমিটি খুঁজুন " উপর ভিত্তি করে।

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

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

বিশেষত, BRANCH প্রথম পিতামাতার ইতিহাসে প্রাচীনতম BRANCH যা COMMIT কে পূর্বপুরুষ হিসেবে ধারণ করে।

আসল উত্তর সেপ্টেম্বর 2010:

Sebastien Douche শুধু twitted (এই SO উত্তর এর আগে 16 মিনিট):

git-what-branch : কোন শাখাটি কোন শাখা চালু আছে তা আবিষ্কার করুন অথবা এটি কোনও নামযুক্ত শাখাটিতে কীভাবে পাওয়া যায় তা আবিষ্কার করুন

এটি শেঠ রবার্টসনের একটি git-what-branch যা খুব আকর্ষণীয় বলে মনে হয়:

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

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

এক নজরে

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

প্রাথমিকতম পথের পথ অনুসারে, আমাদের এমন অর্থ যা একটি নামযুক্ত শাখায় প্রথমত, --topo-order সময় দ্বারা (যদি --topo-order নির্দিষ্ট না হয়)।

কর্মক্ষমতা

যদি অনেক শাখায় (যেমন শত শত) কমিটি থাকে তবে পাথটি ট্র্যাক করার জন্য সিস্টেমে দীর্ঘ সময় লাগতে পারে (লিনাক্সের গাছের একটি বিশেষ কমিটির জন্য এটি একটি শাখার অন্বেষণের জন্য 8 সেকেন্ড সময় নেয় তবে 200 টিরও বেশি প্রার্থী শাখা) প্রতিটি কমিট।
একটি নির্দিষ্ট - --reference-branch --reference tag নির্বাচন --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
   [...]

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


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

1 টিগ জিটি জন্য একটি ncurses- ভিত্তিক টেক্সট মোড ইন্টারফেস। এটি প্রধানত একটি গিট রিপোজিটরি ব্রাউজার হিসাবে কাজ করে, তবে এটি বিভিন্ন স্তরের স্তরের কমপ্লেক্সের জন্য পরিবর্তনগুলি পরিবর্তন করতে সহায়তা করে এবং বিভিন্ন গিট কমান্ডগুলির আউটপুটের জন্য প্যাজার হিসাবে কাজ করে।


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

এই আমি কি কাজ করে:

git rev-parse HEAD | xargs git name-rev

বিকল্পভাবে আপনি আউটপুট ফালা করতে পারেন:

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

ডেভ সঠিক যে তথ্য সরাসরি সংরক্ষণ করা হয় না, এর অর্থ এই নয় যে আপনি কখনই খুঁজে পাচ্ছেন না। এখানে আপনি কিছু করতে পারেন।

শাখা কমিটি খুঁজুন

git branch --contains <commit>

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

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

যদি আপনি রিপোজিটরিতে কাজ করেন যা কমিটি তৈরি করা হয়েছিল, তবে আপনি সেই কমিটির জন্য লাইনের জন্য রিফ্লগ অনুসন্ধান করতে পারেন। 90 দিনের চেয়ে পুরনো রিফ্লগগুলিকে git-gc দ্বারা ছিনতাই করা হয়, তাই যদি কমিটিটি পুরানো হয় তবে আপনি এটি খুঁজে পাবেন না। যে বলেন, আপনি এটা করতে পারেন:

git reflog show --all | grep a871742

একটি 871742 কমিট খুঁজে। আউটপুট এই মত কিছু হওয়া উচিত:

a871742 refs/heads/[email protected]{0}: commit (amend): mpc-completion: total rewrite

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

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

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

পরবর্তী একত্রীকরণ কমিটি খুঁজুন

এটি কার্যপ্রবাহ-নির্ভরশীল, তবে ভাল কার্যপ্রবাহের সাথে, সেগুলি বিকাশকারী শাখায় তৈরি করা হয় যা পরে মার্জ করা হয়। আপনি এটি করতে পারেন:

git log --merges <commit>..

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

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


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

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'






git