एक नया (और खाली!) "रूट" शाखा कैसे बनाएँ?


135

मैं इस गिट रिपॉजिटरी में एक नई "रूट" शाखा को परिभाषित करना चाहूंगा। "रूट" शाखा से मेरा मतलब है कि एक शाखा जो भंडार 1 में अन्य सभी शाखाओं से पूरी तरह से स्वतंत्र है ।

दुर्भाग्य से, Aरेपो के पेड़ के बहुत आधार पर भी कमिट (इसे कहते हैं ) में बहुत सारी फाइलें हैं (यह एक रिपॉजिटरी थी जिसे पहले से ही काफी परिपक्व प्रोजेक्ट पर आरंभीकृत किया गया था)।

इसका मतलब यह है कि भले ही मैंने Aनई शाखा के रूप में दिया था <start-point>, यह नई शाखा "क्लीन स्लेट" से शुरू नहीं होगी, बल्कि इसमें वे सभी फाइलें होंगी जो अंदर प्रतिबद्ध थीं A

क्या कोई तरीका है जिससे मैं इस भंडार में पूरी तरह से नंगी शाखा बना सकूँ, जहाँ <start-point>तक Aसंभव हो?


1 BTW, यह एक नया रेपो बनाने के बराबर नहीं है । अलग-अलग रेपो कई कारणों से कम सुविधाजनक होंगे।


संपादित करें : ठीक है, यह वही है जो मैंने किया, vcsjones के उत्तर पर आधारित :

# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)

# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .

# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)

# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch

# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.

rm .git/info/grafts

यद्यपि यह प्रक्रिया थोड़ी सी शामिल है, लेकिन अंतिम परिणाम एक खाली आधार है जो <start-point>किसी भी नई "क्लीन-स्लेट शाखा" के रूप में काम कर सकता है ; सब मुझे करना होगा तो है

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)

भविष्य में मैं हमेशा इस तरह के नए रिपोजिटरी बनाऊंगा:

git init
git commit --allow-empty -m 'base commit (empty)'

... ताकि पहली प्रतिबद्धता खाली हो , और हमेशा एक नई स्वतंत्र शाखा शुरू करने के लिए उपलब्ध हो। (यह होगा, मुझे पता है, एक बहुत ही कम सुविधा की जरूरत है, लेकिन यह आसानी से उपलब्ध कराने के लिए काफी सरल है।)


का डुप्लीकेट stackoverflow.com/questions/13969050/...
Anonymoose

1
@ अनामिका: केवल रिकॉर्ड के लिए (बहस के बजाय): मैं आपकी राय से असहमत हूं।
15

1
वहाँ पर आधारित एक बहुत सरल समाधान प्रतीत होता है git rebase --onto, देखें stackoverflow.com/questions/645450/…
स्टीफन गौरिचोन

जवाबों:


223

--orphanशाखा बनाते समय उपयोग करें :

git checkout --orphan YourBranchName

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

पर एक नजर डालें आदमी पेज --orphan बारे में अधिक जानकारी के लिए चेकआउट के लिए।


क्या यह अनिवार्य रूप से एक खाली स्लेट बनाता है? के रूप में, खरोंच से? या यह आपके सभी पिछले बदलावों को रखता है, लेकिन सिर्फ गिट इतिहास में नहीं?
कॉन एंटोनकोस

4
@ConAntonakos यह बिना माता-पिता के एक नई शाखा बनाता है। अन्य शाखाएं अप्रभावित हैं, उनके सभी परिवर्तन रखे गए हैं।
फ़ूज

11

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

$ git checkout --orphan dev2
Switched to a new branch 'dev2'
$ git reset # unstage all the files, you probably don't want to commit all of them
$ git commit --allow-empty -m 'Initial empty commit'
[dev2 (root-commit) a515c28] Initial empty commit

1
मेरा मानना ​​है कि यह 2012 के रूप में आवश्यक नहीं है क्योंकि आप रूट पर रिबेस कर सकते हैं ।
टिम्मम्म

1

यदि आप git का उपयोग करते हैं २.२३ या इसके बाद के संस्करण का उपयोग करने के लिए git switchऔरgit restore इसके बजाय आपका उपयोग किया जा सकता है git checkout। यदि हां, तो ध्वज इस उत्तर में उल्लिखित के समान ही है ।

git switch --orphan YourBranchHere

1

क्या कोई तरीका है जिससे मैं इस भंडार में पूरी तरह से नंगी शाखा बना सकूं।

उपयोग करने के लिए वास्तविक आदेश (Git 2.28+ के साथ) है:

git switch --discard-changes --orphan newBranch
# or
git switch -f --orphan newBranch

git switchGit 2.23 (अगस्त 2019) से उपलब्ध है, और पुराने भ्रामक git checkoutकमांड को बदल देता है ।

लेकिन मैं Git 2.28 (Q3 2020) की सिफारिश करूंगा, क्योंकि git switch --discard-changes --orphanउस संस्करण में अनुकूलित किया गया है।

देखें 8d3e33d , 8186128 (21 मई 2020) को ब्रायन एम। कार्लसन ( bk2204)
(द्वारा विलय Junio सी Hamano - gitster- में ded44af प्रतिबद्ध , 09 जून 2020)

builtin/checkout: मेटाडेटा आरंभीकरण को सरल बनाएं

साइन-ऑफ-बाय: ब्रायन एम। कार्लसन
समीक्षित द्वारा: डेरिक Stolee

जब हम कहते हैं init_checkout_metadataमें reset_tree,हम के सवाल में प्रतिबद्ध है ताकि यह फिल्टर करने के लिए पारित किया जा सकता है, या कोई प्रतिबद्ध, पेड़ अगर वहाँ ऑब्जेक्ट ID पास करना चाहते हैं।

हमने इस बाद वाले मामले का अनुमान लगाया, जो चेकआउट कोड में कहीं और हो सकता है, लेकिन यह यहां नहीं हो सकता।

एकमात्र मामला जिसमें हमारे पास एक प्रतिबद्ध वस्तु नहीं है, जब git switchसाथ आमंत्रित किया जाता है --orphan

इसके अलावा, हम केवल इस कोड पथ हिट के बिना एक साथ या तो अतिरिक्त वस्तु प्रतिबद्ध कर सकते हैं --forceया --discard-changes

ऐसे मामले में, कमिट या मेटाडेटा के साथ चेकआउट मेटाडेटा को शुरू करने का कोई मतलब नहीं है क्योंकि

  • (ए) कोई प्रतिबद्ध नहीं है, केवल खाली पेड़ है, और
  • (b) हम कभी भी डेटा का उपयोग नहीं करेंगे, क्योंकि बिना किसी फाइल के किसी शाखा की जांच करने पर कोई फाइल स्मूद नहीं होगी।

इस मामले में ऑल-जीरो ऑब्जेक्ट आईडी पास करें, क्योंकि हमें बस कुछ मूल्य की आवश्यकता है जो कि एक वैध सूचक है।

परीक्षा:

git switch master
echo foo >foo.txt
git switch --discard-changes --orphan new-orphan2
git ls-files >tracked-files
# test_must_be_empty tracked-files
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.