গিটে পরবর্তী প্রতিশ্রুতিটি কীভাবে খুঁজে পাব? (রেফের শিশু / শিশু)


236

ref^পূর্বে প্রতিশ্রুতি বোঝায় ref, প্রতিশ্রুতি পরে কি সম্পর্কে ref?

উদাহরণস্বরূপ, যদি আমি git checkout 12345কীভাবে পরবর্তী প্রতিশ্রুতিটি চেক করব?

ধন্যবাদ।

পিএস হ্যাঁ, গিটের একটি ডিএজি নোড পয়েন্টার স্ট্রাক্ট গাছ যাই হোক না কেন। এইটির পরে আমি কীভাবে প্রতিশ্রুতিবদ্ধ তা খুঁজে পাব?



2
" git children-of" দেখুন!
ভনসি

উত্তর:


185

বর্তমান কমিট থেকে শুরু করে এবং তারপরে তার শিশু, এবং আরও সমস্ত কমিটের তালিকা তৈরি করতে - মূলত স্ট্যান্ডার্ড গিট লগ, তবে সময় মতো অন্যভাবে যেতে, এরকম কিছু ব্যবহার করুন

git log --reverse --ancestry-path 894e8b4e93d8f3^..master

যেখানে 894e8b4e93d8f3 হ'ল প্রথম প্রতিশ্রুতি যা আপনি প্রদর্শন করতে চান।


3
মূল প্রশ্নে নির্দিষ্ট ঘটনাতে জন্য, শুধু প্রতিস্থাপন HEAD^জন্য 894e8b4e93d8f3^
সেরেন লভবর্গ

2
হতে পারে, - যুক্ত করুন একটি ভাল সংক্ষিপ্ত আউটপুট ফলাফল।
ফেরি

1
আমার ব্যবহার করা দরকার ..., ^..নিঃশব্দে ব্যর্থ হয়
TankorSmash

1
পথ fatal: unrecognized argument: --ancestry-pathমধ্যে Git সংস্করণ 1.7.1
user151841

6
এটি কেবলমাত্র masterবর্তমান কমিটের পূর্বপুরুষের পথে থাকলে কাজ করবে । দেখুন আমার উত্তর একটি সমাধান যা সব ক্ষেত্রেই কাজ করবে 's দ্বিতীয় কোড স্নিপেট।
টম হেল

37

হডসনের স্রষ্টা (বর্তমানে জেনকিন্স) কোহসুক কাওয়াগুচি
সদ্য প্রকাশিত (নভেম্বর ২০১৩): কোহসুক / গিট-চিলড্রেন অফ :

একটি প্রতিশ্রুতি দেওয়া হয়েছে, সেই প্রতিশ্রুতিটির তাত্ক্ষণিক শিশুদের সন্ধান করুন।

#!/bin/bash -e
# given a commit, find immediate children of that commit.
for arg in "$@"; do
  for commit in $(git rev-parse $arg^0); do
    for child in $(git log --format='%H %P' --all | grep -F " $commit" | cut -f1 -d' '); do
      git describe $child
    done
  done
done

এই থ্রেড দ্বারা চিত্রিত হিসাবে , কোনও ডিএজি (নির্দেশিত অ্যাসাইক্লিক গ্রাফ) দ্বারা প্রতিনিধিত্ব করা ইতিহাসের ভিত্তিতে ভিসিএসে , "একজন পিতা বা মাতা" বা "একটি শিশু" নেই।

        C1 -> C2 -> C3
      /               \
A -> B                  E -> F
      \               /
        D1 -> D2 ----/

আদেশগুলির ক্রম " টপো -অর্ডার" বা "তারিখ-আদেশ" ( গিটপ্রো বইটি দেখুন ) দ্বারা করা হয়

তবে Git1.6.0 থেকে , আপনি প্রতিশ্রুতিবদ্ধদের শিশুদের তালিকা করতে পারেন।

git rev-list --children
git log --children

দ্রষ্টব্য: পিতামাতার প্রতিশ্রুতিবদ্ধতার জন্য , আপনার একই সমস্যা রয়েছে, এটি ^একটি পুনর্বিবেচনা প্যারামিটারের প্রত্যয় সহ, যার অর্থ সেই প্রতিশ্রুতিবদ্ধ বস্তুর প্রথম অভিভাবক। ^<n>অর্থ <n>পিতামহুল (অর্থাত্ rev^ সমান rev^1)।

আপনি যদি শাখা fooএবং ইস্যুতে থাকেন তবে " git merge bar" fooপ্রথম পিতামাতা হবে।
অর্থাত: প্রথম অভিভাবক হ'ল আপনি যখন মার্জ হয়েছিলেন তখন আপনি যে শাখায় ছিলেন এবং দ্বিতীয়টি আপনি যে শাখায় সংযুক্ত হয়েছিলেন সে বিষয়ে প্রতিশ্রুতিবদ্ধ।


6
git rev-list --childrenঅবশ্যই আমি যা চাই তার মতো দেখতে তবে এটি ডিডব্লিম নয়। এটি সমস্ত পিতামাতা এবং তাদের বাচ্চাদের তালিকাভুক্ত করে। আমি মনে করি আমি তাদের সবগুলি তালিকাভুক্ত করতে পারি এবং তাদের মাধ্যমে পার্স করতে পারি ... ব্লহ, তবে এটি কিছু।
শোবার্ন

@ শ্যাওয়ার্ন: সত্য, git rev-list --childrenএটি কেবল বাচ্চাদের তালিকার জন্য নয়, তবে তাদের বাচ্চাদের সাথে পিতামাতার তালিকা তৈরি করার জন্য ... আপনার সর্বদা পার্স করা দরকার to
ভনসি

আমি এই কোডটি দুটি সন্তানের সাথে প্রতিশ্রুতিবদ্ধ করে দেওয়ার চেষ্টা করেছি: $ git children0of 9dd5932 fatal: No annotated tags can describe '71d7b5dd89d241072a0a078ff2c7dfec05d52e1f'. However, there were unannotated tags: try --tags. আপনি কী আউটপুট পাবেন?
টম হেল

@ টমহেল আমি এখনই এটি পরীক্ষা করতে পারছি না, তবে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন (ওএস এবং গিট সংস্করণ সহ), যেভাবে সবাই পরীক্ষা করতে পারে।
ভনসি

1
কেবল সমস্যাটি git-children-ofহ'ল এটি গিট বিবরণ ব্যবহার করে যা SHA কে মানব-পঠনযোগ্য হিসাবে ফর্ম্যাট করার চেষ্টা করে যা @ টমহেল এর ত্রুটির সাথে ব্যর্থ হতে পারে এবং v1.0.4-14-g2414721যদি আপনি কোনও এসএইচএ প্রত্যাশা করেন তবে বিভ্রান্তিকর ফলাফল দেয় । একটি সরল সঙ্গে এটি প্রতিস্থাপন এটি echoএকটি দুর্দান্ত সরঞ্জাম, ধন্যবাদ!
নিকোলে

18

আমি যা পেয়েছি তা হ'ল

git rev-list --ancestry-path commit1..commit2

যেখানে আমি commit1বর্তমান প্রতিশ্রুতি হিসাবে এবং commit2বর্তমান প্রধান হিসাবে সেট করেছি । এটি আমাকে সেই সমস্ত কমিটের একটি তালিকা ফেরত দেয় যা commit1এবং এর মধ্যে একটি পথ তৈরি করে commit2

আউটপুটটির শেষ লাইনটি কমিট 1 এর সন্তান (প্রতিশ্রুতি দেওয়ার পথে)।


3
তাই শুধু | tail -1সন্তান পেতে যোগ করুন ।
জেসি গ্লিক

8

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

তবে এর সাথে আসল সমস্যাটি হ'ল বাচ্চাদের যে প্রতিশ্রুতিবদ্ধ তা উল্লেখ করা হয় না, এটি কেবল পিছনের লিঙ্কযুক্ত তালিকা। সন্তানের প্রতিশ্রুতিবদ্ধ সন্ধানের জন্য একটি অনুসন্ধান নেওয়া উচিত, যা খুব খারাপ নয়, তবে সম্ভবত গিট কিছু রেফস্পেক যুক্তি যুক্ত করতে চায় না।

যাই হোক না কেন, আমি এই প্রশ্নটি নিয়ে এসেছি কারণ আমি ইতিহাসে কেবল একবারে প্রতিশ্রুতিবদ্ধ করতে, টেস্ট করে এগিয়ে যেতে চাই এবং কখনও কখনও আপনাকে পিছনে নয় বরং এগিয়ে যেতে হয়। ঠিক আছে, আরও কিছু চিন্তাভাবনা নিয়ে আমি এই সমাধানটি নিয়ে এসেছি:

আপনি যেখানে রয়েছেন তার সামনে একটি প্রতিশ্রুতি চয়ন করুন। এটি সম্ভবত একটি শাখা প্রধান হতে পারে। আপনি যদি শাখা ~ 10 এ থাকেন তবে তার পরে "গিট চেকআউট শাখা ~ 9" তারপরে "গিট চেকআউট শাখা ~ 8", তারপরে "গিট চেকআউট শাখা ~ 7" এবং আরও কিছু পেতে পারেন।

আপনার যদি প্রয়োজন হয় তবে সংখ্যা হ্রাস করা কোনও স্ক্রিপ্টে সত্যই সহজ হওয়া উচিত। গিট রেভ-তালিকাকে পার্স করার চেয়ে অনেক সহজ।


দরকারী হিসাবে, এটি পরবর্তী প্রতিশ্রুতি খুঁজে পায় না। এটি বর্তমান কমিটের দিকে হাঁটছে wal
শোওয়ার্ন

1
ঠিক আছে তবে আমি মনে করি আপনি এটি করতে পারেন: " BRANCH=master; git co $BRANCH~$[ $(git rev-list HEAD..$BRANCH | wc -l) - 1 ]" আপনাকে একটি শাখার দিকে যেতে হবে, এর কাছাকাছি কোনও উপায় নেই।
ভন্ট্র্যাপ

8

দুটি ব্যবহারিক উত্তর:

এক সন্তান

@ মাইকেল এর উত্তরের উপর ভিত্তি করে , আমি childআমার মধ্যে উপন্যাসটি হ্যাক করেছি.gitconfig

এটি ডিফল্ট ক্ষেত্রে প্রত্যাশার মতো কাজ করে এবং বহুমুখীও।

# Get the child commit of the current commit.
# Use $1 instead of 'HEAD' if given. Use $2 instead of curent branch if given.
child = "!bash -c 'git log --format=%H --reverse --ancestry-path ${1:-HEAD}..${2:\"$(git rev-parse --abbrev-ref HEAD)\"} | head -1' -"

এটি হেডের বাচ্চাকে (অন্য কোন প্রতিশ্রুতি-ইশ যুক্তি দেওয়া না হলে) বর্তমান শাখার অগ্রভাগের দিকে এক ধাপ অনুসরণ করে (অন্য কোন প্রতিশ্রুতি-ইশ দ্বিতীয় তর্ক হিসাবে না দেওয়া হয়) তা প্রদানের ক্ষেত্রে খেলাপি হয়।

আপনি যদি সংক্ষিপ্ত হ্যাশ ফর্মটি চান তার %hপরিবর্তে ব্যবহার করুন %H

একাধিক বাচ্চা

বিচ্ছিন্ন হেডের সাথে (কোনও শাখা নেই) বা শাখা নির্বিশেষে সমস্ত শিশুকে পেতে:

# For the current (or specified) commit-ish, get the all children, print the first child 
children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $1' -"

সমস্ত বাচ্চাদের মুদ্রণ $1করতে পরিবর্তন করুন $*

আপনি --allকেবল সেই প্রতিশ্রুতি পূর্বপুরুষদেরই প্রদর্শন করতে প্রতিশ্রুতি-ইস্তে পরিবর্তন করতে পারেন - অন্য কথায়, প্রদত্ত প্রতিশ্রুতিটির "দিকনির্দেশে" কেবলমাত্র শিশুদের প্রদর্শন করতে। এটি আপনাকে আউটপুটকে অনেক বাচ্চা থেকে কেবল একের মধ্যে সংকুচিত করতে সহায়তা করতে পারে।


7

কোনও অনন্য "পরবর্তী প্রতিশ্রুতি" নেই। গিটের ইতিহাস হ'ল একটি ডিএজি, এবং একটি লাইন নয়, অনেক কমিটের একটি সাধারণ পিতা বা মাতা থাকতে পারে (শাখা) থাকতে পারে এবং কমিটের একাধিক পিতামাত (মার্জ) থাকতে পারে।

যদি আপনার মনে একটি নির্দিষ্ট শাখা থাকে তবে আপনি এটির লগটি দেখতে পারেন এবং উপস্থিত প্রতিবেদককে তার পিতামাতার হিসাবে তালিকাবদ্ধ করে তা কি দেখতে পারেন।


37
এই যুক্তি দ্বারা কোনও "পূর্ববর্তী প্রতিশ্রুতি" নেই, তবে পিতা বা মাতা প্রাপ্ত করার জন্য প্রচুর বাক্য গঠন রয়েছে।
শোবার্ন

7
@ শ্যাওয়ার্ন: কোনও "পূর্ববর্তী অঙ্গীকার" নেই; <rev>^হ'ল "পিতামাতার প্রতিশ্রুতিবদ্ধ" (মার্জ কমিটের জন্য 'প্রথম অভিভাবক')।
জাকুব নারেবস্কি

6

আমি অনেকগুলি বিভিন্ন সমাধান চেষ্টা করেছি এবং কেউই আমার পক্ষে কাজ করেনি। আমার নিজের সাথে আসতে হবে।

পরবর্তী প্রতিশ্রুতি সন্ধান করুন

function n() {
    git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}

পূর্ববর্তী প্রতিশ্রুতি সন্ধান করুন

function p() {
    git checkout HEAD^1
}

6

আপনার মনে একটি নির্দিষ্ট "গন্তব্য" প্রতিশ্রুতিবদ্ধ না হওয়ার ক্ষেত্রে, তবে পরিবর্তে কোনও শাখায় থাকা শিশু কমিটগুলি দেখতে চান , আপনি এই আদেশটি ব্যবহার করতে পারেন:

git rev-list --children --all | grep ^${COMMIT}

আপনি যদি সমস্ত শিশু এবং নাতি-বাচ্চাদের দেখতে চান তবে আপনাকে rev-list --childrenপুনরাবৃত্তভাবে ব্যবহার করতে হবে , যেমন:

git rev-list --children --all | \
egrep ^\($(git rev-list --children --all | \
           grep ^${COMMIT} | \
           sed 's/ /|/g')\)

(যে সংস্করণটি কেবলমাত্র গ্র্যান্ড-বাচ্চাদের দেয় তারা আরও জটিল sedএবং / অথবা ব্যবহার করবে cut))

পরিশেষে, আপনি log --graphগাছের কাঠামো দেখতে একটি কমান্ডের মধ্যে এটি খাওয়াতে পারেন , এর মতো:

git log --graph --oneline --decorate \
\^${COMMIT}^@ \
$(git rev-list --children --all | \
  egrep ^\($(git rev-list --children --all | \
             grep ^${COMMIT} | \
             sed 's/ /|/g')\))

দ্রষ্টব্য : উপরের কমান্ডগুলি সমস্ত ধরে নিয়েছে যে আপনি যে ${COMMIT}শিশুদের প্রতি আগ্রহী তার প্রতিশ্রুতির কিছু রেফারেন্সের (শাখা, ট্যাগ, শ 1) শেল ভেরিয়েবল সেট করেছেন ।


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

আমার জন্য ${COMMIT}কোনও মন্তব্য নেই, তবে আপনি তার $(git rev-parse HEAD) পরিবর্তে ব্যবহার করতে পারেন
Radon8472

দুঃখিত, সম্পর্কে একটি নোট যুক্ত ${COMMIT}
ম্যাট ম্যাকহেনরি

5

(এটি একটি সদৃশ প্রশ্নের উত্তর হিসাবে শুরু হয়েছিল 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যাতে (যদিও সেখানে কোন সহজ উপায় ভবিষ্যদ্বাণী করা হবে কিনা তা আপনি আগে বা কেএল যুগল পর অপব্যবহার যুগল চেষ্টা করবো এর)।


" আপনি প্রশ্নটিতে যোগ না করা পর্যন্ত সঠিক কোনও উত্তর নেই: বৈশিষ্ট্যটির দিকে___ " এটি একটি খুব ভাল পয়েন্ট। আপনার উত্তরের জন্য ধন্যবাদ.
শোয়ার্ন

4

আমার এই উপন্যাসটি আছে ~/.gitconfig

first-child = "!f() { git log  --reverse --ancestry-path --pretty=%H $1..${2:-HEAD} | head -1; }; f"


কি f()? এবং এটি head -1প্রথম সন্তানের হওয়া দরকার, অন্যথায় এটি কেবল হেডের প্রতিবেদন করবে।
জেরুস

@ জেরুস কারণ এটি কিছু "জটিল" শেল সিনট্যাক্স ব্যবহার করে এবং গিপটি মোড়ানো না থাকলে এটি সনাক্ত করতে পারে না f()। হ্যাঁ, head -1একটি সাহসী অনুমান।

নিস! আমার কাছে ট্যুইক করা: nextref = "!f() { git log --reverse --ancestry-path --pretty=%H $1..HEAD | head -${2:-1} | tail -1; }; f"যাতে আপনি কতটা এগিয়ে, বিকল্পভাবে বেছে নিতে পারেন
জেড খোলা 20'19

2

আমি পরের শিশুটিকে নিম্নলিখিত পদ্ধতিতে সন্ধান করতে পেরেছি:

git log --reverse --children -n1 HEAD (where 'n' is the number of children to show)

1
আমার জন্য এটি প্রথম সন্তানের নয়, এটি বর্তমান প্রতিশ্রুতি দেখায়
Radon8472

2

যদি শিশু কমিট করে কিছু কিছু শাখায় থাকে তবে আপনি ব্যবহার করতে পারেন gitk --all commit^.., যেখানে "প্রতিশ্রুতিবদ্ধ" প্রতিশ্রুতি চিহ্নিতকরণ is উদাহরণস্বরূপ, কমিটের সংক্ষিপ্ত SHA-1 যদি c6661c5 হয় তবে টাইপ করুনgitk --all c6661c5^..

আপনাকে সম্ভবত গিটকের "এসএইএ 1 আইডি:" ঘরে পুরো এসএইচএ -1 প্রবেশ করতে হবে। আপনার সম্পূর্ণ SHA-1 প্রয়োজন হবে, উদাহরণস্বরূপ এটি মাধ্যমে পাওয়া যেতে পারেgit rev-parse c6661c5

বিকল্পভাবে, git rev-list --all --children | grep '^c6661c5883bb53d400ce160a5897610ecedbdc9d'এই প্রতিশ্রুতিবদ্ধ সমস্ত শিশুকে সমন্বিত একটি লাইন তৈরি করবে, সম্ভবত সেখানে কোনও শাখা জড়িত কিনা।


0

প্রতিটি কমিট তার পিতামাতার কাছে একটি পয়েন্টার সঞ্চয় করে (পিতা-মাতা, মার্জ হওয়ার ক্ষেত্রে (মান) প্রতিশ্রুতি)।

সুতরাং, পিতা-মাতার কাছ থেকে কোনও শিশু প্রতিশ্রুতি (যদি থাকে তবে) দেখানোর কোনও উপায় নেই।


প্রতিশ্রুতিবদ্ধতা তার বাচ্চাদের কাছে পয়েন্টার সংরক্ষণ করতে পারে না, কারণ পরবর্তী সময়ে অতিরিক্ত শিশু কমিট করে (ব্রাঞ্চিং পয়েন্ট) যুক্ত করা যায়।
জাকুব নরবস্কি

@ জাকব আমি সত্যিই অনুসরণ করি না সেগুলি পরে যুক্ত করা যাবে না?
শোবার্ন

1
জাকুব: আমি যা বলেছিলাম ঠিক তেমনই। 'প্রতিটি কমিট স্টোর কেবলমাত্র তার পিতামাতার কাছে থাকে' '
লক্ষ্মণ প্রসাদ

@ শ্যাওয়ার্ন: গিটে করা কমিটগুলি অপরিবর্তনীয় (যার জবাবদিহিতার দুর্দান্ত পরিণতি রয়েছে), তাই বাচ্চাদের দিকে নির্দেশ করে "পরে যুক্ত করা হবে না"। এর অন্যতম কারণ হ'ল কমিটের সনাক্তকারী (যেমন "প্যারেন্ট" লিঙ্কগুলিতে ব্যবহৃত) কমিটের বিষয়বস্তুর উপর নির্ভর করে; কেন্দ্রীয় সংখ্যার কর্তৃপক্ষ ছাড়াই বিতরণ ব্যবস্থায় এটিই একমাত্র সমাধান। এছাড়াও কমিটের "শিশুরা" আপনার শাখাগুলির উপর নির্ভর করে এবং এর পরিবর্তে এটি সংগ্রহস্থল থেকে সংগ্রহস্থল থেকে আলাদা হতে পারে (এবং প্রতিলিপিগুলিতে কমিটগুলি একই হয়)।
জাকুব নরবস্কি

4
@ বেকমিংগুরু আমি নীচে ভোট দিয়েছি। এটি সত্য হতে পারে, তবে এটি আমার প্রশ্নের উত্তর দেয় না। প্রশ্নটি হল "গিটে পরবর্তী প্রতিশ্রুতিটি কীভাবে খুঁজে পাব?" এটি "গিট কি তার বাচ্চাদের কাছে একটি পয়েন্টার সঞ্চয় করে না?"
শোবার্ন

0

এই পোস্টটি ( http://www.jayway.com/2015/03/30/using-git-commits-to-drive-a-live-coding-session/#comment-282667 ) যদি এটি করা হয় তবে একটি ঝরঝরে উপায় দেখায় আপনি আপনার প্রতিশ্রুতিবদ্ধ স্ট্যাকের শেষে একটি ভাল সংজ্ঞায়িত ট্যাগ তৈরি করতে পারেন। মূলত git config --global alias.next '!git checkout `git rev-list HEAD..demo-end | tail -1`' যেখানে "ডেমো-এন্ড" শেষ ট্যাগ।


0

বিদ্যমান উত্তরগুলি ধরে নিয়েছে যে আপনি যে শাখাটি সন্ধান করছেন সেটিকে ধারণ করে।

আমার ক্ষেত্রে, আমি যে প্রতিশ্রুতিটি সন্ধান করছিলাম তা কার্যকর হয়নি git rev-list --allকারণ কোনও শাখায় এটি নেই।

আমি gitk --reflogম্যানুয়ালি মাধ্যমে অনুসন্ধান শেষ ।

আপনি যদি প্রতিশ্রুতিতেও আপনার প্রতিশ্রুতি খুঁজে না পান, তবে চেষ্টা করুন:

  • git fsck --full ঝাঁকুনির তালিকা তৈরি করা (যেমন কোনও শাখায় নয়) কমিট করে, বা
  • git fsck --lost-found অন্যান্য উত্তরে কৌশল প্রয়োগের জন্য ঝুঁকির প্রতি ইঙ্গিত করে রেফগুলি তৈরি করা।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.