उन्हें धक्का दिए जाने के बाद कैसे स्क्वैश को गिट में डाल दिया जाए?


550

यह कई हिट स्क्वैश का एक अच्छा विवरण देता है:

http://git-scm.com/book/en/Git-Branching-Rebasing

लेकिन यह उन कामों के लिए काम नहीं करता है जिन्हें पहले ही धकेल दिया गया है। मैं अपने स्थानीय और दूरस्थ रेपो दोनों में सबसे हाल के कुछ स्क्वैश कैसे करूं?

संपादित करें: जब मैं करता हूं git rebase -i origin/master~4 master, तो पहले को एक के रूप में रखें pick, दूसरे को तीन के रूप में सेट करें squash, और फिर बाहर निकलें (emxs में cx cc के माध्यम से), मुझे मिलता है:

$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started

जहां 2f40 pickप्रतिबद्ध है। और अब 4 में से कोई भी कमिट नहीं दिखाई देता है git log। मुझे उम्मीद थी कि मेरे संपादक को फिर से शुरू किया जाएगा ताकि मैं एक प्रतिबद्ध संदेश दर्ज कर सकूं। मैं क्या गलत कर रहा हूं?

जवाबों:


779

स्क्वैश स्थानीय स्तर पर शुरू होता है

git rebase -i origin/master~4 master

और फिर जोर से धक्का

git push origin +master

--forceऔर के बीच अंतर+

के प्रलेखन से git push:

ध्यान दें कि --forceधकेलने वाले सभी रेफ पर लागू होता है, इसलिए इसे push.defaultसेट के matchingसाथ या कई पुश गंतव्यों के साथ सेट के साथ उपयोग करके remote.*.pushवर्तमान शाखा के अलावा अन्य रीफ़्रेश को अधिलेखित कर सकते हैं (स्थानीय रीफ़्स जो उनके दूरस्थ समकक्ष के पीछे कड़ाई से शामिल हैं)। पुश को केवल एक शाखा + के लिए बाध्य करने के लिए, रिफस्पेक के सामने धक्का देने के लिए उपयोग करें (जैसे शाखा git push origin +masterको एक धक्का देने के लिए मजबूर करना master)।


30
आप यह भी कर सकते हैंgit push --force origin master
डेन्थ

7
डेनेथ : हाँ, लेकिन मैं हमेशा इस वाक्यविन्यास को प्राथमिकता देता हूँ क्योंकि यह छोटा होता है।
एलन हाग्गै अलवी

85
और हां, यह महसूस करें कि अगर किसी और को दूरस्थ रिपॉजिटरी से खींच लिया गया है, तो आप शायद ऐसा नहीं करना चाहते हैं - इस मामले में जवाब है "आप नहीं।"
Cascabel

10
इसके अलावा, मुझे लगता है कि ओपी वास्तव में कमांड की नकल कर रहा है git rebase -i origin/master, और वास्तव में यह जानना चाहता है कि रिबास कैसे आगे की तुलना में कमिट करता है, जैसे git rebase -i origin/master~20 master
Cascabel

6
gstackoverflow :+केवल refspec जो इसके द्वारा उपसर्ग है मजबूर करता है। --forceबल दिया जाएगा सभी refspecs धक्का दिया। कृपया अद्यतन उत्तर देखें।
एलन हाग्गै अलावी

119

एक शाखा पर मैं इसे इस तरह से करने में सक्षम था (अंतिम 4 के लिए)

git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch

1
एक पहले से ही धक्का दिया शाखा पर नरम आदेश के साथ ऐसा करने से मेरे लिए अन्य लोगों के एक टन धक्का दिया गया।
cchamberlain

3
पर? यह 4 से अधिक कैसे हो सकता है? क्या आप विस्तार से समझा सकते हैं?
जकोब- r

कि मैं अनिश्चित हूँ, लेकिन यह पहले से ही धक्का दिया प्रतिबद्ध स्क्वैश करने की कोशिश के साथ कुछ करना था। ऐसा लगता है कि अन्य लोग यहां समान अनुभव करते हैं - stackoverflow.com/questions/5189560/…
cchamberlain

4
मैंने इसे अपेक्षित उत्तर के रूप में स्वीकार किया होगा। अधिक क्लीनर जो जवाब स्वीकार कर लिया।
विक्रमवी

4
यह केवल 4 चरणों में सबसे स्पष्ट और स्वीकृत जवाब है
अमेय सालाग्रे

45

स्वीकृत उत्तर के लिए मामूली अंतर, लेकिन मुझे स्क्वैशिंग करने में बहुत कठिनाई हो रही थी और आखिरकार मिल गई।

$ git rebase -i HEAD~4
  • खुलने वाली इंटरेक्टिव स्क्रीन पर, स्क्वैश के साथ पिक को बदलें उन सभी कमिट्स के लिए जिन्हें आप स्क्वैश करना चाहते हैं।
  • के माध्यम से संपादक को सहेजें और बंद करें esc --> :wq

रिमोट का उपयोग करके पुश करें:

$ git push origin branch-name --force

2
संक्षिप्त और प्रभावी, विस्तृत:
terwxqian

22

केवल branchकाम करने और काम करने से बहुत सारी समस्याओं से बचा जा सकता है master:

git checkout -b mybranch

निम्नलिखित कार्य remoteपहले से ही धकेल दिए गए और धकेल दिए गए मिश्रणों का मिश्रण remote/ localकेवल शुरू होता है:

# example merging 4 commits

git checkout mybranch
git rebase -i mybranch~4 mybranch

# at the interactive screen
# choose fixup for commit: 2 / 3 / 4

git push -u origin +mybranch

मेरे पास कुछ पुल अनुरोध नोट भी हैं जो मददगार हो सकते हैं।


17

git rebase -i master

आपको एडिटर vm ओपन मिलेगा और msgs कुछ इस तरह से

Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more

यहां मैंने अन्य सभी हिट्स के लिए पिक को "एफ" में बदल दिया है (स्टेंड्स फॉर फिक्सअप)।

git push -f origin feature/feature-branch-name-xyz

यह सभी कमिट्स को एक कमिट में ठीक कर देगा और अन्य सभी कमिट्स को हटा देगा। मैंने ऐसा किया और इससे मुझे मदद मिली।


3

जब आप गिटलैब या जीथब के साथ काम कर रहे होते हैं तो आप इस तरह से परेशानी में पड़ सकते हैं। आप ऊपर दिए गए किसी एक तरीके से अपना कमिटमेंट स्क्वैश करते हैं। मेरी पसंद है:

git rebase -i HEAD~4
or
git rebase -i origin/master

अपनी प्रतिबद्धता के लिए स्क्वैश या फ़िक्सअप चुनें। इस बिंदु पर आप गिट स्थिति के साथ जाँच करेंगे। और संदेश हो सकता है:

    On branch ABC-1916-remote
    Your branch and 'origin/ABC-1916' have diverged,
    and have 1 and 7 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)

और आपको इसे खींचने के लिए लुभाया जा सकता है। ऐसा न करें या आप पहले जैसी स्थिति में रहेंगे।

इसके बजाय अपने मूल के साथ धक्का:

git push origin +ABC-1916-remote:ABC-1916

+ केवल एक शाखा को धक्का देने के लिए मजबूर करने की अनुमति दें।


खींचने पर कुछ भी गलत नहीं है, विशेष रूप से यदि आपके पास संघर्ष है तो वे आसान से हल किए जा सकते हैं यदि आप धक्का देते हैं
Ray_Poly

2

निम्नलिखित दो कार्य करने के लिए, जिनमें से एक को पहले ही धकेल दिया गया था, निम्नलिखित पर काम किया गया:

git rebase -i HEAD~2
    [ pick     older-commit  ]
    [ squash   newest-commit ]
git push --force

डिफ़ॉल्ट रूप से, इसमें पुरानी प्रतिबद्ध पर टिप्पणी के रूप में नवीनतम प्रतिबद्ध का संदेश शामिल होगा।


2

1) git rebase -i HEAD~4

विस्तृत करने के लिए: यह वर्तमान शाखा पर काम करता है; HEAD ~ 4 का अर्थ है नवीनतम चार कमिट्स को स्क्वैश करना; इंटरैक्टिव मोड (-आई)

2) इस बिंदु पर, संपादक ने कॉमिट्स की सूची के साथ, दूसरी और निम्नलिखित कमिट्स को बदलने के लिए, स्क्वैश के साथ पिक की जगह, फिर इसे बचा लिया।

आउटपुट: सफलतापूर्वक रिबेड और अपडेटेड रिफ / हेड / ब्रांच-नेम।

3) git push origin refs/heads/branch-name --force

उत्पादन:

remote:
remote: To create a merge request for branch-name, visit:
remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
remote:To ip:sc/server.git
 + 84b4b60...5045693 branch-name -> branch-name (forced update)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.