গিটের সাথে একটি শাখা পয়েন্ট সন্ধান করছেন?


453

আমার কাছে শাখা মাস্টার এবং এ এবং একটি দু'জনের মধ্যে প্রচুর সংশ্লেষের ক্রিয়াকলাপ রয়েছে rep যখন শাখার মাস্টার উপর ভিত্তি করে শাখা A তৈরি করা হয়েছিল তখন আমি কীভাবে আমার সংগ্রহস্থলে প্রতিশ্রুতি পেতে পারি?

আমার সংগ্রহশালাটি মূলত: এর মতো দেখায়:

-- X -- A -- B -- C -- D -- F  (master) 
          \     /   \     /
           \   /     \   /
             G -- H -- I -- J  (branch A)

আমি সংশোধনী এ খুঁজছি, যা git merge-base (--all)খুঁজে পাওয়া যায় না ।


উত্তর:


497

আমি একই জিনিসটি খুঁজছিলাম, এবং আমি এই প্রশ্নটি পেয়েছি। এটি জিজ্ঞাসা করার জন্য আপনাকে ধন্যবাদ!

যাইহোক, আমি দেখা গেছে যে উত্তর আমি এখানে দেখতে বলে মনে হচ্ছে না বেশ উত্তর তোমার জন্য (অথবা যে আমি খুঁজছেন ছিল) জিজ্ঞেস করলেন দিতে - তারা দিতে বলে মনে হচ্ছে Gকমিট পরিবর্তে Aকমিট।

সুতরাং, আমি নীচের গাছটি তৈরি করেছি (কালানুক্রমিক ক্রমে নির্ধারিত অক্ষরগুলি), যাতে আমি জিনিসগুলি পরীক্ষা করতে পারি:

A - B - D - F - G   <- "master" branch (at G)
     \   \     /
      C - E --'     <- "topic" branch (still at E)

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

G: a9546a2 merge from topic back to master
F: e7c863d commit on master after master was merged to topic
E: 648ca35 merging master onto topic
D: 37ad159 post-branch commit on master
C: 132ee2a first commit on topic branch
B: 6aafd7f second commit on master before branching
A: 4112403 initial commit on master

সুতরাং, লক্ষ্য: বি খুঁজে । কিছুটা টিঙ্কিংয়ের পরে এখানে আমি তিনটি উপায় পেয়েছি:


1. চাক্ষুষভাবে, gitk সহ:

আপনার দৃশ্যমানভাবে এটি দেখতে একটি গাছ দেখতে হবে (মাস্টার থেকে দেখা হিসাবে):

মাস্টার থেকে গিটক স্ক্রিন ক্যাপচার

বা এখানে (বিষয় থেকে দেখা হিসাবে):

বিষয় থেকে gitk স্ক্রিন ক্যাপচার

উভয় ক্ষেত্রেই, আমি Bআমার গ্রাফের যে প্রতিশ্রুতিবদ্ধ তা নির্বাচন করেছি । একবার আপনি এটিতে ক্লিক করলে, তার সম্পূর্ণ এসএএলএ গ্রাফের ঠিক নীচে একটি পাঠ্য ইনপুট ক্ষেত্রে উপস্থাপন করা হবে।


2. দৃশ্যমান, কিন্তু টার্মিনাল থেকে:

git log --graph --oneline --all

(সম্পাদনা / সাইড-নোট: যোগ --decorateকরা আকর্ষণীয়ও হতে পারে; এটি শাখার নাম, ট্যাগ ইত্যাদির একটি ইঙ্গিত যোগ করে কারণ নীচের আউটপুটটির ব্যবহার প্রতিফলিত হয় না বলে এটি উপরের কমান্ড-লাইনে যুক্ত না করে))

যা দেখায় (ধরে নিচ্ছে git config --global color.ui auto):

গিট লগের আউটপুট - অনুচ্ছেদ --অনলাইন - সমস্ত

বা, সরাসরি পাঠ্যে:

* a9546a2 বিষয় থেকে মাস্টারে ফিরে যাওয়া
| \  
| * 648ca35 বিষয়টিতে মাস্টার মার্জ করা হচ্ছে
| | \  
| * | 132ee2a প্রথম বিষয় শাখায় প্রতিশ্রুতিবদ্ধ
* | | e7c863d মাস্টারকে বিষয়ের সাথে সংযুক্ত হওয়ার পরে মাস্টার প্রতি প্রতিশ্রুতিবদ্ধ
| | /  
| / |   
* | 37ad159 পোস্ট শাখা মাস্টার উপর প্রতিশ্রুতিবদ্ধ
| /  
* শাফায়ণের আগে মাস্টার সম্পর্কে 6aafd7f দ্বিতীয় প্রতিশ্রুতিবদ্ধ
* 4112403 মাস্টার উপর প্রাথমিক প্রতিশ্রুতি

উভয় ক্ষেত্রেই, আমরা 6aafd7f সর্বনিম্ন সাধারণ বিন্দু হিসাবে প্রতিশ্রুতিটি দেখতে পাই, যেমন Bআমার গ্রাফে বা Aআপনার ক্ষেত্রে।


৩. শেল ম্যাজিক সহ:

আপনি উপরোক্ত মত কিছু চাইছিলেন কিনা বা আপনার একটি প্রশ্নের মধ্যে নির্দিষ্ট করে দেবেন না বা এমন একটি একক আদেশ যা আপনাকে কেবল একটি পুনর্বিবেচনা দেবে এবং অন্য কিছুই নয়। ঠিক আছে, এখানে পরে:

diff -u <(git rev-list --first-parent topic) \
             <(git rev-list --first-parent master) | \
     sed -ne 's/^ //p' | head -1
6aafd7ff98017c816033df18395c5c1e7829960d

যা আপনি আপনার ~ / .gitconfig হিসাবে এই হিসাবে রাখতে পারেন (দ্রষ্টব্য: ট্রেলিং ড্যাশ গুরুত্বপূর্ণ; এতে মনোযোগ আনার জন্য ব্রায়ানকে ধন্যবাদ ) :

[alias]
    oldest-ancestor = !zsh -c 'diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne \"s/^ //p\" | head -1' -

যা নিম্নলিখিত (উদ্ধৃতি দিয়ে সংশ্লেষিত) কমান্ড-লাইনের মাধ্যমে করা যেতে পারে:

git config --global alias.oldest-ancestor '!zsh -c '\''diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne "s/^ //p" | head -1'\'' -'

দ্রষ্টব্য: zshঠিক যেমনটি সহজেই হতে পারত bashতবে কার্যকর shহবে না - <()সিনট্যাক্সটি ভ্যানিলাতে নেই sh। (এই পৃষ্ঠার অন্য উত্তরের মন্তব্যে আমাকে সচেতন করার জন্য @ কঙ্কি, আপনাকে আবারও ধন্যবাদ!)

দ্রষ্টব্য: উপরের বিকল্প সংস্করণ:

ধন্যবাদ liori জন্য ইশারা যে উপরোক্ত অধ: পতিত হত্তয়া পারা গেলে অভিন্ন শাখা তুলনা এবং একটি বিকল্প পরিবর্তন রূপ, যার মিশ্রণ থেকে sed ফর্ম সরিয়ে ফেলা নিয়ে আসছে, এবং এই "নিরাপদ" (অর্থাত এটা ফলে ফেরৎ তোলে (যেমন, সর্বাধিক সাম্প্রতিক কমিট) এমনকি আপনি যখন মাস্টারকে মাস্টারের সাথে তুলনা করেন):

.Git-config লাইন হিসাবে:

[alias]
    oldest-ancestor = !zsh -c 'diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | head -1' -

শেল থেকে:

git config --global alias.oldest-ancestor '!zsh -c '\''diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | head -1'\'' -'

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


সুতরাং, এটাই আমি [এবং লাইওরি] নিয়ে এসেছি। এটা আমার জন্য কাজ বলে মনে হচ্ছে। এটি অতিরিক্ত অতিরিক্ত কয়েকটি উপকরণেরও অনুমতি দেয় যা সহজে প্রমাণিত হতে পারে:

git config --global alias.branchdiff '!sh -c "git diff `git oldest-ancestor`.."'
git config --global alias.branchlog '!sh -c "git log `git oldest-ancestor`.."'

শুভ গিট-ইনগ!


5
ধন্যবাদ লিন্ডস, শেল বিকল্পটি এমন পরিস্থিতিতেগুলির জন্য দুর্দান্ত যেখানে আপনি দীর্ঘ চলমান রক্ষণাবেক্ষণ শাখার শাখা পয়েন্টটি সন্ধান করতে চান। আপনি যখন অতীতের হাজার অনুসারী হতে পারে এমন কোনও সংশোধন সন্ধান করছেন, তখন ভিজ্যুয়াল বিকল্পগুলি সত্যই এটি কাটবে না। * 8 ')
মার্ক বুথ

4
আপনার তৃতীয় পদ্ধতিতে আপনি এর উপর নির্ভর করেন যে প্রসঙ্গটি প্রথম অপরিবর্তিত রেখাটি দেখায়। এটি নির্দিষ্ট প্রান্তের ক্ষেত্রে ঘটবে না বা যদি আপনার কিছুটা আলাদা প্রয়োজন হয় (যেমন: আমার ইতিহাসের মধ্যে একটি হ'ল - প্রথম-পিতামাতার, এবং আমি কোনও স্ক্রিপ্টে এই পদ্ধতিটি ব্যবহার করছি যা কখনও কখনও একইরকম ব্যবহার করতে পারে উভয় পক্ষের শাখা)। আমি এটা নিরাপদ ব্যবহার পাওয়া diffযদি-তারপর-অন্য মোড এবং মুছে ফেলুন পরিবর্তিত 'S / বড় যথেষ্ট প্রসঙ্গ থাকার দ্বারা তার পরিবর্তে আউটপুট বেড়ে চলেছে থেকে লাইন মুছে ফেলা হয়েছে।: diff --old-line-format='' --new-line-format='' <(git rev-list …) <(git rev-list …)|head -1
লাইওরি

3
git log -n1 --format=format:%H $(git log --reverse --format=format:%H master..topic | head -1)~পাশাপাশি কাজ করবে, আমি মনে করি
টোবিয়াস শুল্টে

4
@ জাকুবনারাইবস্কি: আপনার কাছে এই গাছের জন্য git merge-base --fork-point ...কমিট বি (কমিট 6aafd7f) দেওয়ার কোনও উপায় আছে ? আপনি এটি পোস্ট করার সময় আমি অন্যান্য স্টাফ নিয়ে ব্যস্ত ছিলাম, এবং এটি বেশ ভাল লাগছিল, তবে শেষ পর্যন্ত আমি এটি চেষ্টা করেছি, এবং আমি এটি কাজ করতে পাচ্ছি না ... আমি হয় আরও সাম্প্রতিক কিছু পেয়েছি, বা কেবল একটি নীরব ব্যর্থতা (কোনও ত্রুটি নেই) বার্তা, কিন্তু প্রস্থান অবস্থা 1), মত আর্গুমেন্ট চেষ্টা git co master; git merge-base --fork-point topic, git co topic; git merge-base --fork-point master, git merge-base --fork-point topic master(হয় চেকআউট জন্য), ইত্যাদি অনেক কিছু আমার ভুল করছেন বা অনুপস্থিত করছি কি?
Lindes

25
@ জাকুবনারাইবস্কি @ লিন্ডস রিফ্লগের --fork-pointউপর ভিত্তি করে তৈরি হয়েছে, তাই আপনি যদি স্থানীয়ভাবে পরিবর্তনগুলি করেন তবে এটি কাজ করবে। তারপরেও, রিফ্লগ এন্ট্রিগুলির মেয়াদ শেষ হতে পারে। এটি দরকারী তবে নির্ভরযোগ্য নয় not
ড্যানিয়েল লুবারভ

131

আপনি খুঁজছেন হতে পারে git merge-base:

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


10
--all" git merge-base"
-র

10
এটি আসল প্রশ্নের উত্তর দেয় না, তবে বেশিরভাগ লোকেরা আরও সহজ প্রশ্ন জিজ্ঞাসা করে যার জন্য এটি উত্তর :)
ফিলিপিসি

6
তিনি বলেছিলেন যে তিনি গিট মার্জ-বেসের ফলাফল চান না
টম ট্যানার

9
@ টমট্যানার: আমি কেবল প্রশ্নের ইতিহাস দেখেছি এবং git merge-baseআমার উত্তর পোস্ট হওয়ার প্রায় পাঁচ ঘন্টা পরে (সম্ভবত আমার উত্তরের প্রতিক্রিয়াতে) এই নোটটি অন্তর্ভুক্ত করার জন্য মূল প্রশ্নটি সম্পাদিত হয়েছিল । তবুও, আমি এই উত্তরটি যেমন রাখব তেমনি এটি এখনও কারও পক্ষে কার্যকর হতে পারে যারা এই প্রশ্নটি অনুসন্ধানের মাধ্যমে খুঁজে পান।
গ্রেগ হিউগিল

আমি বিশ্বাস করি যে আপনি মার্জ-বেস - সমস্ত থেকে ফলাফলগুলি ব্যবহার করতে পারেন এবং তারপরে তালিকা থেকে প্রাচীনতম সাধারণ পূর্বপুরুষের সন্ধানের জন্য মার্জ-বেস --is-পূর্বপুরুষ ব্যবহার করে রিটার্ন কমিটের তালিকাটি সন্ধান করতে পারেন তবে এটি সহজতম উপায় নয় ।
ম্যাট_জি

42

আমি git rev-listএই ধরণের জিনিস জন্য ব্যবহার করেছি । উদাহরণস্বরূপ, ( 3 টি বিন্দু নোট করুন )

$ git rev-list --boundary branch-a...master | grep "^-" | cut -c2-

শাখা পয়েন্ট থুতু হবে। এখন, এটি নিখুঁত নয়; যেহেতু আপনি মাস্টারকে কয়েক বার শাখায় একীভূত করেছেন, এর ফলে কয়েকটি সম্ভাব্য শাখা পয়েন্টগুলি বিভক্ত হয়ে যাবে (মূলত, মূল শাখা পয়েন্ট এবং তারপরে প্রতিটি পয়েন্ট যেখানে আপনি মাস্টারকে শাখাগুলিতে A তে বিভক্ত করেছিলেন)। যাইহোক, এটি কমপক্ষে সম্ভাবনাগুলি সঙ্কুচিত করা উচিত।

আমি এই কমান্ডটি আমার এলিয়াসগুলিতে এইভাবে যুক্ত করেছি ~/.gitconfig:

[alias]
    diverges = !sh -c 'git rev-list --boundary $1...$2 | grep "^-" | cut -c2-'

সুতরাং আমি এটি হিসাবে কল করতে পারেন:

$ git diverges branch-a master

দ্রষ্টব্য: এটি সাধারণ পূর্বপুরুষের চেয়ে শাখায় প্রথম প্রতিশ্রুতি দেবে বলে মনে হয়। (যেমন এটি মূল প্রশ্নের গ্রাফের Gপরিবর্তে দেয় A)) আমার কাছে একটি উত্তর পাওয়া যায় Aযা আমি উপস্থিত পোস্ট করব।
লিন্ডেস

@ লিন্ডস: এটি চেষ্টা করেছি প্রতিটি ক্ষেত্রে এটি সাধারণ পূর্বপুরুষকে দেয়। আপনার এমন উদাহরণ আছে যেখানে তা নেই?
মিপাদি

হ্যাঁ. ইন আমার উত্তর (যা একটি রেপো আপনি ক্লোন করতে পারেন একটি লিঙ্ক আছে; git checkout topicএবং তারপর সাথে এই চালানোর topicস্থানে branch-a), এটা তালিকা 648ca357b946939654da12aaf2dc072763f3caeeএবং 37ad15952db5c065679d7fc31838369712f0b338- উভয় 37ad159এবং 648ca35বর্তমান শাখা ancestory হয় (আধুনিক বর্তমান প্রধান হয়ে topic), তবে উভয়ই শাখা প্রশাখার আগে ঘটেনি। আপনি কিছু ভিন্ন পেতে?
লিন্ডেস

@ লিন্ডস: আমি আপনার রেপো ক্লোন করতে অক্ষম ছিলাম (সম্ভবত কোনও অনুমতি সম্পর্কিত সমস্যা?)
মিপাদি

ওহো দুঃখিত! আমাকে অবগত করার জন্য ধন্যবাদ. আমি গিট আপডেট-সার্ভার-তথ্য চালাতে ভুলে গেছি। এখনই যাওয়া ভাল হবে। :)
লিন্ডস

31

আপনি যদি সংক্ষিপ্ত আদেশগুলি পছন্দ করেন,

গিট রেভ-লিস্ট $ (গিট রেভ-লিস্ট - প্রথম-পিতা-মাতা ^ শাখা_নাম মাস্টার | লেজ -n1) ^^! 

এখানে একটি ব্যাখ্যা।

নীচের কমান্ডটি শাখা_নাম তৈরি হওয়ার পরে মাষ্টারে সমস্ত কমিটের তালিকা আপনাকে দেয়

গিট রেভ-তালিকা - প্রথম-পিতামাতার ^ শাখা_নাম মাস্টার 

যেহেতু আপনি কেবলমাত্র সেই প্রতিশ্রুতিগুলির প্রাথমিকতম যত্ন করছেন আপনি আউটপুটটির শেষ লাইনটি চান:

গিট রেভ-তালিকা ^ শাখা_নাম - প্রথম-পিতামাতার মাস্টার লেজ -n1

নিকটতম অভিভাবক কমিট যে "branch_name" এর একটি পূর্বপুরুষ নয় সংজ্ঞা দ্বারা হয়, মধ্যে "branch_name," এবং "মাস্টার" এ, যেহেতু এটা কিছু একজন পূর্বপুরুষ "-এর মাস্টার।" সুতরাং আপনি উভয় শাখায় যে প্রাথমিক প্রতিশ্রুতি পেয়েছি।

আদেশ

গিট রেভ-লিস্ট কমিট ^^!

পিতামাতার প্রতিশ্রুতি রেফারেন্স দেখানোর একমাত্র উপায়। আপনি ব্যবহার করতে পারেন

গিট লগ -1 কমিট ^

বা যাই হোক না কেন.

PS: পূর্বপুরুষের আদেশ অপ্রাসঙ্গিক যে যুক্তিতে আমি একমত নই। এটি নির্ভর করে তুমি কি চাও। উদাহরণস্বরূপ, এই ক্ষেত্রে

_সি 1___ সি 2_______ মাস্টার
  \ X _XXXXX_ শাখা A (এক্সগুলি মাস্টার এবং এ এর ​​মধ্যে নির্বিচারে ক্রস ওভারগুলি বোঝায়)
   \ _____ / শাখা বি

এটি "ব্রাঞ্চিং" কমিট হিসাবে সি 2 আউটপুটকে নিখুঁত করে তোলে। এটি তখন হয় যখন বিকাশকারী "মাস্টার" থেকে বের হন। তিনি যখন শাখা প্রশাখা করলেন তখন শাখা "বি" তার শাখায় একীভূতও হয়নি! এই পোস্টে সমাধান কি এই দেয়।

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


3
এটি এখন পর্যন্ত সবচেয়ে পরিষ্কার উত্তর, আসুন এটি শীর্ষে ভোট দিন। প্রস্তাবিত সম্পাদনা: git rev-list commit^^!সরল করা যেতে পারেgit rev-parse commit^
রাসেল ডেভিস

এই উত্তর হওয়া উচিত!
ত্রয়োদশ

2
এই উত্তরটি দুর্দান্ত, আমি কেবলমাত্র এর সাথে প্রতিস্থাপন git rev-list --first-parent ^branch_name masterকরেছি git rev-list --first-parent branch_name ^masterকারণ যদি মাস্টার শাখাটি অন্য শাখার চেয়ে 0 কমিট করে (এটির কাছে দ্রুত এগিয়ে যায়) তবে কোনও আউটপুট তৈরি হবে না। আমার সমাধান সহ, মাস্টার কঠোরভাবে এগিয়ে থাকলে কোনও আউটপুট তৈরি করা হয় না (অর্থাত্ শাখাটি পুরোপুরি একত্রীকরণ করা হয়েছে), যা আমি চাই।
মাইকেল শ্মিয়ের

3
আমি পুরোপুরি কিছু অনুপস্থিত না হলে এটি কাজ করবে না। উদাহরণ শাখায় উভয় দিকে মার্জ রয়েছে। দেখে মনে হচ্ছে আপনি এটিকে বিবেচনায় নেওয়ার চেষ্টা করেছেন, তবে আমি বিশ্বাস করি এটি আপনার উত্তরকে ব্যর্থ করে দেবে। git rev-list --first-parent ^topic masterশুধুমাত্র একবারে মার্জ হওয়ার পরে আপনাকে প্রথম প্রতিশ্রুতিতে ফিরিয়ে masterনিয়ে যাবে topic(যদি তা বিদ্যমান থাকে)।
জেরি

1
@ জেরি আপনি সঠিক, এই উত্তরটি আবর্জনা; উদাহরণস্বরূপ, যে ক্ষেত্রে একটি ব্যাকভারজ সবেমাত্র ঘটেছে (মাস্টারকে বিষয়টিতে একীভূত করা হয়েছে) এবং তার পরে মাস্টারের কোনও নতুন কমিট নেই, প্রথম গিট রেভ-লিস্ট - ফার্স্ট-প্যারেন্ট কমান্ড কিছুতেই আউটপুট দেয় না।
TamaMcGlinn

19

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

লগ

প্রদত্ত কাঠামো সহ একটি সংগ্রহস্থল তৈরি করা, আমরা এর গিট লগ পাই:

$ git --no-pager log --graph --oneline --all --decorate
* b80b645 (HEAD, branch_A) J - Work in branch_A branch
| *   3bd4054 (master) F - Merge branch_A into branch master
| |\  
| |/  
|/|   
* |   a06711b I - Merge master into branch_A
|\ \  
* | | bcad6a3 H - Work in branch_A
| | * b46632a D - Work in branch master
| |/  
| *   413851d C - Merge branch_A into branch master
| |\  
| |/  
|/|   
* | 6e343aa G - Work in branch_A
| * 89655bb B - Work in branch master
|/  
* 74c6405 (tag: branch_A_tag) A - Work in branch master
* 7a1c939 X - Work in branch master

আমার একমাত্র সংযোজন, ট্যাগটি যা এটি শাখাটি তৈরি করেছিল সেই বিন্দুটি সম্পর্কে এটি স্পষ্ট করে তোলে এবং এইভাবে আমরা যে প্রতিশ্রুতিটি সন্ধান করতে চাই।

সমাধান যা কাজ করে

লিন্ডেস সরবরাহ করে এমন একমাত্র সমাধান যা সঠিকভাবে ফিরে আসে A:

$ diff -u <(git rev-list --first-parent branch_A) \
          <(git rev-list --first-parent master) | \
      sed -ne 's/^ //p' | head -1
74c6405d17e319bd0c07c690ed876d65d89618d5

হিসাবে চার্লস বেইলি যদিও পয়েন্ট আউট, এই সমাধান খুব ভঙ্গুর হয়।

আপনি যদি branch_Aমধ্যে masterএবং তারপর মার্জ masterমধ্যে branch_Aকরে হস্তক্ষেপ ছাড়া তারপর lindes 'সমাধান শুধুমাত্র আপনি দেয় সাম্প্রতিকতম প্রথম divergance

এর অর্থ হল যে আমার কর্মপ্রবাহের জন্য, আমি মনে করি যে দীর্ঘ চলমান শাখাগুলির শাখা পয়েন্টটি ট্যাগ করার সাথে আমি লেগে যাব, যেহেতু আমি গ্যারান্টি দিতে পারি না যে সেগুলি পরে নির্ভরযোগ্যভাবে পাওয়া যাবে।

এই সত্যিই সব নিচে boils করার gitগুলি কি অভাব hgআহ্বান নামে শাখা । ব্লগার jhw এই আহ্বান বংশানুক্রমিক বনাম পরিবার তার প্রবন্ধে কেন আমি ভালো লেগেছে Mercurial গীত চেয়ে আরো এবং তার ফলো-আপ নিবন্ধ আরো Mercurial উপর বনাম গীত (গ্রাফ সঙ্গে!) । আমি লোকেদের তাদের পড়ার জন্য সুপারিশ করব যাতে কিছু পার্থিব রূপান্তরকারীরা শাখাগুলির নাম না রাখায় কেন মিস করে git

যে সমাধানগুলি কাজ করে না

মিপাডি দ্বারা প্রদত্ত সমাধানটি দুটি উত্তর দেয় Iএবং C:

$ git rev-list --boundary branch_A...master | grep ^- | cut -c2-
a06711b55cf7275e8c3c843748daaa0aa75aef54
413851dfecab2718a3692a4bba13b50b81e36afc

গ্রেগ হিউগিল প্রদত্ত সমাধানটি ফিরে আসবেI

$ git merge-base master branch_A
a06711b55cf7275e8c3c843748daaa0aa75aef54
$ git merge-base --all master branch_A
a06711b55cf7275e8c3c843748daaa0aa75aef54

কার্ল দ্বারা প্রদত্ত সমাধানটি ফিরে আসে X:

$ diff -u <(git log --pretty=oneline branch_A) \
          <(git log --pretty=oneline master) | \
       tail -1 | cut -c 2-42
7a1c939ec325515acfccb79040b2e4e1c3e7bbe5

এই পান্ডুলিপি

mkdir $1
cd $1
git init
git commit --allow-empty -m "X - Work in branch master"
git commit --allow-empty -m "A - Work in branch master"
git branch branch_A
git tag branch_A_tag     -m "Tag branch point of branch_A"
git commit --allow-empty -m "B - Work in branch master"
git checkout branch_A
git commit --allow-empty -m "G - Work in branch_A"
git checkout master
git merge branch_A       -m "C - Merge branch_A into branch master"
git checkout branch_A
git commit --allow-empty -m "H - Work in branch_A"
git merge master         -m "I - Merge master into branch_A"
git checkout master
git commit --allow-empty -m "D - Work in branch master"
git merge branch_A       -m "F - Merge branch_A into branch master"
git checkout branch_A
git commit --allow-empty -m "J - Work in branch_A branch"

আমি সন্দেহ করি গিট সংস্করণ এটির সাথে অনেক পার্থক্য করে তবে:

$ git --version
git version 1.7.1

উদাহরণ সংগ্রহস্থলের স্ক্রিপ্টের আরও কমপ্যাক্ট উপায় দেখানোর জন্য চার্লস বেলিকে ধন্যবাদ জানাই।


2
কার্ল দ্বারা সমাধান ফিক্স করা সহজ: diff -u <(git rev-list branch_A) <(git rev-list master) | tail -2 | head -1। রেপো তৈরির জন্য নির্দেশাবলী সরবরাহ করার জন্য ধন্যবাদ :)
ফেলিপিসি

আমি মনে করি আপনার অর্থ "কার্ল প্রদত্ত সমাধানের পরিষ্কার হওয়া প্রকরণটি এক্স প্রদান করে"। আসলটি সূক্ষ্মভাবে কাজ করেছে এটি কেবল কুৎসিত :-)
কার্ল

না, আপনার আসলটি ভাল কাজ করে না। মঞ্জুর, প্রকরণটি আরও খারাপ কাজ করে। তবে বিকল্পটি যুক্ত করে - টোপো-অর্ডার আপনার সংস্করণটিকে কাজ করে :)
ফেলিপিসি

@ ফিলিপেক - চার্লস বেলির উত্তর সম্পর্কে আমার চূড়ান্ত মন্তব্য দেখুন । হায়রে আমাদের চ্যাট (এবং এইভাবে পুরানো সব মন্তব্য) এখন মুছে ফেলা হয়েছে। সময় পেলেই আমার উত্তরটি আপডেট করার চেষ্টা করব।
মার্ক বুথ

মজাদার. আমি ধরণের টপোলজিকালটি ডিফল্ট বলে মনে করি। বোকা আমাকে :-)
কার্ল

10

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

গিটে, শাখাগুলি ইতিহাসের বিভাগগুলির টিপসের কেবলমাত্র বর্তমান নাম। তাদের সত্যই শক্তিশালী পরিচয় নেই।

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

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

git commit --allow-empty -m root # actual branch commit
git checkout -b branch_A
git commit --allow-empty -m  "branch_A commit"
git checkout master
git commit --allow-empty -m "More work on master"
git merge -m "Merge branch_A into master" branch_A # identified as branch point
git checkout branch_A
git merge --ff-only master
git commit --allow-empty -m "More work on branch_A"
git checkout master
git commit --allow-empty -m "More work on master"

এই কৌশলটিও নীচে নেমে আসে যদি পিতামাতার বিপরীত হয়ে একটি সংহত মার্জ তৈরি করা হয় (উদাহরণস্বরূপ, অস্থায়ী শাখাটি মাস্টারে একটি পরীক্ষা মার্জ করার জন্য ব্যবহৃত হত এবং তারপরে আরও তৈরি করার জন্য বৈশিষ্ট্য শাখায় দ্রুত-ফরওয়ার্ড করা হয়)।

git commit --allow-empty -m root # actual branch point
git checkout -b branch_A
git commit --allow-empty -m  "branch_A commit"
git checkout master
git commit --allow-empty -m "More work on master"
git merge -m "Merge branch_A into master" branch_A # identified as branch point
git checkout branch_A
git commit --allow-empty -m "More work on branch_A"

git checkout -b tmp-branch master
git merge -m "Merge branch_A into tmp-branch (master copy)" branch_A
git checkout branch_A
git merge --ff-only tmp-branch
git branch -d tmp-branch

git checkout master
git commit --allow-empty -m "More work on master"


3
ধন্যবাদ চার্লস, আপনি আমাকে বিশ্বাস করেছেন, যদি আমি শাখাটি মূলত যেখানে ডাইভার্ট করে তুলেছিল সে বিষয়টি জানতে চাই, তবে আমি এটি ট্যাগ করতে যাচ্ছি। আমি সত্যিই যে ইচ্ছুক gitএকটি সমতুল্য ছিল hg, 's শাখা নামে এটা দীর্ঘ বসবাস করতেন রক্ষণাবেক্ষণ শাখা পরিচালনার হবে তাই অনেক সহজ।
মার্ক বুথ

1
"গিট-এ, শাখাগুলি কেবল ইতিহাসের বিভাগগুলির টিপসের বর্তমান নাম। সত্যই তাদের দৃ strong় পরিচয় নেই say" এটি বলতে একটি ভীতিকর বিষয় এবং এটি আমাকে বোঝায় যে আমাকে গিট শাখাগুলি আরও ভালভাবে বুঝতে হবে - ধন্যবাদ (+ 1)
ডাবল্বডেড

একটি শাখার ইতিহাসে নামকরণ করা শাখাটি ব্রাঞ্চ বন্ধ করার আগে একটি শাখা এবং মার্জ করা হয়েছিল এবং দুটি নামক শাখার মধ্যবর্তী শাখা একই দেখায়। হাঁ। +1 টি।
ব্যবহারকারী 1071847

5

কেমন যেন কিছু

git log --pretty=oneline master > 1
git log --pretty=oneline branch_A > 2

git rev-parse `diff 1 2 | tail -1 | cut -c 3-42`^

এইটা কাজ করে. এটি সত্যই জটিল কিন্তু এটিই আমি খুঁজে পেয়েছি যা বাস্তবে কাজটি করে।
গ্যারিও

1
গিট ওরফে সমতুল্য: diverges = !bash -c 'git rev-parse $(diff <(git log --pretty=oneline ${1}) <(git log --pretty=oneline ${2}) | tail -1 | cut -c 3-42)^'(কোনও অস্থায়ী ফাইল নেই)
15:56

@ কননি: ওহ, বাহ - আমি কখনই <(ফু) বাক্য গঠন দেখিনি ... এটি অবিশ্বাস্যভাবে দরকারী, ধন্যবাদ! (
Zsh

এটি আমার পূর্বপুরুষের চেয়ে শাখায় প্রথম প্রতিশ্রুতি দেয় বলে মনে হয়। (অর্থাত্ এটি মূল প্রশ্নের গ্রাফের Gপরিবর্তে দেয় A)) আমি মনে করি আমি একটি উত্তর পেয়েছি, যা আমি বর্তমানে পোস্ট করব।
লিন্ডস

'গিট লগ - ব্যাখ্যা = অনলাইন' এর পরিবর্তে আপনি কেবল 'গিট রেভ-তালিকা' করতে পারেন, তারপরে আপনি কাটাটি এড়িয়ে যেতে পারেন, তদুপরি, এটি পিতামাতাকে বিভ্রান্তির বিন্দুটির প্রতিশ্রুতি দেয়, সুতরাং কেবল লেজ -2 | শিরোনাম 1. সুতরাং:diff -u <(git rev-list branch_A) <(git rev-list master) | tail -2 | head -1
FelipC

5

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

পরিবর্তে, আমি একটি ভিন্ন পদ্ধতির অনুসরণ করেছি, এই ভিত্তিতে যে উভয় শাখাই প্রচুর ইতিহাস ভাগ করে নিয়েছে, শাখার আগে ঠিক সমস্ত ইতিহাস 100% একই, সুতরাং ফিরে যাওয়ার পরিবর্তে, আমার প্রস্তাবটি এগিয়ে যাওয়ার বিষয়ে (1 ম থেকে) প্রতিশ্রুতিবদ্ধ), উভয় শাখায় 1 ম পার্থক্য খুঁজছেন। শাখা পয়েন্টটি হবে, সহজভাবে, প্রথম পার্থক্যটির পিতামাতাকে পাওয়া যাবে।

প্রস্তুতিতে:

#!/bin/bash
diff <( git rev-list "${1:-master}" --reverse --topo-order ) \
     <( git rev-list "${2:-HEAD}" --reverse --topo-order) \
--unified=1 | sed -ne 's/^ //p' | head -1

এবং এটি আমার সমস্ত সাধারণ কেস সমাধান করছে। অবশ্যই সীমান্তগুলি coveredাকা নেই তবে ... সিওও :-)


ডিফার << লেজ -1
আলেকজান্ডার বার্ড

আমি এটি দ্রুত (2-100x) পেয়েছি:comm --nocheck-order -1 -2 <(git rev-list --reverse --topo-order topic) <(git rev-list --reverse --topo-order master) | head -1
আন্দ্রে নেখুলাউ

4

আমার সম্প্রতি এই সমস্যাটিও সমাধান করা দরকার এবং এর জন্য রুবি স্ক্রিপ্টটি লিখে শেষ করেছি: https://github.com/vaneyckt/git-find-branching- point


এটি কাজ করছে না, গ্রিট "আনপ্যাক_বজেক্ট_হেডার_জেন্টালি" এ ব্যর্থ হয়েছে এবং বজায় নেই is
পুচু

4

অনেক গবেষণা এবং আলোচনার পরে, এটি স্পষ্ট যে এমন কোনও ম্যাজিক বুলেট নেই যা সমস্ত পরিস্থিতিতে কাজ করবে, অন্তত গিটের বর্তমান সংস্করণে নয়।

সে কারণেই আমি কয়েকটি প্যাচ লিখেছিলাম যা একটি tailশাখার ধারণা যুক্ত করে । প্রতিবার একটি শাখা তৈরি করা হয়, মূল পয়েন্টের একটি পয়েন্টার খুব তৈরি হয়, tailরেফ। এই শাখাটি প্রতিবার শাখাটি পুনর্বাসিত হওয়ার পরে আপডেট হয়।

দেভেল শাখার শাখা পয়েন্টটি খুঁজতে, আপনাকে যা করতে হবে তা হ'ল devel@{tail}এটি।

https://github.com/felipec/git/commits/fc/tail


1
একমাত্র স্থিতিশীল সমাধান হতে পারে। আপনি কি দেখেছেন যে এটি গিটে যেতে পারে কিনা? আমি একটি টানার অনুরোধ দেখিনি।
আলেকজান্ডার ক্লিমেটসেক

@ আলেকজান্দার ক্লাইমেটসেক আমি প্যাচগুলি প্রেরণ করি নি, এবং আমি মনে করি না যে সেগুলি গৃহীত হবে। তবে, আমি একটি ভিন্ন পদ্ধতি চেষ্টা করেছি: একটি "আপডেট-ব্রাঞ্চ" হুক যা খুব অনুরূপ কিছু করে। এইভাবে ডিফল্টভাবে গিট কিছুই করতে পারে না, তবে আপনি হুকটি লেজের শাখাকে আপডেট করতে সক্ষম করতে পারবেন। যদিও আপনার কাছে ডেভেল @ {টেল} না থাকলেও এর বদলে লেজ / ডেভেল ব্যবহার করা এত খারাপ হবে না।
ফেলিপিসি

3

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

এটি এখানে উল্লিখিত সমস্ত ভান্ডারগুলিতে কাজ করে এবং আমি এমনকি কিছু কৌতূহলকে সম্বোধন করেছি যা মেলিং তালিকায় উদ্ভূত হয়েছিল । আমি এর জন্য পরীক্ষাও লিখেছি

find_merge ()
{
    local selection extra
    test "$2" && extra=" into $2"
    git rev-list --min-parents=2 --grep="Merge branch '$1'$extra" --topo-order ${3:---all} | tail -1
}

branch_point ()
{
    local first_merge second_merge merge
    first_merge=$(find_merge $1 "" "$1 $2")
    second_merge=$(find_merge $2 $1 $first_merge)
    merge=${second_merge:-$first_merge}

    if [ "$merge" ]; then
        git merge-base $merge^1 $merge^2
    else
        git merge-base $1 $2
    fi
}

3

নিম্নলিখিত কমান্ডটি কমিট এ এর ​​এসএএএ 1 প্রকাশ করবে

git merge-base --fork-point A


এটি যদি না পিতামাতা এবং শিশু শাখাগুলির মধ্যে একে অপরের মধ্যে অন্তর্বর্তী একত্রীকরণ থাকে।
নওফাল

2

আমি কিছুটা আনন্দ পেয়ে যাচ্ছি বলে মনে হচ্ছে

git rev-list branch...master

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

git rev-list -1 `git rev-list branch...master | tail -1`^

আমার পক্ষে কাজ করার জন্য মনে হচ্ছে এবং এর জন্য আলাদাকরণের প্রয়োজন নেই এবং এগুলি (যা আমাদের কাছে সেই সংস্করণটি পৃথক নয় বলে সহায়ক)

সংশোধন: আপনি মাস্টার শাখায় থাকলে এটি কাজ করে না, তবে আমি কোনও স্ক্রিপ্টে এটি করছি যাতে সমস্যা কম হয়


2

ব্রাঞ্চিং পয়েন্ট থেকে কমিটস খুঁজতে, আপনি এটি ব্যবহার করতে পারেন।

git log --ancestry-path master..topicbranch

এই আদেশটি প্রদত্ত উদাহরণটিতে আমার পক্ষে কাজ করে না। অনুগ্রহ করে কমিট রেঞ্জের পরামিতি হিসাবে আপনি কী সরবরাহ করবেন?
জেস্পার রেন-জেনসেন

2

কখনও কখনও এটি কার্যকরভাবে অসম্ভব (যেখানে অতিরিক্ত তথ্য পাওয়ার ক্ষেত্রে আপনি ভাগ্যবান হতে পারেন তার কিছু ব্যতিক্রম সহ) এবং সমাধানগুলি এখানে কাজ করবে না।

গিট রেফারির ইতিহাস সংরক্ষণ করে না (যার মধ্যে শাখা রয়েছে)। এটি কেবলমাত্র প্রতিটি শাখার (মাথা) বর্তমান অবস্থান সংরক্ষণ করে। এর অর্থ আপনি সময়ের সাথে সাথে গিটে কিছু শাখার ইতিহাস হারাতে পারেন। আপনি যখনই উদাহরণস্বরূপ শাখা করবেন, ততক্ষনে এটি হ'ল কোন শাখাটি আসল। সমস্ত শাখা হ'ল:

git checkout branch1    # refs/branch1 -> commit1
git checkout -b branch2 # branch2 -> commit1

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

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

এই ধারণাটি মানবিকভাবে প্রত্যাশা করে:

After branch:
       C1 (B1)
      /
    -
      \
       C1 (B2)
After first commit:
       C1 (B1)
      /
    - 
      \
       C1 - C2 (B2)

এটি আসলে যা আপনি পান:

After branch:
    - C1 (B1) (B2)
After first commit (human):
    - C1 (B1)
        \
         C2 (B2)
After first commit (real):
    - C1 (B1) - C2 (B2)

আপনি বি 1 কে আসল শাখা হিসাবে ধরে নিবেন তবে এটি কেবল একটি মৃত শাখা হতে পারে (কেউ চেকআউট-বি করেছেন তবে এটি কখনও প্রতিশ্রুতিবদ্ধ হয়নি)। আপনি উভয়ের সাথে প্রতিশ্রুতি না দেওয়া অবধি এই নয় যে আপনি গিটের মধ্যে একটি বৈধ শাখা কাঠামো পাবেন:

Either:
      / - C2 (B1)
    -- C1
      \ - C3 (B2)
Or:
      / - C3 (B1)
    -- C1
      \ - C2 (B2)

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

এখানে দেওয়া উদাহরণ হ'ল ইতিহাস সংরক্ষণের উদাহরণ:

Human:
    - X - A - B - C - D - F (B1)
           \     / \     /
            G - H ----- I - J (B2)
Real:
            B ----- C - D - F (B1)
           /       / \     /
    - X - A       /   \   /
           \     /     \ /
            G - H ----- I - J (B2)

বাস্তব এখানেও বিভ্রান্তিমূলক কারণ আমরা মানুষ হিসাবে এটি বাম থেকে ডানে, শিকড় থেকে পাতায় (রেফারি) পড়ি। গিট তা করে না। যেখানে আমরা আমাদের মাথায় (এ-> বি) করি (এ <-বি বা বি-> এ)। এটি রেফ থেকে মূল পর্যন্ত পড়ে reads রেফগুলি যে কোনও জায়গায় হতে পারে তবে কমপক্ষে সক্রিয় শাখার জন্য পাতা হতে ঝোঁক to একটি রেফারেন্স প্রতিশ্রুতিবদ্ধ দিকে নির্দেশ করে এবং প্রতিশ্রুতিবদ্ধ করে কেবল তাদের পিতামাতাদের / তাদের সন্তানের জন্য নয়। কমিট যখন মার্জ কমিট হয় তখন এর একাধিক পিতা-মাতার থাকে। প্রথম পিতামাতা সর্বদা আসল প্রতিশ্রুতি যা মেশানো হয়েছিল merge অন্যান্য বাবা-মায়েদের সর্বদা কমিট থাকে যা মূল প্রতিশ্রুতিতে মার্জ হয়েছিল।

Paths:
    F->(D->(C->(B->(A->X)),(H->(G->(A->X))))),(I->(H->(G->(A->X))),(C->(B->(A->X)),(H->(G->(A->X)))))
    J->(I->(H->(G->(A->X))),(C->(B->(A->X)),(H->(G->(A->X)))))

এটি খুব দক্ষ প্রতিনিধিত্ব নয়, বরং প্রতিটি রেফ (বি 1 এবং বি 2) থেকে গিট সমস্ত পাথের একটি অভিব্যক্তি নিতে পারে।

গিটের অভ্যন্তরীণ স্টোরেজটি আরও দেখতে দেখতে (পিতামাতার হিসাবে এ দু'বার প্রদর্শিত হয় না):

    F->D,I | D->C | C->B,H | B->A | A->X | J->I | I->H,C | H->G | G->A

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

Paths simplified:
    F->(D->C),I | J->I | I->H,C | C->(B->A),H | H->(G->A) | A->X
Paths first parents only:
    F->(D->(C->(B->(A->X)))) | F->D->C->B->A->X
    J->(I->(H->(G->(A->X))) | J->I->H->G->A->X
Or:
    F->D->C | J->I | I->H | C->B->A | H->G->A | A->X
Paths first parents only simplified:
    F->D->C->B->A | J->I->->G->A | A->X
Topological:
    - X - A - B - C - D - F (B1)
           \
            G - H - I - J (B2)

উভয় যখন এটিকে আঘাত করবে তখন তাদের চেইন একই হবে, তার আগে তাদের চেইনটি সম্পূর্ণ আলাদা হবে। প্রথম দুটি কমিট সাধারণভাবে করা প্রথমটি হ'ল সাধারণ পূর্বপুরুষ এবং সেখান থেকে তারা অন্যদিকে চলে গিয়েছিল। কমান্ড, শাখা এবং রেফারির মধ্যে এখানে কিছু বিভ্রান্তি থাকতে পারে। আপনি আসলে একটি অঙ্গীকার মার্জ করতে পারেন। এটিই যা মার্জ করে তা সত্যিই করে। একটি রেফ কেবল কমান্টের দিকে নির্দেশ করে এবং একটি শাখা ফোল্ডারে রেফের চেয়ে বেশি কিছু নয় ggit / refs / head, ফোল্ডারের অবস্থানটি এটি নির্ধারণ করে যা কোনও ট্যাগ যেমন অন্য কিছুের চেয়ে একটি রেফ একটি শাখা।

আপনি যেখানে ইতিহাস হারিয়েছেন তা হ'ল একীভূত হওয়া পরিস্থিতিগুলির উপর নির্ভর করে দুটি কাজের মধ্যে একটি করবে।

বিবেচনা:

      / - B (B1)
    - A
      \ - C (B2)

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

      / - B - D (B1)
    - A      /
      \ --- C (B2)

এই মুহুর্তে ডি (বি 1) এর এখন উভয় শাখা (নিজেই এবং বি 2) থেকে উভয় সেট পরিবর্তন রয়েছে। তবে দ্বিতীয় শাখায় বি 1 থেকে পরিবর্তন নেই। আপনি যদি B1 থেকে B2 তে পরিবর্তনগুলি মার্জ করে যাতে সেগুলি সিঙ্ক্রোনাইজ হয় তবে আপনি এমন কিছু দেখতে প্রত্যাশা করতে পারেন (আপনি গিট মেশিনকে এটি এর জন্য --no-ff এর সাথে করতে বাধ্য করতে পারেন):

Expected:
      / - B - D (B1)
    - A      / \
      \ --- C - E (B2)
Reality:
      / - B - D (B1) (B2)
    - A      /
      \ --- C

বি 1 এর অতিরিক্ত কমিট থাকলেও আপনি তা পাবেন। যতক্ষণ না বি 2 তে পরিবর্তন হয় না যে বি 1 নেই, দুটি শাখা একত্রী করা হবে। এটি দ্রুত অগ্রসর হয় যা রিবেসের মতো (পুনর্বাসনাগুলিও খায় বা লিনিয়ার ইতিহাসের ইতিহাস), কেবল একটি রিবেসের পরিবর্তে কেবল একটি শাখায় একটি পরিবর্তন সেট থাকে যেহেতু এটির অন্য শাখায় একটি শাখা থেকে পরিবর্তন সেট প্রয়োগ করতে হয় না।

From:
      / - B - D - E (B1)
    - A      /
      \ --- C (B2)
To:
      / - B - D - E (B1) (B2)
    - A      /
      \ --- C

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

         0   1   2   3   4 (B1)
        /-\ /-\ /-\ /-\ /
    ----   -   -   -   -
        \-/ \-/ \-/ \-/ \
         5   6   7   8   9 (B2)

1 থেকে 3 এবং 5 থেকে 8 হ'ল স্ট্রাকচারাল শাখা যা আপনি 4 বা 9 এর জন্য ইতিহাস অনুসরণ করেন তা প্রদর্শিত হয় এবং এই নামহীন এবং অবাস্তব স্ট্রাকচারাল শাখাগুলির নাম এবং রেফারেন্স শাখাগুলির কোনটির সাথে সম্পর্কিত তা জানার মতো কোনও উপায় নেই কাঠামোর শেষ আপনি এই অঙ্কন থেকে ধরে নিতে পারেন যে 0 থেকে 4 টি B1 এর সাথে সম্পর্কিত এবং 4 থেকে 9 B2 এর সাথে সম্পর্কিত তবে 4 এবং 9 এর বাইরে কোন শাখাটি কোন শাখার অন্তর্ভুক্ত তা জানতে পারে না, আমি কেবল এটিকে এমনভাবে আঁকলাম যে এটি দেয় যে মায়া। 0 বি 2 এর সাথে সম্পর্কিত হতে পারে এবং 5 টি বি 1 এর সাথে সম্পর্কিত হতে পারে। এই ক্ষেত্রে 16 টি পৃথক সম্ভাবনা রয়েছে যার মধ্যে প্রতিটি কাঠামোগত শাখার নামকরণ করা শাখা থাকতে পারে।

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


"গিট রেফারির ইতিহাস সংরক্ষণ করে না" এটি করে তবে ডিফল্টরূপে নয় এবং বহু সময়ের জন্য নয়। man git-reflogতারিখগুলি সম্পর্কে দেখুন এবং অংশটি: "মাস্টার @{one.week.ago}" "যেখানে স্থানীয় এক সপ্তাহ আগে এই স্থানীয় সংগ্রহস্থলটিতে মাস্টার নির্দেশ করতেন" "। অথবা আলোচনা <refname>@{<date>}মধ্যে man gitrevisions। এবং core.reflogExpireভিতরে man git-config
প্যাট্রিক মেভিজেক

2

প্রশ্নের বেশিরভাগ সমাধান নয় তবে আমি ভেবেছিলাম যে আমার দীর্ঘকালীন শাখা থাকাকালীন আমি যে পদ্ধতিটি ব্যবহার করি তা লক্ষ করার মতো:

একই সাথে আমি শাখাটি তৈরি করি, আমি একই নামের সাথে একটি ট্যাগও তৈরি করি তবে -initপ্রত্যয় সহ, উদাহরণস্বরূপ feature-branchএবং feature-branch-init

(এটি এক ধরণের উদ্ভট বিষয় যে উত্তর দেওয়া এত কঠিন প্রশ্ন!)


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

1

ব্রাঞ্চিং পয়েন্টটি কেবল সহজেই সহজ করে তোলার একটি সহজ উপায় git log --graphহ'ল বিকল্পটি ব্যবহার করা --first-parent

উদাহরণস্বরূপ, গৃহীত উত্তর থেকে রেপো নিন :

$ git log --all --oneline --decorate --graph

*   a9546a2 (HEAD -> master, origin/master, origin/HEAD) merge from topic back to master
|\  
| *   648ca35 (origin/topic) merging master onto topic
| |\  
| * | 132ee2a first commit on topic branch
* | | e7c863d commit on master after master was merged to topic
| |/  
|/|   
* | 37ad159 post-branch commit on master
|/  
* 6aafd7f second commit on master before branching
* 4112403 initial commit on master

এখন যোগ করুন --first-parent:

$ git log --all --oneline --decorate --graph --first-parent

* a9546a2 (HEAD -> master, origin/master, origin/HEAD) merge from topic back to master
| * 648ca35 (origin/topic) merging master onto topic
| * 132ee2a first commit on topic branch
* | e7c863d commit on master after master was merged to topic
* | 37ad159 post-branch commit on master
|/  
* 6aafd7f second commit on master before branching
* 4112403 initial commit on master

এটি সহজ করে তোলে!

দ্রষ্টব্য যদি রেপোতে প্রচুর শাখা থাকে তবে আপনি যে দুটি শাখা ব্যবহারের পরিবর্তে তুলনা করছেন সেগুলি নির্দিষ্ট করতে চান --all:

$ git log --decorate --oneline --graph --first-parent master origin/topic

0

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

মনে রাখবেন, সাধারণ গিট শেল কমান্ডগুলির সাথে গণনা করা মোটেও সহজ নয়, যেহেতু git rev-list- আমাদের সর্বাধিক শক্তিশালী হাতিয়ার - যে প্রতিশ্রুতিটি পৌঁছেছে সে পথে আমাদের সীমাবদ্ধ করে না । আমাদের নিকটতমতমটি git rev-list --boundary, যা আমাদের "সমস্ত পথ অবরুদ্ধ" করে এমন সমস্ত কমিটের একটি সেট দিতে পারে। (দ্রষ্টব্য: git rev-list --ancestry-pathআকর্ষণীয় তবে এখানে কীভাবে এটি কার্যকর করা যায় তা আমি জানি না))

এখানে স্ক্রিপ্টটি রয়েছে: https://gist.github.com/abortz/d464c88923c520b79e3d । এটি তুলনামূলকভাবে সহজ, তবে একটি লুপের কারণে এটি সংক্ষেপে ওয়ারেন্ট দেওয়ার পক্ষে যথেষ্ট জটিল।

নোট করুন যে এখানে প্রস্তাবিত বেশিরভাগ সমাধানগুলি সম্ভবত কোনও সাধারণ কারণে সমস্ত পরিস্থিতিতে কাজ করতে পারে না: git rev-list --first-parentইতিহাসের লিনিয়ারাইজিংয়ের ক্ষেত্রে নির্ভরযোগ্য নয় কারণ উভয় অর্ডার দিয়ে একত্রীকরণ হতে পারে।

git rev-list --topo-orderঅন্যদিকে, টপোগ্রাফিক ক্রমে হাঁটাচলা করার জন্য - খুব দরকারী - তবে ভিন্নতাগুলি করা ভঙ্গুর: প্রদত্ত গ্রাফের জন্য একাধিক সম্ভাব্য টপোগ্রাফিক অর্ডিং রয়েছে, সুতরাং আপনি ক্রমগুলির নির্দিষ্ট স্থায়িত্বের উপর নির্ভরশীল। এটি বলেছিল, স্ট্রিংক 7 এর সমাধান সম্ভবত বেশিরভাগ সময় খারাপ কাজ করে। তবে রেপোর পুরো ইতিহাস দু'বার হাঁটানোর ফলে এটি আমার ধীরে ধীরে। :-)


0

নিম্নলিখিত প্রয়োগগুলি এসএনএন লগ - স্টপ-অন-অনুলিপির গিট সমতুল্য এবং শাখার উত্স খুঁজে পেতেও ব্যবহার করা যেতে পারে।

অভিগমন

  1. সমস্ত শাখার জন্য মাথা পেতে
  2. একে অপরের শাখার জন্য টার্গেট শাখার জন্য মার্জব্যাস সংগ্রহ করুন
  3. git.log এবং পুনরাবৃত্তি
  4. মার্জবেস তালিকায় প্রদর্শিত প্রথম প্রতিশ্রুতি বন্ধ করুন

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

মন্তব্য

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

বিশদ: https://stackoverflow.com/a/35353202/9950


-1

আপনি শাখা_এর মধ্যে প্রাচীনতম প্রতিশ্রুতি ফিরিয়ে দিতে নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন যা মাস্টার থেকে পৌঁছনীয় নয়:

git rev-list branch_a ^master | tail -1

একটি অতিরিক্ত বৈধতা পরীক্ষা দিয়ে সম্ভবত যে অভিভাবক কমিট হয় আসলে মাস্টার থেকে পৌঁছানো ...


1
এটি কাজ করে না। যদি শাখা_এ একবার মাস্টারে একত্রী হয়ে যায় এবং এরপরে অবিরত থাকে তবে সেই মার্জটিতে করা কমিটিগুলি মাস্টারের অংশ হিসাবে বিবেচিত হবে, সুতরাং তারা ^ মাস্টারটিতে প্রদর্শিত হবে না।
ফেলিপিসি

-2

আপনি কোন শাখাটি থেকে এটি প্রতিশ্রুতিবদ্ধ হয়েছিল তা আবিষ্কার করতে শাখা A এর রিফ্লোগ পরীক্ষা করতে পারেন, পাশাপাশি সেই শাখায় কোনটি অঙ্গীকার করে তার সম্পূর্ণ ইতিহাসও। রিফ্লাগ রয়েছে .git/logs


2
আমি মনে করি না এটি সাধারণভাবে কাজ করে কারণ রেজলগ ছাঁটাই করা যেতে পারে। এবং আমি মনে করি না (?) পুনরুদ্ধারগুলিও ধাক্কা খায়, সুতরাং এটি কেবলমাত্র একক-রেপো পরিস্থিতিতে কাজ করবে।
গ্যারিও

-2

আমি বিশ্বাস করি যে আমি এখানে একটি উপায় খুঁজে পেয়েছি যা এখানে উল্লিখিত সমস্ত কোণে-কেসগুলির সাথে ডিল করে:

branch=branch_A
merge=$(git rev-list --min-parents=2 --grep="Merge.*$branch" --all | tail -1)
git merge-base $merge^1 $merge^2

চার্লস বেইলি একদম ঠিক বলেছেন যে পূর্বপুরুষদের আদেশের ভিত্তিতে সমাধানগুলির কেবলমাত্র সীমাবদ্ধ মূল্য রয়েছে; দিনের শেষে আপনার "এই প্রতিশ্রুতিটি এক্স এক্স থেকে এসেছে" রেকর্ডের কিছু প্রকারের প্রয়োজন, তবে এই জাতীয় রেকর্ড ইতিমধ্যে বিদ্যমান; ডিফল্টরূপে 'গিট মার্জ' একটি অঙ্গীকার বার্তা যেমন "শাখা 'শাখা_আর" কে মাস্টার হিসাবে ব্যবহার করবে "এটি আপনাকে জানায় যে দ্বিতীয় পিতামাতার সমস্ত কমিট (^ 2 প্রতিশ্রুতিবদ্ধ)' শাখা_এ 'থেকে এসেছিল এবং প্রথমটিতে একীভূত হয়েছিল পিতামাতা (^ 1 প্রতিশ্রুতিবদ্ধ), যা 'মাস্টার'।

এই তথ্যের সাথে সজ্জিত আপনি 'শাখা_আ' এর প্রথম সংশ্লেষ খুঁজে পেতে পারেন (যা 'শাখা_আ' সত্যই অস্তিত্ব নিয়ে এসেছিল), এবং মার্জ-বেসটি খুঁজে পাবেন, যা শাখা পয়েন্ট হবে :)

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

দরকারীতার জন্য:

[alias]
    branch-point = !sh -c 'merge=$(git rev-list --min-parents=2 --grep="Merge.*$1" --all | tail -1) && git merge-base $merge^1 $merge^2'

তাহলে আপনি ' git branch-point branch_A' করতে পারেন '

উপভোগ করুন;)


4
একত্রীকরণ বার্তা জানানোর হয় আরো পিতা বা মাতা আদেশ সম্পর্কে hypothesising চেয়ে ভঙ্গুর। এটি কেবল একটি অনুমানীয় পরিস্থিতিই নয়; আমি প্রায়শই একটি সংক্ষিপ্ত আকারের সংক্ষিপ্ত শাখার নাম (উদাহরণস্বরূপ "বৈশিষ্ট্য জাইজ রিফ্যাক্টারে রূপান্তরিত মূললাইন পরিবর্তন") এর পরিবর্তে যা মিশেছি তাgit merge -m বলতে আমি ব্যবহার করি। মনে করুন আমি আমার উদাহরণের সাথে কম সহায়ক হয়েছি? সমস্যাটি কেবল তার সম্পূর্ণ সাধারণতায় দ্রবণীয় নয় কারণ আমি এক বা দুটি অস্থায়ী শাখা দিয়ে একই ইতিহাস তৈরি করতে পারি এবং পার্থক্যটি বলার উপায় নেই। -m
সিবি বেইলি

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

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