एक नई परियोजना के लिए एक नई खाली शाखा बनाना


351

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

हम वह कैसे कर सकते है?

मैंने कुछ चीजों की कोशिश की, लेकिन उन्होंने काम नहीं किया।

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

यह शाखा को ठीक करने के लिए धक्का देता है, लेकिन जब मैं एक भ्रूण या पुल करता हूं, तो यह अन्य शाखाओं से जानकारी डाउनलोड करता है, और फिर मुझे अन्य परियोजनाओं से कुछ अतिरिक्त फाइलें भी मिलती हैं। सबसे अच्छा उपाय क्या है?


11
आपको इसे शाखा में संग्रहीत करने की आवश्यकता क्यों है? शाखाएं आमतौर पर समान कोड आधार से कुछ विचलन के लिए होती हैं। शायद सिर्फ एक नया भंडार शुरू करना एक बेहतर समाधान होगा।
बेंजामिन बैनियर

2
ठीक है, हमने इसे IIRC से पहले किया था, और मैं इसे फिर से करना चाहूंगा, इसलिए मैं उत्सुक हूं;)
fazineroso

3
"एक नई परियोजना के लिए" - जैसा कि @ होंक मैं इसे एक नए रिपॉजिटरी में डालने का सुझाव दूंगा। उन्हें एकीकृत करने के लिए वहाँ से दो विकल्प। submoduleमूल परियोजना में इसे बनाएं , जैसे docs/कि अन्य रेपो की ओर इशारा करते हुए। या, यदि आप बाद में कोड को मर्ज करना चाहते हैं, तो इसे रिमोट के रूप में जोड़ें।
gertvdijk

1
अनाथ दृष्टिकोण का एक अतिरिक्त नकारात्मक पहलू यह है कि आपको अपनी .gitignore'डी फाइलें' रखने की जरूरत है , और लगातार दो जड़ों (शाखाओं) के बीच स्विच करना चाहिए। इसलिए मैं नए रेपो दृष्टिकोण के लिए भी हूं, एक नए फ़ोल्डर में, एक ही रिमूव होने के लिए, और दूसरी शाखा में धकेलूंगा।
सिमो

जवाबों:


666

आप एक अनाथ के रूप में एक शाखा बना सकते हैं:

git checkout --orphan <branchname>

यह बिना माता-पिता के साथ एक नई शाखा बनाएगा। उसके बाद, आप इसके साथ काम करने वाली निर्देशिका को साफ कर सकते हैं:

git rm --cached -r .

और प्रलेखन फाइलें जोड़ें, उन्हें प्रतिबद्ध करें और उन्हें गीथब तक धकेलें।

सभी दूरस्थ शाखाओं के बारे में स्थानीय जानकारी को एक पुल या फ़ेच हमेशा अपडेट करेगा। यदि आप किसी एकल दूरस्थ शाखा के लिए केवल जानकारी खींचना / प्राप्त करना चाहते हैं, तो आपको इसे निर्दिष्ट करने की आवश्यकता है।


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

12
जब जारी करना git checkout --orphan <branch>; मुझे <शाखा> की कोई सूची दिखाई नहीं दे रही है git branch
संतोष कुमार

51
git checkout --orphanएक के बाद एक git reset --hardबाईं फ़ाइलों को हटाने के लिए उपयोग कर सकते हैं ।
इल्या कोज़ेवनिकोव

16
कारण यह है कि आप शाखा को नहीं देखते हैं git checkout --orphan <branch>क्योंकि यह अभी तक कोई कमिट नहीं है। पहली प्रतिबद्धताओं के बाद git branchनई शाखा प्रिंट करती है।
Krøllebølle

13
git क्लीन -fd अनटैक की गई फाइल्स को हटा देता है।
स्टेफगोस्सेलिन

71

एक अनाथ शाखा बनाने के लिए सही उत्तर है। मैं अपने ब्लॉग पर इस बारे में विस्तार से बताता हूं। (संग्रहीत लिंक)

...

शुरू करने से पहले, GIT के नवीनतम संस्करण में अपग्रेड करें। यह सुनिश्चित करने के लिए कि आप नवीनतम संस्करण चला रहे हैं, चलाएं

which git

यदि यह एक पुराने संस्करण से बाहर निकलता है, तो आपको अपने PATH को उस फ़ोल्डर के साथ संवर्धित करना पड़ सकता है जिस संस्करण को आपने अभी स्थापित किया है।

ठीक है, हम तैयार हैं। अपने git चेकआउट वाले फ़ोल्डर में cd करने के बाद, एक अनाथ शाखा बनाएँ। इस उदाहरण के लिए, मैं "mybranch" शाखा का नाम दूंगा।

git checkout --orphan mybranch

अनाथ शाखा में सब कुछ हटा दें

git rm -rf .

कुछ बदलाव करें

vi README.txt

बदलाव जोड़ें और करें

git add README.txt
git commit -m "Adding readme file"

बस। अगर तुम दौड़ते हो

git log

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

git checkout master

आप दौड़कर अनाथ शाखा में लौट सकते हैं

git checkout mybranch

16
लिंक-केवल उत्तरों को प्रोत्साहित नहीं किया जाता है। यदि लिंक को स्थानांतरित या हटा दिया जाता है, तो आपका उत्तर बेकार हो जाता है। बहुत ही सीधे उत्तर में आवश्यक भागों को जोड़ने पर विचार करें। उन मुद्दों पर विशेष ध्यान दें जो पूर्व उत्तरों से नहीं आते हैं।
बाइटबस्टर

3
लिंक अब मान्य नहीं है, दुर्भाग्य से।
एलेक्सी

1
अभिलेखागार एक अद्भुत चीज है।
lucid_dreamer

3
यह केवल काम करने वाली निर्देशिका में सब कुछ हटाने के लिए खतरनाक है, क्योंकि किसी भी गैर-तुच्छ परियोजना में अनट्रैक फाइलें (कॉन्फ़िगरेशन, पर्यावरण, कैश, आदि) होंगी।
स्लाव फोमिन II

12

इस तरह एक खाली नई शाखा बनाएं:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

यदि आपकी प्रोज-डॉक फाइलें पहले से ही एक सिंगल सबडिर के तहत कमिट में हैं, तो आप नई ब्रांच को इस तरह से बना सकते हैं:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

जो अधिक सुविधाजनक हो सकता है git branch --orphanअगर वह आपको बहुत कुछ git rmऔर git mvकरने के लिए छोड़ देगा।

प्रयत्न

git branch --set-upstream proj-doc origin/proj-doc

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


1
यह उत्तर दिलचस्प है क्योंकि यह आपको पूरी तरह से खाली पहले प्रतिबद्ध के साथ एक और शाखा / रूट शुरू करने की अनुमति देता है।
स्टीफन गौरिचोन

खाली शाखा बनाने का एक और तरीका है यदि आप इसे करने के लिए बुरा नहीं git checkout --orphan new-branch; git reset --hard
मानते हैं

का उपयोग क्या है xargs?
फ्लक्स

@ फ़्लक्स यह कमिट-ट्री आर्ग के रूप में ट्री आईडी को प्राप्त करने का एक और तरीका है।
jthill

मैं वास्तव में इस दृष्टिकोण को पसंद करता हूं, क्योंकि यह आपकी वर्तमान शाखा को छोड़ने के बिना एक खाली नई शाखा बनाने की अनुमति देता है, साथ ही तथ्य यह है कि प्रारंभ बिंदु के रूप में एक खाली प्रतिबद्ध है।
ब्राइस

8

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

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

कुछ काम करने के बाद:

git add -A
git commit -m <message>
git push origin <newbranch>

2
सावधान रहें, git cleanउन फ़ाइलों को हटा सकते हैं जिन्हें आप हटाना नहीं चाहते हैं! भागो git clean -ndxक्या इससे पहले कि आप के साथ वास्तविक के लिए इसे चलाने हटा देंगे फ़ाइलों को देखने के लिए पहले -fविकल्प।
लस्सी

7

मान लें कि आपके पास masterफ़ाइलों / निर्देशिकाओं के साथ एक शाखा है:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

खाली शाखा बनाने के लिए कदम से कदम:

  1. git checkout —orphan new_branch_name
  2. निम्नलिखित कमांड निष्पादित करने से पहले सुनिश्चित करें कि आप सही निर्देशिका में हैं:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

चरण 2 में, हम आपकी नई शाखा की फ़ाइलों के साथ भ्रम की स्थिति से बचने के लिए स्थानीय स्तर पर सभी फ़ाइलों को हटा देते हैं और जिन्हें आप रखते हैं master शाखा में रखते हैं। फिर, हम चरण 3 में उन सभी फ़ाइलों को अनलिंक करते हैं। अंत में, चरण 4 और उसके बाद हमारी नई खाली शाखा के साथ काम कर रहे हैं।

एक बार हो जाने के बाद, आप आसानी से अपनी शाखाओं के बीच स्विच कर सकते हैं:

git checkout master 
git checkout new_branch

1

आधार पर हीरी नोमस के इस जवाब पर

आप एक अनाथ के रूप में एक शाखा बना सकते हैं:

git checkout --orphan <branchname>

यह बिना माता-पिता के साथ एक नई शाखा बनाएगा। उसके बाद, आप इसके साथ काम करने वाली निर्देशिका को साफ कर सकते हैं:

git rm --cached -r .

और फिर आप सिर्फ खाली प्रतिबद्ध के साथ शाखा करते हैं और फिर धक्का देते हैं

git commit -m <commit message> --allow-empty
git push origin <newbranch>

1

की जाँच करें इस दस्तावेज़ , इसके बारे में स्पष्ट विवरण है

--orphan <new_branch>
नाम से एक नई अनाथ शाखा का निर्माण <new_branch>किया<start_point> और उस पर स्विच करें। इस नई शाखा पर किए गए पहले कमिट में कोई माता-पिता नहीं होंगे और यह अन्य सभी शाखाओं से पूरी तरह से डिस्कनेक्ट और कमिट होने पर एक नए इतिहास की जड़ होगी।

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


1
किसी समाधान का लिंक स्वागत योग्य है, लेकिन कृपया सुनिश्चित करें कि आपका उत्तर इसके बिना उपयोगी है: लिंक के चारों ओर संदर्भ जोड़ें ताकि आपके साथी उपयोगकर्ताओं को कुछ पता चले कि यह क्या है और यह क्यों है, तो पृष्ठ के सबसे प्रासंगिक हिस्से को उद्धृत करें ' लक्ष्य पृष्ठ अनुपलब्ध होने की स्थिति में पुनः लिंक करना। एक लिंक से थोड़ा अधिक उत्तर देने वाले उत्तर हटाए जा सकते हैं।
युनानोश

1

मुझे यह मदद मिली:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.