2013-02-22 18 views
93

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

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

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

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


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 init 
git commit --allow-empty -m 'base commit (empty)' 

... ताकि पहले प्रतिबद्ध खाली है, और हमेशा: सब मैं तो क्या करने की जरूरत होगी

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

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

+0

की डुप्लीकेट http://stackoverflow.com/questions/13969050/how-to-create-a-new-empty-branch-for-a-new-project – Anonymoose

+1

@: मन आपको चाहिए में उन लोगों के साथ Anonymoose: बस रिकॉर्ड के लिए (बहस के बजाय): मैं आपकी राय से असहमत हूं। – kjo

+1

'गिट रीबेज --onto'' के आधार पर एक बहुत ही सरल समाधान प्रतीत होता है, http://stackoverflow.com/questions/645450/insert-a-commit-before-the-root-commit-in-git –

उत्तर

151

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

git checkout --orphan YourBranchName 

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

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

+0

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

+1

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

1

स्वीकार्य उत्तर में जोड़ने के लिए - best practice स्वच्छ स्थिति पर वापस जाने के लिए an initial empty commit बनाना है ताकि आप पोस्टरिटी के लिए अपनी शाखाएं सेट करते समय आसानी से रीबेस कर सकें। इसके अलावा, क्योंकि आप एक स्वच्छ स्थिति चाहते हैं, संभवतः आपने ऐसी फाइलें की हैं जिन्हें आपको नहीं करना चाहिए, इसलिए आपको उन्हें इंडेक्स से हटाना होगा।

$ 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 
संबंधित मुद्दे