Git / Git एक्सटेंशन में "स्क्वैश" और "फिक्सअप" में क्या अंतर है?


111

मैं कुछ समय के लिए Git एक्सटेंशन का उपयोग कर रहा हूं (यह बहुत बढ़िया है!), लेकिन मुझे निम्नलिखित का सरल उत्तर नहीं मिला है:

कभी-कभी, एक प्रतिबद्ध संदेश टाइप करते समय, एक टाइपो बनाओ। मेरे मित्र ने मुझे दिखाया कि इसे निम्नलिखित तरीके से कैसे ठीक किया जाए (Git Extentions में):

प्रतिबद्ध> उन्नत> फिक्सड कमिट पर राइट-क्लिक करें

यहां छवि विवरण दर्ज करें

फिर मैं बस बॉक्स "अमेंड" की जांच करता हूं और अपने संदेश और वॉयला को फिर से लिखता हूं! मेरा प्रतिबद्ध संदेश तय हो गया है

हालांकि यह अन्य विकल्प "स्क्वैश कमिटमेंट" ... मैंने हमेशा सोचा है कि यह क्या करता है ?!

मेरा सवाल यह है कि:

चाहेंगे कोई बस मुझे समझाने क्या के बीच सटीक अंतर नहीं है स्क्वैश के लिए प्रतिबद्ध है और फिक्स-अप के लिए प्रतिबद्ध में Git / Git Extentions ? वे मेरे जैसे दिखते हैं ... "समान" : यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

जवाबों:


153

मुझे नहीं पता कि गिट एक्सटेंशन इसके साथ विशेष रूप से क्या करता है, लेकिन git rebaseस्क्वैश के साथ स्वचालित रूप से स्क्वैश या फिक्सअप करने का विकल्प है! या तय! क्रमशः उपसर्ग,

   --autosquash, --no-autosquash
       When the commit log message begins with "squash! ..." (or "fixup!
       ..."), and there is a commit whose title begins with the same ...,
       automatically modify the todo list of rebase -i so that the commit
       marked for squashing comes right after the commit to be modified,
       and change the action of the moved commit from pick to squash (or
       fixup).

स्क्वैश और फ़िक्सअप के बीच का अंतर यह है कि रिबेस के दौरान, squashऑपरेशन आपको मूल और स्क्वैश कमिट के संदेशों को संयोजित करने के लिए प्रेरित करेगा, जबकिfixup ऑपरेशन मूल संदेश को रखेगा और फ़िक्सअप कमिट से संदेश को छोड़ देगा।


6
आप Git डॉक्सrebase पर अधिक पढ़ सकते हैं और स्क्वैश / फिक्सअप कर सकते हैं ।

यह एक बेहतरीन जवाब है। हमेशा सोचता रहा कि मुझे कॉम्बिनेशन कमिट मैसेज क्यों मिला।
jedd.ahyoung

66

सीधे शब्दों में कहें, तो एक सीमेन्ट की एक श्रृंखला को रिबास करते समय, प्रत्येक कमिट को एक के रूप में चिह्नित किया जाता है squash, आपको अपने संदेश को एक pickया rewordप्रतिबद्ध संदेश के हिस्से के रूप में उपयोग करने का अवसर देता है ।

जब आप fixupउस प्रतिबद्ध से संदेश का उपयोग करते हैं तो उसे छोड़ दिया जाता है।


fixupउसके लिए कौन सा संदेश रखा गया है ?
इगोरगानापोलस्की

2
@IgorGanapolsky गिट पेड़ में अगले वचन से संदेश। आप मूल रूप से इसमें अपनी प्रतिबद्धता "मर्ज" करते हैं।
अलेक्जेंडर हेरोल्डो दा रोचा

15

से Git-रिबेस डॉक, "इंटरैक्टिव मोड" अनुभाग :

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


13

यदि सवाल यह है कि git रिबेस - इनएक्टिव एक्टिव करते समय squashऔर इसके बीच अंतर क्या है , तो इसका उत्तर है कमिट मैसेजfixup

s, squash <commit> = कमिट का उपयोग करें, लेकिन पिछली प्रतिबद्ध में पिघल जाएं

f, fixup <commit>= "स्क्वैश" की तरह, लेकिन इस कमिट के लॉग संदेश को छोड़ दें


उदाहरण के लिए:

pick 22a4667 father commit message
squash 46d7c0d child commit message # case 1
# fixup 46d7c0d child commit message # case 2

संदेश प्रतिबद्ध में रिबेसिंग के बाद मामले 1 होगा:

father commit message

child commit message

जबकि संदेश 2 में है:

father commit message
# no sub messages

1

मैंने git एक्सटेंशन के साथ छेड़छाड़ की और इसे कई कमिट्स को एक में स्क्वैश करने के लिए नहीं मिला। ऐसा करने के लिए, मुझे कमांड लाइन का सहारा लेना पड़ा और इस पोस्ट को मददगार पाया

git rebase -i Head~2

यह इंटरैक्टिव रिबेस है, और निम्नलिखित पर ध्यान दें:

  • ~ 2 यहाँ इस बात का उल्लेख है कि आप इस ऑपरेशन में कितने शामिल करना चाहते हैं, जिसमें वर्तमान प्रमुख भी शामिल है
  • आपको उप-इंटरेक्टिव एडिट विंडो को संपादित करना होगा, पहले आइटम को "पिक" के रूप में छोड़ दें और बाद की पंक्तियों को "स्क्वैश" से बदल दें। यदि यह अपारदर्शी है तो ऊपर दिए गए लिंक में दिए गए निर्देश बहुत स्पष्ट हैं।

आपके द्वारा लिंक की गई पोस्ट स्पष्ट विवरण के बारे में है जिसे मैंने स्क्वैश और फ़िक्सअप के बारे में देखा है। धन्यवाद!
सिमोन तिवारी

0

खुद ही क्यों नहीं पूछा? जब आप git-bashइससे छूट देते हैं, तो यह कहता है:

pick 512b1d7 (some comment)
# Rebase 621b2e4..512b1d7 onto 621b2e4 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
D:/code/fenixito-legacy-api/.git/rebase-merge/git-rebase-todo [unix] (11:57 23/10/2019)                                         1,1 start
"D:/code/xxx/.git/rebase-merge/git-rebase-todo" [UNIX] 27L, 1170C

तो आप देखते हैं:

s, स्क्वैश = कमिट का उपयोग करें, लेकिन पिछले प्रतिबद्ध में पिघला

f, fixup = जैसे "स्क्वैश", लेकिन इस कमिट के लॉग संदेश को छोड़ दें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.