2009-03-02 17 views
123

मान लीजिए कि मेरे पास 5 स्थानीय काम हैं। मैं केवल उनमें से 2 को केंद्रीकृत रेपो (एक एसवीएन-शैली वर्कफ़्लो का उपयोग करके) में धक्का देना चाहता हूं। मैं यह कैसे करु?आप अपने कुछ स्थानीय गिट्स को कैसे दबाते हैं?

यह काम नहीं किया:

git checkout HEAD~3 #set head to three commits ago 
git push #attempt push from that head 

बस इतना ही 5 स्थानीय प्रतिबद्ध धक्का समाप्त होता है।

मुझे लगता है कि मैं वास्तव में अपने कामों को पूर्ववत करने के लिए गिट रीसेट कर सकता हूं, इसके बाद गिट स्टैश और उसके बाद गिट पुश - लेकिन मुझे पहले से ही लिखित संदेश और फाइल व्यवस्थित कर दी गई हैं और मैं उन्हें फिर से नहीं लेना चाहता हूं।

मेरी भावना यह है कि धक्का या रीसेट करने के लिए पारित कुछ झंडा काम करेगा।

यदि यह मदद करता है, यहाँ मेरी Git config

[ramanujan:~/myrepo/.git]$cat config 
[core] 
     repositoryformatversion = 0 
     filemode = true 
     bare = false 
     logallrefupdates = true 
[remote "origin"] 
     url = ssh://server/git/myrepo.git 
     fetch = +refs/heads/*:refs/remotes/origin/* 
[branch "master"] 
     remote = origin 
     merge = refs/heads/master 

उत्तर

153

अपने प्रतिबद्ध मान लिया जाये कि मास्टर शाखा पर हैं और आप उन्हें दूरदराज के मास्टर शाखा को पुश करने के लिए करना चाहते हैं: आप Git-SVN उपयोग कर रहे थे

$ git push origin master~3:master 

:

$ git svn dcommit master~3 

के मामले में गिट-एसवीएन, आप हेड ~ 3 का भी उपयोग कर सकते हैं, क्योंकि यह एक प्रतिबद्धता की उम्मीद कर रहा है। सीधे गिट के मामले में, आपको शाखा नाम का उपयोग करने की आवश्यकता है क्योंकि रेडस्पेक में HEAD का मूल्यांकन ठीक से नहीं किया जाता है।

तुम भी की एक लंबी दृष्टिकोण ले सकता है: यदि आप कार्य प्रवाह के इस प्रकार की एक आदत बना रहे हैं

$ git checkout -b tocommit HEAD~3 
$ git push origin tocommit:master 

, तो आप एक अलग शाखा में अपना काम कर रही है विचार करना चाहिए। फिर आप कुछ ऐसा कर सकते हैं:

$ git checkout master 
$ git merge working~3 
$ git push origin master:master 

ध्यान दें कि "मूल मास्टर: मास्टर" भाग शायद आपके सेटअप के लिए वैकल्पिक है।

+10

नोट: आपको 'मास्टर ~ 3' का उपयोग करने की आवश्यकता नहीं है। वांछित "अप टू" प्रतिबद्धता का कोई भी संदर्भ समान रूप से मान्य है, जैसे 'HEAD ~ 3' या' HEAD ~~~ ', या विशिष्ट SHA, या एक टैग जो प्रतिबद्ध करता है। – Kaz

+1

अच्छी चीजें। हालांकि एक चेतावनी: ये उदाहरण मूल मास्टर को धक्का देते हैं। यदि आप इस समाधान की प्रतिलिपि बना रहे हैं और चिपका रहे हैं, तो आप गलती से मास्टर शाखा को अपडेट कर सकते हैं। (बेशक, आपको हमेशा 'गिट पुश' जारी करने से पहले सावधान रहना चाहिए और अपने आदेश को दोबारा जांचना चाहिए ...) – nofinator

+0

ऐसा प्रतीत होता है कि यह प्रतिबद्धता को धक्का देता है, लेकिन शाखा को दूरस्थ रूप से नहीं जोड़ता है। – Nateowami

15

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

मेरी मास्टर शाखा में अपस्ट्रीम से परिवर्तन खींचने के बाद, मैं git checkout work और git rebase master। यह इतिहास के अंत में होने के लिए मेरे सभी स्थानीय परिवर्तनों को फिर से लिखता है।

मैं वास्तव में इस वर्कफ़्लो के साथ git svn का उपयोग कर रहा हूं, इसलिए मेरे "पुश" ऑपरेशन में git svn dcommit शामिल है। मैं tig का भी उपयोग करता हूं जो कि एक अच्छा टेक्स्ट मोड गुई रिपोजिटरी व्यूअर है, जो चेरी को मास्टर के लिए उपयुक्त काम करता है।

+0

, आप एक अप करने के लिए dcommit के लिए प्रतिबद्ध निर्दिष्ट कर सकते हैं, तो वांछित प्रभाव Git-svn के साथ काफी तुच्छ है। –

+0

इस दृष्टिकोण के नुकसान हैं (यहां संक्षेप में http://stackoverflow.com/a/881014/1116674)। एक अच्छा विकल्प है कि आप जिस सुविधा पर काम कर रहे हैं, और 'कार्य' शाखा के लिए शाखाएं बनाना है। फिर, आप विशिष्ट शाखाओं को 'मास्टर' में विलय करते हैं ताकि आप उन पर इतिहास न खोएं। 'कार्य' के साथ काम करते समय, आप अपनी सभी शाखाओं को इसमें विलय करते हैं। यह अधिक ओवरहेड है, लेकिन कुछ मामलों में इसका लायक हो सकता है। – Hudon

11

डिफ़ॉल्ट रूप से, गिट-पुश सभी शाखाओं को धक्का देता है। आप ऐसा करते हैं जब:

git checkout HEAD~3 #set head to three commits ago 
git push #attempt push from that head 

आप एक अलग सिर पर ले जाने के (आप किसी भी शाखा पर नहीं कर रहे हैं) और फिर आप दूरस्थ करने के लिए स्थानीय गुरु (जो अब भी है, जहां यह था) सहित सभी शाखाओं, धक्का मास्टर।

मैनुअल समाधान है: (! और खतरनाक): तो फिर

[remote.origin] 
    push = HEAD 

git push origin HEAD:master 

आप भ्रमित सभी शाखाओं को आगे बढ़ाने के डिफ़ॉल्ट व्यवहार को मिल जाए, अपने ~/.gitconfig में जोड़ना केवल जिस शाखा पर आप हैं, उसे धक्का दिया जाता है। अपने उदाहरण (एक अलग सिर) में, आप इस त्रुटि संदेश मिला होता, बल्कि गलती से गलत प्रतिबद्ध दबाव डालने के बजाए:

error: unable to push to unqualified destination: HEAD 
4

1) यदि आप चाहते हैं आपकी प्रतिबद्ध पुन: व्यवस्थित करने के लिए, "Git रिबेस" का प्रयोग करें।

git rebase -i 

यह आदेश अपने संपादक में कुछ इस तरह प्रदर्शित (मैं vim उपयोग कर रहा हूँ)

pick 4791291 commitA 
pick a2bdfbd commitB 
pick c3d4961 commitC 
pick aa1cefc commitD 
pick 9781434 commitE 

# Rebase .............. 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# x, exec = run command (the rest of the line) using shell 
# 
# These lines can be re-ordered; they are executed from top to bottom. 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
# However, if you remove everything, the rebase will be aborted. 
# 
# Note that empty commits are commented out 




^G Get Help   ^O WriteOut   ^R Read File  ^Y Prev Page    ^K Cut Text   ^C Cur Pos 
^X Exit    ^J Justify   ^W Where Is   ^V Next Page   ^U UnCut Text  ^T To Spell 

2) सरल कटौती पेस्ट से अपनी पसंद के अनुसार अपने अपने प्रतिबद्ध पुन: व्यवस्थित होगा। मान लीजिए नए आदेश

commitC c3d4961 9,781,434 commite लेने

पिकअप

4791291 commitA

ले लेने commitD aa1cefc

पिकअप a2bdfbd commitB

अपने संपादक में इन परिवर्तनों को करने है और ctrl + O (writeOut)

दबाएं

या आप भी उपयोग कर सकते हैं

git rebase -i HEAD~<commitNumber> 

आप

git log 

3) के साथ नया अनुक्रम जाँच कर सकते हैं अब का उपयोग

git push <remoteName> <commit SHA>:<remoteBranchName> 

तो दूरस्थ (मूल में केवल एक ही शाखा) और एक स्थानीय (मास्टर) पर, बस

git push <commit SHA> 
git push aa1cefc 
का उपयोग करें

यह प्रतिबद्ध बी और प्रतिबद्ध डी को धक्का देगा।

3

लघु जवाब:

git push <latest commit SHA1 until you want commits to be pushed>

उदाहरण:

git push fc47b2

git push HEAD~2

लांग जवाब:

करता है एक साथ जुड़े हुए हैं माता-पिता/बाल तंत्र के साथ एक श्रृंखला के रूप में।इस प्रकार, एक प्रतिबद्ध धक्का वास्तव में भी धक्का सभी माता-पिता इस के लिए करता प्रतिबद्ध जहां दूरदराज के लिए नहीं जाना है। यह पूरी तरह से किया जाता है जब आप git push वर्तमान प्रतिबद्धता: सभी पिछली प्रतिबद्धताओं को भी धक्का दिया जाता है क्योंकि यह आदेश git push HEAD के बराबर है।

तो प्रश्न में फिर से लिखा जा सकता है कि एक विशिष्ट प्रतिबद्धता को कैसे दबाया जाए और यह विशिष्ट प्रतिबद्धता हेड ~ 2 हो सकती है, उदाहरण के लिए।

यदि आप जो काम करना चाहते हैं वह निरंतर नहीं है, तो विशिष्ट पुश से पहले git rebase -i के साथ उन्हें फिर से ऑर्डर करें।

Git SVN dcommit साथ
संबंधित मुद्दे