কীভাবে একটি নতুন (এবং খালি!) "মূল" শাখা তৈরি করবেন?


135

আমি এই গিট সংগ্রহস্থলটিতে একটি নতুন "মূল" শাখা সংজ্ঞায়িত করতে চাই। "রুট" শাখা দ্বারা আমি একটি শাখা বোঝা যা সংগ্রহস্থল 1 এর অন্যান্য সমস্ত শাখার চেয়ে সম্পূর্ণ স্বতন্ত্র ।

দুর্ভাগ্যক্রমে, এমনকি Aরেপোর কমিট ট্রিটির একেবারে বেসে কমিট (আসুন আমরা এটি কল করি ) এর মধ্যেও প্রচুর ফাইল রয়েছে (এটি একটি সংগ্রহস্থল যা ইতিমধ্যে যথেষ্ট পরিপক্ক প্রকল্পের সূচনা হয়েছিল)।

এর অর্থ হ'ল আমি যদি Aনতুন শাখার হিসাবে দিয়েছি তবে <start-point>এই নতুন শাখাটি "ক্লিন স্লেট" থেকে শুরু হবে না, বরং এতে প্রতিশ্রুতিবদ্ধ সমস্ত ফাইল থাকবে A

সম্ভব <start-point>হওয়ার কাছাকাছিভাবে এই ভাণ্ডারগুলিতে আমি একটি সম্পূর্ণ খালি শাখা তৈরি করতে পারি এমন কোনও উপায় আছে A?


1 বিটিডাব্লু, এটি একটি নতুন রেপো তৈরির সমতুল্য নয় । পৃথক ভাণ্ডার অনেক কারণে কম সুবিধাজনক হবে।


সম্পাদনা : ঠিক আছে, ভিসিএস জোনের উত্তরের ভিত্তিতে আমি এটিই করেছি :

# 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)'

... যাতে প্রথম প্রতিশ্রুতি খালি থাকে এবং নতুন স্বাধীন শাখা শুরু করার জন্য সর্বদা উপলব্ধ থাকে। (এটি আমি জানি, খুব কমই প্রয়োজনীয় একটি সুবিধা হলেও এটি সহজেই সহজলভ্য করে তোলা সহজ প্রচেষ্টা নয় is)



1
@ অজ্ঞাতনামা: কেবল রেকর্ডের জন্য (বিতর্ক না করে): আমি আপনার মতামতের সাথে একমত নই।
kjo

1
একটা অনেক সহজ উপর ভিত্তি করে সমাধান হবে বলে মনে হয় git rebase --ontoদেখতে stackoverflow.com/questions/645450/...
Stéphane Gourichon

উত্তর:


223

--orphanশাখা তৈরি করার সময় ব্যবহার করুন :

git checkout --orphan YourBranchName

এটি শূন্যে কমিট করে একটি নতুন শাখা তৈরি করবে, তবে আপনার সমস্ত ফাইল মঞ্চস্থ হবে। এই মুহুর্তে আপনি কেবল এগুলি সরাতে পারেন।
("এগুলি সরিয়ে ফেলুন": এ git reset --hardসূচকটি খালি করবে, আপনাকে একটি খালি কাজের গাছ রেখে দেবে)

কটাক্ষপাত man পৃষ্ঠা --orphan উপর আরও তথ্যের জন্য চেকআউট জন্য।


এটি কি মূলত একটি ফাঁকা স্লেট তৈরি করে? হিসাবে হিসাবে, স্ক্র্যাচ থেকে? বা এটি আপনার সমস্ত পূর্ববর্তী পরিবর্তনগুলি রাখে, তবে কেবল গিট ইতিহাসে নয়?
কন আন্তোনাকোস

4
@ কনআন্টোনাকোস এটি পিতামাতাকে ছাড়াই একটি নতুন শাখা তৈরি করে। অন্যান্য শাখাগুলি ক্ষতিগ্রস্থ নয়, তাদের সমস্ত পরিবর্তন রাখা আছে।
ফুজ

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
আমি বিশ্বাস করি এটি ২০১২ সালের মতো প্রয়োজনীয় নয় কারণ আপনি মূলটিতে পুনরায় চালু করতে পারেন ।
টিম্ম্ম্ম

1

আপনি যদি ২.২৩ বা তার বেশি গিট ব্যবহার করেন তবে আপনি এর পরিবর্তে 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 switchগিট ২.২৩ (আগস্ট 2019) থেকে পাওয়া যায় এবং পুরানো বিভ্রান্ত git checkoutআদেশটি প্রতিস্থাপন করে ।

তবে আমি গিট 2.28 (কিউ 32020) এর সুপারিশ করব, কারণ git switch --discard-changes --orphanসেই সংস্করণটিতে অনুকূলিত হয়েছে।

কমিট 8 ডি 3 ই 33 ডি দেখুন , প্রতিশ্রুতি 8186128 (21 মে 2020) ব্রায়ান মি। কার্লসন ( bk2204)
(দ্বারা একীভূত junio সি Hamano - gitster- মধ্যে ded44af কমিট , 09 জুন 2020)

builtin/checkout: মেটাডাটা সূচনাটি সহজ করুন

সাইন-অফ-বাই: ব্রায়ান মি। কার্লসন
পর্যালোচনা দ্বারা: ডেরিক স্টোলি

আমরা যখন কল init_checkout_metadataমধ্যে reset_tree,আমরা প্রশ্নে কমিট যাতে এটি ফিল্টার প্রেরণ করা যেতে পারে, অথবা না কমিট বৃক্ষ আছে যদি বস্তুর আইডি পাস করতে চাই।

আমরা এই উত্তরোত্তরটি দেখেছিলাম, যা চেকআউট কোডের অন্য কোথাও ঘটতে পারে তবে এটি এখানে ঘটতে পারে না।

শুধুমাত্র যদি যা আমরা একটি অবজেক্টকে কমিট না যখন invoking হয় git switchসঙ্গে --orphan

তদুপরি, আমরা কেবল কোনও --forceবা কোনও সাথে কমিটমেন্ট অবজেক্ট ছাড়াই এই কোড পাথটিকে হিট করতে পারি --discard-changes

এই জাতীয় ক্ষেত্রে, প্রতিশ্রুতি বা গাছের সাহায্যে চেকআউট মেটাডেটা আরম্ভ করার কোনও অর্থ নেই কারণ এটি

  • (ক) কোন প্রতিশ্রুতি নেই, কেবল খালি গাছ এবং
  • (খ) আমরা কখনই ডেটা ব্যবহার করব না, যেহেতু কোনও ফাইল ছাড়াই কোনও শাখা পরীক্ষা করার সময় কোনও ফাইলই হতাহত হবে না।

এক্ষেত্রে অল-জিরোজ অবজেক্ট আইডি পাস করুন, যেহেতু আমাদের কেবল কিছু মান দরকার যা বৈধ পয়েন্টার।

টেস্ট:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.