पहली GOOD कमिट को खोजने के लिए मैं git bisect का उपयोग कैसे कर सकता हूँ?


90

मुझे निम्न समस्या है:

  • संस्करण masterठीक काम करता है
  • पहले अंतिम टैग के संस्करण master(माना last) एक बग है
  • एक सहयोगी को lastउस निश्चित बग के लिए अपने संशोधन के लिए एक पैच की आवश्यकता होती है

ठीक है। आइए git bisectबग को ठीक करने वाले संशोधन के लिए हमारे मित्र से पूछें :

git bisect start
git bisect bad last
git bisect good master

लेकिन वह काम करने वाला नहीं है:

कुछ अच्छे रिव्यू बुरे रिव्यू के पूर्वज नहीं हैं।
git bisect इस मामले में ठीक से काम नहीं कर सकता है।
हो सकता है कि आप अच्छे और बुरे के चक्कर में गलती कर दें?

इसे दूर करने के लिए कोई संकेत? क्या मुझे डॉक्स में कुछ याद आया?


1
मैं git bisect run ...बाइसेक्टिंग को स्वचालित करने के लिए दौड़ रहा हूं । इसलिए मेरे पास शब्दों को स्वैप करने का कोई मौका नहीं है goodऔर bad(यह बहुत स्पष्ट था)। runपहला अच्छा संशोधन खोजने के लिए कैसे उपयोग करें ?
डैनियल बॉमर

@ DanielBöhmer: आपको अपनी स्क्रिप्ट के अंदर शब्दों की अदला-बदली करनी है , क्या आप नहीं चल रहे हैं?
eckes

एक्ज़िट कोड के रूप में अच्छा या बुराgit bisect run रिटर्न स्क्रिप्ट द्वारा चलता है , स्ट्रिंग के रूप में नहीं। मेरा जवाब देखिए मैंने अभी नीचे पोस्ट किया है।
डैनियल बॉमर

@ DanielBöhmer: ठीक है, उस स्थिति में आपको रिटर्न कोड पलटना होगा, है न?
eckes

सही है, यह वही है जो मेरे उत्तर में वर्णित है।
डैनियल बॉमर

जवाबों:


98

2.7 2.7 के रूप में, आप तर्कों का उपयोग कर सकते हैं - पुराने और पुराने - नए।

उदाहरण के लिए, आप इस प्रकार एक समस्या-निर्धारण करने वाली समिति की पहचान कर सकते हैं:

git bisect start --term-new=fixed --term-old=unfixed
git bisect fixed master
git bisect unfixed $some-old-sha1

जैसा कि आप परीक्षण, कहते हैं git bisect fixedया git bisect unfixedउपयुक्त के रूप में।

2.7 से पहले git के संस्करणों के लिए पुराना उत्तर

अपने आप को अस्थायी रूप से प्रशिक्षित करने के बजाय यह सोचने के लिए कि बुरा का मतलब अच्छा है और अच्छा का मतलब बुरा है, कुछ उपनाम क्यों नहीं बनाते हैं?

में ~/.gitconfigनिम्नलिखित जोड़ें:

[alias]
        bisect-fixed = bisect bad
        bisect-unfixed = bisect good

आप इस तरह से एक समस्या को ठीक करने की पहचान शुरू कर सकते हैं:

$ git bisect start
$ git bisect-fixed master
$ git bisect-unfixed $some-old-sha1

जैसा कि आप परीक्षण, कहते हैं git bisect-fixedया git bisect-unfixedउपयुक्त के रूप में।


5
एक तरफ के रूप में, git आपको उप कमांडों के उपनाम बनाने की अनुमति नहीं देता है। इसलिए डैश। यदि यह वास्तव में है (या बनाया गया है) संभव है, उम्मीद है कि कोई व्यक्ति उत्तर को अपडेट करेगा।
माइकल वुल्फ

3
यहां तक ​​कि अगर आप उपनाम का उपयोग करते हैं, तो गिट से आउटपुट नहीं होगा, इसलिए यह अभी भी फू की रिपोर्ट करेगा is the first bad commit, इसलिए ऐसा लगता है कि अस्थायी प्रशिक्षण अभी भी आवश्यक है, नहीं?
थॉमसडब्ल्यू

2
निष्पक्ष बिंदु। (अपनी टिप्पणी को प्रस्तुत किया।) हालांकि उम्मीद है कि यह कम से कम थोड़ा कम अतिरिक्त संज्ञानात्मक भार से निपटने के लिए है, और प्रोग्रामर के रूप में हमारे पास पहले से ही बहुत कुछ है।
माइकल वुल्फ

1
मैं 'से पहले' और 'के बाद' का उपयोग करने की सलाह देता हूं। इस तरह आपके पास उलटा करने का संज्ञानात्मक ओवरहेड नहीं है "जब मैं बग देखता हूं, तो मुझे 'अच्छा' लिखना चाहिए"; इसके बजाय आपके पास केवल यह याद रखने की संभावना है कि आप बग की उपस्थिति / गायब होने की तलाश कर रहे हैं (यानी यह याद रखना कि आप किस तरह के बदलाव की तलाश कर रहे हैं- "किस से पहले?")।
जोनास कोल्कर

1
@ जोनासकॉल्कर, यह एक महान विचार है। मैं के रूप में इस सवाल का जवाब में सुझाव दिया उपनाम का इस्तेमाल किया और साथ ही, bisect-after = bisect badऔर bisect-before = bisect good, अपने सिफारिश के अनुसार। अब मैं एलियासेस के सेट का उपयोग कर सकता हूं। हम देखेंगे कि मैं कुछ उपयोगों के बाद और अधिक का समर्थन करता हूं।
गेब्रियल स्टेपल्स

47

मैं अच्छे <=> बुरे का अर्थ "धोखा" देता हूँ।

दूसरे शब्दों में, "खराब" को कुछ ऐसा समझें जो समस्या को प्रदर्शित नहीं करता है इसलिए यह आपके पैच को आधार बनाने के लिए "अच्छा" संस्करण नहीं है।

अच्छा और बुरा वैसे भी बहुत व्यक्तिपरक अवधारणाएँ हैं, है ना? :)

git bisect start
git bisect good last
git bisect bad master

2
ठीक है, यदि आप इसके बारे में सोचते हैं तो इसका कोई सामान्य अर्थ नहीं है कि अच्छा या बुरा (शायद धर्म में भी नहीं है) .. यह सिर्फ आपके उद्देश्यों पर निर्भर करता है। इस तरह यह वास्तव में धोखा नहीं है - लेकिन शायद गित के पाप (धार्मिक विषय पर बने रहने के लिए: डी को अधिक तटस्थ "लक्ष्य" / "मूल" के बजाय इस तरह के विवादास्पद शब्द को चुनना है .. लेकिन हां, दर्शन मन हो सकता है- boggling ;-)
प्रवेश करें

यह पहली बार होना चाहिए जब मैंने सुना कि कीड़े "अच्छे" हो सकते हैं।
मार्ख

1
इससे पहले कि मैं यह सवाल करता, मैंने क्या किया। मैं इसे अब और नहीं करने जा रहा हूं। याद रखें, यह केवल एक गलत जवाब लेता है इससे पहले कि पूरी द्विभाजिका भड़क जाए। अपने दिमाग को घुमाओ मत।
२२:२० बजे प्रोस्की

20

यदि आप का उपयोग कर रहे हैं git bisect runजैसे मैं पर्ल की proveकमांड के साथ कर रहा हूं (जो स्वचालित परीक्षण चलाता है) तो आपके पास बस स्वैप करने का कोई मौका नहीं है goodऔर bad। परीक्षणों की सफलता को निकास कोड के रूप में सूचित किया जाएगा।

मेरे द्वारा चलाए गए कार्यक्रम के निकास कोड को नकारने के लिए एक मान्य बैश सिंटैक्स पाया गया है git bisect run:

git bisect start
git bisect bad HEAD                 # last revision known to PASS the tests
git bisect good $LAST_FAIL_REVISION # last revision known to FAIL the tests
git bisect run bash -c "! prove"

इसने मेरे द्वारा चलाए गए परीक्षणों को पास करने का पहला संशोधन दिया prove


मैं सहमत हूं, मैं अपने परीक्षण मामले को संशोधित नहीं करूंगा, इसलिए यह सही है।
शीनलिन्सले

8

Git अब आपको उपयोग करने देता है oldऔर newबिना उन्हें परिभाषित किए। आपको git bisect startआगे के तर्कों के रूप में बिना कमिट के कॉल करना है, फिर कॉल करके ठीक से बायसेशन शुरू करें

git bisect old <rev>
git bisect new <rev>

https://git-scm.com/docs/git-bisect#_alternate_terms

यह अनिवार्य रूप से @MarcH का सुझाव था कि इसे लागू किया जाना चाहिए।


1
यह सबसे प्रासंगिक उत्तर है (आधुनिक गिट के लिए)। और स्टार्ट कमांड होना चाहिए (आपके द्वारा साझा किए गए लिंक के अनुसार):git bisect start --term-new fixed --term-old broken
सैम प्रॉट्सेंको

सच। ये विकल्प कब पेश किए गए थे? मैं अपना जवाब अपडेट करना चाहता हूं।
माइकल वुल्फ

@MichaelWolf वे 2.7.0 संस्करण में दिखाई दिए ।
GKFX

6

Git aliases एक अच्छा विचार है, हालाँकि शर्तों fixedऔर की unfixedतुलना में एक ही मुद्दा है : goodऔर badआप उन्हें regressions और प्रगति दोनों के साथ संगत नहीं हो सकता है । ऐसे शब्दों को खोजना आसान है जो किसी भी तरह से काम करते हैं: बस उन्हें मूल द्विआधारी खोज शब्दावली से उठाएं जो प्रकृति में तटस्थ है जो अच्छा या बुरा नहीं है। उदाहरण के लिए:

git config --global alias.bisect-high 'bisect bad'
git config --global alias.bisect-low  'bisect good'

इन जैसे तटस्थ शब्दों के साथ आप हमेशा टाइप कर सकते हैं: git bisect-high(या git bisect-upper, या git-bisect max... आपकी पसंद!) चाहे आप रिग्रेशन की तलाश कर रहे हों या फिक्स की

बहुत खराब git bisect Developers मौजूदा किसी भी शर्त का फिर से उपयोग नहीं कर सकते हैं। यूजर इंटरफेस आमतौर पर बोलने की चिंता नहीं है: http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/


से: git.github.io/rev_news/2015/07/08/edition-5 "कुछ पैच श्रृंखला को अच्छे और बुरे के बजाय git bisect को मनमाने ढंग से जोड़ी के उपयोग की अनुमति देने के लिए पॉलिश किया जा रहा है, ..."
MarcH
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.