दिलचस्प पोस्ट
JSTL कैसे स्थापित करें? निरपेक्ष यूरी: http://java.sun.com/jstl/core का समाधान नहीं किया जा सकता PHP लॉगिन सिस्टम: मुझे याद रखें (लगातार कुकी) जार पुस्तकालयों को एंड्रॉइड-स्टूडियो में आयात करना Jquery का उपयोग करके पृष्ठभूमि छवि बदलना से बचने के लिए jQuery का नुकसान अपाचे POI के साथ एक बड़ी एक्सएलएसएक्स फ़ाइल कैसे लोड करें? अंगुलर हैश को कैसे जोड़ता है AngularJS में लिंक करना नीचे के सिवाय रैखिक लेआउट के चारों ओर सीमा कैसे जोड़ती है? निश्चित चौड़ाई वाले वर्ण तत्वों के एक सदिश में एक स्ट्रिंग काट रहा आईफोन पर भी चुप मोड में ध्वनि चलाएं दूरस्थ अस्वीकृत मास्टर -> मास्टर (पूर्व-प्राप्त हुक अस्वीकृत) कैसे .net Webbrowser नियंत्रण में स्मृति रिसाव के आसपास पाने के लिए? विंक कमांड लाइन में yanked पाठ कैसे पेस्ट करें? अजाक्स का उपयोग करके आंशिक दृश्य प्रस्तुत करना बिट फ़ील्ड सी #

ट्रिमिंग गिट कमिट / स्क्वैशिंग गिट इतिहास

मैं हर कुछ मिनट या फिर एक गीट शाखा में अपना कोड जांचता हूं, और टिप्पणियां अंततः "हर बार टूटी हुई टूटी हुई" और अन्य विचित्रता जैसी चीजों को समाप्त करती हैं।

फिर हर कुछ मिनट / घंटे / दिन मैं एक वास्तविक टिप्पणी के साथ गंभीर प्रतिबद्ध करता हूँ, जैसे "फिक्स्ड बग # 22.55, 3 बार।" मैं इन दोनों अवधारणाओं को कैसे अलग कर सकता हूं? मैं अपने सभी अक्सर-प्रतिबद्धता को हटाने में सक्षम होना चाहता हूं और सिर्फ गंभीर लोगों को छोड़ देता हूं

Solutions Collecting From Web of "ट्रिमिंग गिट कमिट / स्क्वैशिंग गिट इतिहास"

अब संपादित उत्तर (इस प्रविष्टि के दूसरे छमाही में) नए Git1.7 फिक्सअप! त्वरित कार्रवाई --autosquash और संदेश संपादन के लिए कार्रवाई और --autosquash विकल्प।


सबसे पहले, क्लासिक स्क्वैशिंग प्रक्रिया, जैसा कि Git1.7 से पहले किया गया था।
(Git1.7 की एक ही प्रक्रिया है, मैन्युअल पुनर्ड्रॉर्डिंग के विरोध में, स्वचालित क्लीनर की पुनरीक्षण की संभावना के कारण ही, और क्लीन स्क्वैशिंग संदेशों द्वारा)

मैं अपने सभी बार-बार चेक-इन को निकालने में सक्षम होना चाहूंगा और सिर्फ गंभीर लोगों को छोड़ दूंगा

इसे स्क्वैशिंग कॉमिट्स कहा जाता है
इस गेट तैयार लेख में "कमेट की सफाई" का कुछ अच्छा उदाहरण है:
(नोट: रिज़ इंटरैक्टिव फीचर सितंबर 2007 के बाद से आया था , और स्क्वैशिंग या विभाजन या निकालने या क्रमबद्ध करने के लिए अनुमति देता है: गिटप्रो पेज भी देखें)

सावधानी के एक शब्द : केवल ऐसा करता है जो एक बाह्य भंडार को धक्का नहीं दिया गया है यदि अन्य लोगों ने उन चीजों को छोड़ दिया है जो आप हटाना चाहते हैं, तो बहुत सारे संघर्ष हो सकते हैं अपने इतिहास को फिर से लिखना नहीं है, अगर इसे दूसरों के साथ साझा किया गया है

वैकल्पिक पाठ http://img.hiwab.com/git/squash1.png

आखिरी 4 प्रतिबद्धता बहुत खुश होगी यदि वे एक साथ लिपटे हों

 $ git rebase -i HEAD~4 pick 01d1124 Adding license pick 6340aaa Moving license into its own file pick ebfd367 Jekyll has become self-aware. pick 30e0ccb Changed the tagline in the binary, too. # Rebase 60709da..30e0ccb onto 60709da # # Commands: # p, pick = use commit # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. # 

पिछले चार कमेटियों का उपयोग करके रीबेस जहां से HEAD~4 साथ HEAD~4
हम सब कुछ एक प्रतिबद्ध में स्क्वैश करने जा रहे हैं।
इसलिए, फ़ाइल की पहली चार पंक्तियों को बदलकर यह चाल की जाएगी:

 pick 01d1124 Adding license squash 6340aaa Moving license into its own file squash ebfd367 Jekyll has become self-aware. squash 30e0ccb Changed the tagline in the binary, too. 

असल में यह गिट को सभी चार कमियों को सूची में पहली प्रतिबद्धता में संयोजित करने के लिए कहता है। एक बार यह किया जाता है और सहेजा जाता है, एक अन्य संपादक निम्न के साथ फ़ैशन जाता है:

 # This is a combination of 4 commits. # The first commit's message is: Adding license # This is the 2nd commit message: Moving license into its own file # This is the 3rd commit message: Jekyll has become self-aware. # This is the 4th commit message: Changed the tagline in the binary, too. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # Explicit paths specified without -i nor -o; assuming --only paths... # Not currently on any branch. # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: LICENSE # modified: README.textile # modified: Rakefile # modified: bin/jekyll # 

चूंकि हम इतने सारे कमानों के संयोजन कर रहे हैं, इसलिए गिट आपको प्रक्रिया में शामिल शेष कर्तव्यों के आधार पर नए कमिट के संदेश को संशोधित करने की अनुमति देता है। जैसा कि आप फिट दिखते हैं, उसे संपादित करें, फिर सहेजें और छोड़ें
ऐसा करने के बाद, आपके कूट सफल हो गए हैं!

 Created commit 0fc4eea: Creating license file, and making jekyll self-aware. 4 files changed, 27 insertions(+), 30 deletions(-) create mode 100644 LICENSE Successfully rebased and updated refs/heads/master. 

और अगर हम इतिहास को फिर से देखें …

वैकल्पिक पाठ http://img.hiwab.com/git/squash2.png


नोट: " कट स्क्वैशिंग " उद्देश्यों के लिए, Git1.7 (फरवरी 2010) ने 2 नए तत्वों को प्रस्तुत किया है (जैसा डस्टिन ने टिप्पणी में बताया है):

  • " git rebase -i " नई कार्रवाई " fixup " सीखा है जो बदलाव को स्क्वैश करता है लेकिन मौजूदा लॉग संदेश को प्रभावित नहीं करता है।
  • " git rebase -i " भी सीखा --autosquash विकल्प जो नए "फ़िक्सअप" एक्शन के साथ उपयोगी है

दोनों ( --autosquash एक्शन और --autosquash ऑप्शन) इस थेकोओसॉर्सेरी नेटवर्क ब्लॉग एंट्री में सचित्र हैं। ये विशेषताएं पिछले जून 200 9 से खाना पक रही हैं और पिछले दिसंबर में इसके बारे में चर्चा की गई है।

fixup एक्शन या डायरेक्टिव कमिट को rebase --interactive करने के लिए है, जिसे आप rebase --interactive की प्रतिबद्ध संपादन सूची में मैन्युअल रूप से rebase --interactive , दूसरी प्रतिबद्ध संदेश की अनदेखी करते हुए, जो संदेश संस्करण को तेज़ गति देगा (आप इसे सहेज सकते हैं: कुचल प्रतिबद्ध केवल पहले प्रतिबद्ध संदेश होगा)
जिसके परिणामस्वरूप संदेश केवल पहले प्रतिबद्ध एक होगा।

  # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message 

--autosquash विकल्प आपके लिए स्वचालित रूप से --autosquash प्रक्रिया बनाने के बारे में है:

यदि आप जानते हैं कि आप किस चीज में स्क्वैश करना चाहते हैं तो आप इसे " squash! $other_commit_subject " के संदेश के साथ कर सकते हैं squash! $other_commit_subject squash! $other_commit_subject " फिर अगर आप @git rebase --interactive --autosquash commitish@ , तो लाइन स्वचालित रूप से स्क्वैश के रूप में सेट की जाएगी, और कमांड के नीचे $ अन्य_आर्मिट_सब्कि के विषय के साथ रखा जाएगा।

(वास्तव में, squash! केवल एक और प्रतिबद्ध संदेश की शुरुआत का उपयोग कर सकता है)

 $ vim Foo.txt $ git commit -am "Change all the 'Bar's to 'Foo's" [topic 8374d8e] Change all the 'Bar's to 'Foo's 1 files changed, 2 insertions(+), 2 deletions(-) $ vim Bar.txt $ git commit -am "Change all the 'Foo's to 'Bar's" [topic 2d12ce8] Change all the 'Foo's to 'Bar's 1 files changed, 1 insertions(+), 1 deletions(-) $ vim Foo.txt $ git commit -am "squash! Change all the 'Bar's" [topic 259a7e6] squash! Change all the 'Bar's 1 files changed, 2 insertions(+), 1 deletions(-) 

देख? यहां तीसरा प्रतिबद्ध केवल पहले कमिट संदेश की शुरुआत करता है।
rebase --interactive --autosquash कमिट को प्रासंगिक से नीचे ले जाएगा:

 pick 8374d8e Change all the 'Bar's to 'Foo's squash 259a7e6 squash! Change all the 'Bar's pick 2d12ce8 Change all the 'Foo's to 'Bar's 

संदेश संस्करण होगा:

 # This is a combination of 2 commits. # The first commit's message is: Change all the 'Bar's to 'Foo's # This is the 2nd commit message: squash! Change all the 'Bar's 

डिफ़ॉल्ट रूप से मतलब आप प्रतिबद्ध संदेश में दर्ज स्क्वैशिंग ऑपरेशन को बनाए रखेंगे।
लेकिन फिक्सअप के साथ! निर्देश, आप प्रतिबद्ध संदेश में उस "अदृश्य" को दबाने के लिए रख सकते हैं, जबकि अभी भी स्वत: --autosquash विकल्प (और यह तथ्य कि आपके द्वितीय प्रतिबद्ध संदेश पहली बार प्रतिबद्धता के आधार पर होता है, जिसे आप कुचल देना चाहते हैं )।

 pick 8374d8e Change all the 'Bar's to 'Foo's fixup cfc6e54 fixup! Change all the 'Bar's pick 2d12ce8 Change all the 'Foo's to 'Bar's 

डिफ़ॉल्ट रूप से संदेश होगा:

 # This is a combination of 2 commits. # The first commit's message is: Change all the 'Bar's to 'Foo's # The 2nd commit message will be skipped: # fixup! Change all the 'Bar's 

सूचना है कि fixup! प्रतिबद्ध का संदेश पहले से ही टिप्पणी की गई है।
आप बस संदेश को सहेज सकते हैं, और आपका मूल कूट संदेश रखा जाएगा
परिवर्तनों को शामिल करने के लिए बहुत आसान है जब आपको यह पता चलता है कि आप पहले की प्रतिबद्धता को जोड़ना भूल गए थे

अब अगर आप पहले से किए गए प्रतिबद्ध के आधार पर फिक्सअप या स्क्वैश चाहते हैं, तो जेकब हेलिग (टेक्नोसॉर्शरी नेटवर्क ब्लॉग एंट्री के लेखक) ने निम्नलिखित उपनामों की सिफारिश की है:

 [alias] fixup = !sh -c 'git commit -m \"fixup! $(git log -1 --format='\\''%s'\\'' $@)\"' - squash = !sh -c 'git commit -m \"squash! $(git log -1 --format='\\''%s'\\'' $@)\"' - 

और एक रिज इंटरेक्टिव करने के लिए जो हमेशा कुचलने के लिए किए गए कमेट्स के स्वचालित पुनरीक्षण से लाभ उठाएगा:

 [alias] ri = rebase --interactive --autosquash 

स्क्वैश जीआईटी इतिहास के लिए रीबस के बजाय नरम रीसेट का उपयोग करना

मुझे लगता है कि वॉनसी के उत्तर की लंबाई में वॉल्यूम की बात है – शाब्दिक रूप से – कैसे जटिल git rebase है यह मेरा एक प्रश्न के दूसरे उत्तर का विस्तार है।

  1. आपके पास एक ब्रांच ticket-201 जो आपने master से शाही है आप बहाना चाहते हैं कि ticket-201 से सभी ticket-201 कभी नहीं हुई, लेकिन आपने एक ही शॉट में सभी काम किए।
  2. git reset --soft hash का इस्तेमाल करके शाखा बिंदु पर नरम रीसेट करें, जहां hash एक प्रतिबद्ध हैश होना चाहिए जो कि ticket-201
  3. अपने परिवर्तनों को जोड़कर जोड़कर प्रतिबद्ध करें। अब शाखा के इतिहास में केवल पहली चीज होगी और नया सामान वाला नया वाला होगा।

अलग-अलग शाखाओं में मनमानी प्रतिबद्धता से इतिहास बनाना

रीसेट का उपयोग करके आप इतिहास को फिर से लिख सकते हैं जैसा कि आप देख रहे हैं, हालांकि आपके संपादन सही टाइमस्टैम्प होने का आकर्षण खो देंगे। मान लें कि आप उस पर ध्यान नहीं रखते हैं (आपकी फाइलों का समय / तारीखें पर्याप्त होंगी, शायद), या यदि आप जा रहे हैं, तो आप इन कदमों का पालन कर सकते हैं:

  1. commit0 एक नई शाखा commit0 (एक हैश का दिखावा करें): git checkout -b new-history commit0
  2. अब आप commit5 से फाइल प्राप्त कर सकते हैं: git reset --hard commit5
  3. अपने सूचकांक बिंदु पर वापस स्विच करें: git reset --soft commit0
  4. प्रतिबद्ध और यह शाखा में दूसरी प्रतिबद्धता होगी।

यह विचार सरल, प्रभावी और लचीला है

इसके बजाय स्क्वाश का उपयोग करना

हाल ही में, मैं एक और शाखा में काम कर रहा हूं और squash का उपयोग कर रहा हूं। दूसरी शाखा को अस्थायी कहा जाता है, और फिर मैं git merge temp --squash का उपयोग इसे वास्तविक शाखा में लाने के लिए करता git merge temp --squash जो कि सर्वर पर धकेलती है।

वर्कफ़्लो ऐसा कुछ है, यह मानते हुए कि मैं Ticket65252 में काम कर रहा हूं:

 git branch -d temp #remove old temp bbranch git checkout -b temp # work work work, committing all the way git checkout Ticket65252 git merge temp --squash git commit -m "Some message here" 

rebase का उपयोग करने पर लाभ ? रास्ता कम जटिल।

reset --soft का उपयोग reset --hard बाद लाभ और फिर reset --soft ? कम भ्रमित और थोड़ा कम त्रुटि प्रवण।

जीआईटी रीबेस -i का उपयोग करें और अपनी कमाई को एक साथ स्क्वैश करें।