tutorial - gitlab




একটি গিট কমিট কি শাখা থেকে পাওয়া (8)

টি এল; ডিআর:

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

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

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

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

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\" #"

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 #"

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

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


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


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

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

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
   [...]

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


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

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

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 এর একটি সম্পর্কিত প্রশ্নের উত্তরটি এই বিষয়ে বিস্তারিতভাবে বিবৃত করে।


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

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

আশা করি এই স্ক্রিপ্টটি আমার বিন্দুকে চিত্রিত করে:

rm -rf /tmp/r1 /tmp/r2; mkdir /tmp/r1; cd /tmp/r1
git init; git config user.name n; git config user.email [email protected]
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;

আউটপুটটি যে কোনও উপায়ের অভাব দেখায় তা জানাতে হবে যে 'F1 যোগ করুন' দিয়ে সংঘটিত রিমোট ক্লোন / tmp / r2 থেকে শাখা B1 বা b2 থেকে আসা হয়েছে কিনা।

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

+ 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 [email protected]{0}: merge b2: Fast-forward
086c9ce [email protected]{1}: commit: Add f1
18feb84 [email protected]{2}: Branch: renamed refs/heads/master to refs/heads/b1
18feb84 [email protected]{3}: commit (initial): empty
+ git reflog b2
f0c707d [email protected]{0}: merge b1: Merge made by the 'recursive' strategy.
80c10e5 [email protected]{1}: commit: Add f2
18feb84 [email protected]{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 [email protected]{0}: clone: from /tmp/r1
+ git reflog b2
f0c707d [email protected]{0}: fetch origin b2:b2: storing head

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

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