টানার অনুরোধের মাধ্যমে কোনও মার্জটি পূর্বাবস্থায় ফিরবেন?


159

কেউ একটি টানার অনুরোধ গ্রহণ করেছে যা তাদের উচিত নয়। এখন আমাদের কাছে গুচ্ছ ভাঙা কোডের একগুচ্ছ মিশ্রিত হয়েছে a আমি একীভূত হওয়ার ঠিক আগে প্রতিশ্রুতিতে পরিবর্তনগুলি পরিবর্তন করতে যাচ্ছিলাম, কিন্তু আমি লক্ষ্য করেছি যে এটি কমিটসগুলির একটি গুচ্ছটিতে মিশে গেছে। তাই এখন এই ব্যক্তিটির মার্জ হওয়ার আগের দিন থেকেই এই সমস্ত কমিট রয়েছে। আপনি কীভাবে এটিকে পূর্বাবস্থায় ফিরিয়ে আনবেন?


7
গৃহীত উত্তরের পরামর্শ থাকা সত্ত্বেও, রেপো অন্য কারও সাথে ভাগ করে নিলে দয়া করে কোনও সংগ্রহশালার দিকে চাপ দেবেন না। আপনি অন্যরা যে কাজ করেছেন তা নষ্ট করার ঝুঁকিটি চালান এবং গিটহাব সেই টানার অনুরোধটি মার্জ হওয়া হিসাবে দেখাতে পারেন। এই প্রশ্নের আর একটি উত্তর একটি পুল অনুরোধ পূর্বাবস্থায় ফেলার নিরাপদ উপায় ব্যাখ্যা করে।
অ্যালেক্সান্ডার

2
দ্রষ্টব্য: কমপক্ষে এখন (জুন ২০১৪), গিটহাব তাদের পুল অনুরোধ ওয়েব জিইউআইতে "রিভার্ট" বোতামটির প্রস্তাব দেয়। দেখুন নিচের আমার উত্তর
VonC

1
রিভার্ট বাটনটি নিয়ে সমস্যাটি হ'ল এটি পুল অনুরোধের বিপরীত হিসাবে একটি নতুন প্রতিশ্রুতি তৈরি করে যার অর্থ আপনি যদি শেষ পর্যন্ত এই পরিবর্তনগুলিকে একত্রীকরণ করতে চান তবে "রিভার্ট" বোতামটি ব্যবহার করা এটিকে আরও জটিল করে তুলতে পারে।
ফ্লফি সামুরাই

উত্তর:


159

একটা হল ভাল উত্তর যদিও আমি শুধু এই পদত্যাগ করুন ধাপে ভাঙতে পারে, এই সমস্যা হয়।

আপনাকে যেমন সর্বশেষতম প্রবাহের পরিবর্তনগুলি আনতে হবে এবং চেকআউট করতে হবে, যেমন:

git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar

প্রতিশ্রুতিবদ্ধ লগটি একবার দেখে আপনার এই জাতীয় কিছু পাওয়া উচিত:

commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269
Merge: 9271e6e a507888
Author: Tim Tom <tim@tom.com>
Date:   Mon Apr 29 06:12:38 2013 -0700

    Merge pull request #123 from john/foo_and_bar

    Add foo and bar

commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e
Author: John Doe <john@doe.com>
Date:   Mon Apr 29 12:13:29 2013 +0000

    Add bar

commit 470ee0f407198057d5cb1d6427bb8371eab6157e
Author: John Doe <john@doe.com>
Date:   Mon Apr 29 10:29:10 2013 +0000

    Add foo

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

উপরের উদাহরণে মার্জ কমিট শীর্ষে রয়েছে যেখানে এটি বলেছে "মার্জড পুলের অনুরোধ # 123 ..."

উভয় পরিবর্তন ( "বার যোগ করুন" এবং " ফু ফু যোগ করুন" ) ফিরিয়ে আনার জন্য এটি করুন এবং আপনি সম্পূর্ণরূপে পুনরায় বিলোপ করার অনুরোধটি শেষ করবেন যা আপনি পরবর্তীতে ফিরিয়ে আনতে পারবেন না এবং পরিবর্তনের ইতিহাসকে পরিষ্কার রাখতে পারবেন:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269

6
এটি সঠিক উত্তর হওয়া উচিত। গিট মেইলিং তালিকা থেকে আরও বিশদে গিট- রিভার্ট
জাস্টিন

2
কেন git checkout upstream/master -b revert/john/foo_and_bar? এটা ঠিক কি করে?
ম্যাগনে

4
@ ম্যাগনে - আপনি রিভার্ট ইন করতে একটি নতুন শাখা তৈরি করছেন, যা আপনি তারপরে বিপরীতটি কোথায় মার্জ করতে হবে তা চয়ন করতে পারেন। মূলত কেবল আপনাকে শাখার সাথে কী করা উচিত তার আরও নিয়ন্ত্রণ দেয়। আমার ক্ষেত্রে, আমি এই "ফিক্সড" শাখাটি থেকে আমাদের বিকাশকারী শাখায় ফিরে আসার অনুরোধটি দিয়ে একটি নতুন পুল অনুরোধ জমা দিয়েছি, যার অর্থ যদি প্রয়োজন হয় তবে আমার নতুন টান অনুরোধটিও আবার ফিরিয়ে দেওয়া যেতে পারে। এটি একটি রিলিজের জন্য করা হয়েছিল যেখানে আমরা পুনরায় নির্ধারিত বৈশিষ্ট্যের প্রথম খসড়াটি বের করার সিদ্ধান্ত নিয়েছিলাম। কোনও খারাপ কোড নয়, কেবল এই প্রকাশে যাচ্ছি না।
ড্যানিয়েল নলবাখ

3
আমি এই সম্পর্কে একটি কঠিন পাঠ শিখেছি। আমরা আমাদের বিকাশ শাখায় একটি বৈশিষ্ট্য ঠেলে দিয়েছি কিন্তু সেখানে ডেটা সমস্যা রয়েছে তা বুঝতে পেরেছি এবং সরাসরি বিকাশে ফিরে গেছে। পরে যখন জিনিসগুলি স্থির করা হয়েছিল, আমরা চাপ দেওয়ার আগে এই বৈশিষ্ট্যটির সাথে তাদের সামঞ্জস্যতা পরীক্ষা করার জন্য এই শাখায় নতুন বিকাশ বৈশিষ্ট্যগুলি যুক্ত করতে চেয়েছিলাম, তাই আমি বিকাশটিকে ফিচার শাখায় ফিরিয়ে আনলাম। এটি বিপরীত প্রতিশ্রুতিও প্রয়োগ করেছে, যা বৈশিষ্ট্য শাখায় করা প্রতিটি পরিবর্তন অচিহ্নিত করে। > <
গ্রেগ

86

আপনার প্রতিশ্রুতিবদ্ধ গ্রাফটি দেখুন (গিটক বা অনুরূপ প্রোগ্রাম সহ)। আপনি টানার অনুরোধটি থেকে কমিটগুলি দেখতে পাবেন এবং আপনি নিজের প্রতিশ্রুতি এবং একীভূত প্রতিশ্রুতি দেখতে পাবেন (যদি এটি দ্রুত অগ্রগামী মার্জ না হয়)। মার্জ করার আগে আপনাকে কেবল নিজের নিজস্ব প্রতিশ্রুতিগুলির শেষটি খুঁজে পেতে হবে এবং এই প্রতিশ্রুতিতে শাখাটি পুনরায় সেট করতে হবে।

(আপনার যদি শাখার রিফ্লোগ থাকে তবে মার্জ হওয়ার আগে কমিট সন্ধান করা আরও সহজ হওয়া উচিত))


(মন্তব্যে আরও তথ্যের পরে সম্পাদনা করুন :)

ঠিক আছে, গ্রাফটি দেখুন:

স্ক্রিনশট 1

আমি ধরে নিলাম সর্বশেষ (ডানদিকের) প্রতিশ্রুতি ছিল আপনার ভুল অনুরোধের মাধ্যমে ভুল মার্জ , যা এখানে দেখা নীল রেখাকে একীভূত করেছে। আপনার শেষ ভাল প্রতিশ্রুতিটি ব্ল্যাক লাইনের আগে একটাই হবে এখানে লাল চিহ্নযুক্ত:

এখানে চিত্র বর্ণনা লিখুন

এই প্রতিশ্রুতি পুনরায় সেট করুন, এবং আপনি ভাল হতে হবে।

এর অর্থ, আপনার স্থানীয় কাজের অনুলিপিতে এটি করুন (নিশ্চিত করুন যে আপনার আর কোনও অনাহুত জিনিস নেই, উদাহরণস্বরূপ গিট স্ট্যাশ দ্বারা):

git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk 

এখন নিশ্চিত করুন যে আমি সেখানে চিহ্নিত প্রতিশ্রুতিতে সত্যই আপনি রয়েছেন এবং আপনি এর পূর্বসূরীতে টানা স্টাফগুলির মধ্যে কোনওটিই দেখতে পাবেন না।

git push -f origin master

(যদি আপনার গিথুব রিমোটের নাম দেওয়া হয় origin- তবে নামটি পরিবর্তন করুন)।

এখন সমস্ত কিছু গিথুবকেও ঠিক দেখানো উচিত। প্রতিশ্রুতিগুলি এখনও আপনার ভাণ্ডারে থাকবে তবে কোনও শাখার কাছে পৌঁছনীয় নয়, সুতরাং সেখানে কোনও ক্ষতি করা উচিত নয়। (এবং তারা অবশ্যই অবশ্যই রজারপালদিনের সংগ্রহস্থলে থাকবে will)

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

মনে রাখবেন যে অন্য কেউ যদি ইতিমধ্যে আপনার গুরুকে ভুল প্রতিশ্রুতি দিয়ে টানতে পারে, তবে তারপরে আপনার বর্তমানে যেমন সমস্যা রয়েছে তেমন সমস্যা আছে এবং সত্যিই পিছনে অবদান রাখতে পারে না। আপনার নতুন মাস্টার সংস্করণে পুনরায় সেট করার আগে।

যদি সম্ভবত এটি ঘটে থাকে বা আপনি যে কোনও সমস্যা এড়াতে চান তবে পুরানোটির সাথে ফিরে আসার পরিবর্তে নতুন কমিটের মাধ্যমে পরিবর্তনগুলি ফিরিয়ে আনার git revertপরিবর্তে কমান্ডটি ব্যবহার করুন git reset। (কিছু লোক মনে করেন আপনার প্রকাশিত শাখাগুলি দিয়ে কখনই রিসেট করা উচিত নয়)) এটি কীভাবে করবেন সে সম্পর্কে এই প্রশ্নের অন্যান্য উত্তর দেখুন।

ভবিষ্যতের জন্য:

আপনি যদি রজারপালাদিনের শাখার কয়েকটি কমিট চান তবে এর cherry-pickপরিবর্তে ব্যবহার বিবেচনা করুন merge। বা তাদের আলাদা শাখায় স্থানান্তরিত করতে এবং একটি নতুন টানার অনুরোধ প্রেরণের জন্য রজারপালদিনকে যোগাযোগ করুন।


তবে মার্জ এবং তার প্রথম প্রতিশ্রুতির মধ্যে আমাদের এক টন কমিট রয়েছে। সুতরাং যেমন আমাদের একীকরণের প্রতিশ্রুতি রয়েছে, আমাদের নিজস্ব প্রতিশ্রুতিবদ্ধ হয় এবং তারপরে তার দ্বারা আরও একটি প্রতিশ্রুতিবদ্ধ। দেখে মনে হচ্ছে এটি তার সত্যিকারের পুরানো কমিটগুলিতে মিশে গেছে।
উইল

হ্যাঁ, এটি মার্জড কমিটের পূর্বপুরুষ (এবং ইতিমধ্যে আপনার প্রতিশ্রুতির পূর্বপুরুষ নয়) এমন সমস্ত কিছুতে মিশে যাবে। এটি আপনাকে পুনরায় সেট করতে বাধা দেয় না - কমিটসগুলি তাদের দ্বারা পুনরায় সাজানো হবে না, যদি আপনি পরে পুনরায় শোধ না করেন।
পাওলো ইবারম্যান

1
হ্যাঁ, এখন এটি ঠিক দেখাচ্ছে ( নিজের মধ্যে অদ্ভুত একীভূত হওয়া বাদে - তবে এটি নেটওয়ার্ক গ্রাফ সফ্টওয়্যারটিতে একটি বিঘ্ন ঘটতে পারে)। :-) আমি আনন্দিত আমি সাহায্য করতে পারে।
পাওলো ইবারম্যান

6
আমি মনে করি এটি যদি সমস্যাযুক্ত হয় তবে কেউ সমস্যার সমাধান করতে পারে এবং তারা পরে একই ধরনের খারাপ প্রতিশ্রুতি সম্বলিত একটি টান অনুরোধ প্রেরণ করে, এভাবে তারা লুকিয়ে থাকে কিন্তু রেপোতে। নতুন প্রতিশ্রুতি তৈরি করা কি নিরাপদ হবে না যা খারাপ কাজগুলিকে বিপরীত করে? এইভাবে যদি খারাপ কমিটগুলি অন্য শাখাগুলি / কাঁটাচামচগুলিতে টানা হয় তবে সেগুলি অন্য একটি শাখা / কাঁটাচামচ দিয়ে অন্য কার্যকরভাবে মুছে ফেলা হবে? আমি এটিকে সত্য হিসাবে উল্লেখ করছি না, এটিই আমি মনে করি সত্য হতে পারে, ওপি হিসাবে একই অবস্থানে থাকায় এবং আমার বিকল্পগুলি বিবেচনা করে এক ঘন্টা বা তার বেশি সময় কাটিয়েছি।
মাইলস ম্যাকডোনেল

4
@ আমি এই উত্তরটি মেনে নেওয়ার পরামর্শ দেব। এই কোডটির জন্য এটি ঠিক আছে যা এখনও ধাক্কা দেওয়া হয়নি ( এই ক্ষেত্রে এটি একটি আরও প্রাসঙ্গিক প্রশ্ন, তবে যে কোডটি প্রকাশ্যে ভাগ করা হয়েছে, একটি গিট কমান্ড যা ইতিহাসকে পুনর্লিখন করে (এই ক্ষেত্রে, reset --hardএবং একটি জোর চাপে খুব খারাপ অনুশীলন) below নীচে @ এরর্ডডেপলবারের উত্তরটি কোনও ইতিহাসের পুনর্লিখন বা জোর চাপ দেওয়া ছাড়াই এটি করার একটি উপায় দেখায়
as

34

টানা যদি শেষ কাজটি করতেন তিনি তখন

git reset --hard HEAD~1

3
এই নির্দেশনার অনুসরণে সাবধান থাকুন, এটি আসলে আমাকে 2 টি ধাপ পিছনে ফেলেছে, একটি নয়।
szeitlin

1
@ সেজিটলিন কীভাবে এটি ঘটতে পারে যে এটি আপনাকে নয়, বরং ২ টি পদক্ষেপ নিয়েছে? আমি জানি এই মন্তব্যটি 4+ বছর আগে রেখে গেছে তবে আমি কী আগ্রহী তা যদি হয় তবে এর উত্তর যদি কেউ জানে তবে আমি আগ্রহী। এটা আমার জন্য খুব গুরুত্বপূর্ণ। ধন্যবাদ।
হারাডজিয়েনিয়েক

আমার এখন মনে নেই, তবে আমি অনুমান করছি যে আমি পুনরায় সেট করার চেষ্টা করার সময় যদি আমি নতুন প্রতিশ্রুতিবদ্ধ হত তবে এটি ঘটতে পারে? আপনি যদি এটি নিয়ে উদ্বিগ্ন হন তবে আমি কেবল এটি একটি ডামি রেপো দিয়ে পরীক্ষা করব।
szeitlin

এই আমার জন্য ভাল কাজ করেছে। এটি সম্প্রতি একত্রীকরণের পুলের অনুরোধ মুছে ফেলেছে। এর পরে git reset --hard HEAD~1, আমি git push origin -fরিমোট রিপোজিটরি আপডেট করতাম । তবে সাবধান হন, এটি করার আগে সাবধানতা অবলম্বন করুন।
ডেনিস ওলুক

24

২৪ শে জুন, ২০১৪ থেকে, আপনি সহজেই একটি পিআর বাতিল করার চেষ্টা করতে পারেন (" একটি টানার অনুরোধ ফিরিয়ে আনতে " দেখুন):

রিভার্ট বাটনটি উপস্থাপন করা হচ্ছে

আপনি সহজেই রিভার্ট ক্লিক করে গিটহাবের একটি টানার অনুরোধটি ফিরিয়ে আনতে পারেন:

https://camo.githubusercontent.com/0d3350caf2bb1cba53123ffeafc00ca702b1b164/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6c696e6b2e706e67

বিপরীত পরিবর্তনগুলির সাথে আপনাকে একটি নতুন টানার অনুরোধ তৈরি করতে অনুরোধ করা হবে:

https://camo.githubusercontent.com/973efae3cc2764fc1353885a6a45b9a518d9b78b/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6e65772d70722e706e67

এটি পরীক্ষা করা বাকি রয়েছে যদিও তা যদি বিপরীতটি ব্যবহার করে -mবা না করে (পাশাপাশি একত্রীকরণের বিপরীতকরণের জন্য)

তবে আদিল এইচ রাজা মন্তব্যগুলিতে যুক্ত করেছেন (ডিসেম্বর 2019):

এটি প্রত্যাশিত আচরণ, এটি একটি নতুন শাখা তৈরি করেছে এবং আপনি এই নতুন শাখা থেকে আপনার একটি পিআর তৈরি করতে পারেন master
ভবিষ্যতে এইভাবে আপনি যদি রিভার্টটি প্রয়োজন হয় তা আন-রিভার্ট করতে পারেন, এটি নিরাপদ বিকল্প এবং সরাসরি আপনার পরিবর্তন না করে master


সতর্কতা : Korayem তুলে ধরে মন্তব্য যে:

প্রত্যাবর্তনের পরে বলা যাক আপনি গিট শাখায় আরও কিছু পরিবর্তন করেছেন এবং একই উত্স / গন্তব্য শাখা থেকে একটি নতুন জনসংযোগ তৈরি করেছেন।
আপনি PR টি কেবলমাত্র নতুন পরিবর্তন দেখিয়েছেন তবে ফিরে আসার আগে যা ছিল তা কিছুই নয়

কোরায়েম আমাদের "গিথুব: রিভার্টের পরে পরিবর্তনগুলি ( git cherry-pick, git rebase) " উপেক্ষা করার জন্য উল্লেখ করেছে।


আমি এটি চেষ্টা করেছিলাম এবং এটি মাস্টারে পিআর পূর্বাবস্থায় ফেরানোর পরিবর্তে একটি নতুন শাখা তৈরি করেছিল?
йый

স্ট্রেঞ্জ। সেই আচরণটি বর্ণনা করার জন্য আপনি কি নতুন প্রশ্ন জিজ্ঞাসা করতে পারেন?
ভনসি

এটি প্রত্যাশিত আচরণ, এটি একটি নতুন শাখা তৈরি করেছে এবং আপনি এই নতুন শাখা থেকে আপনার মাস্টারের কাছে একটি PR তৈরি করতে পারেন। ভবিষ্যতে এইভাবে আপনি যদি প্রয়োজন হয় তবে রিভার্টটি আন-রিভার্ট করতে পারবেন, এটি সবচেয়ে নিরাপদ বিকল্প এবং সরাসরি আপনার মাস্টারকে পরিবর্তন না করে।
আদিল এইচ রাজা

1
@ আদিল এইচ। রাজা আপনাকে ধন্যবাদ আরও দৃশ্যমানতার জন্য আমি আপনার মন্তব্যে উত্তরে অন্তর্ভুক্ত করেছি।
ভোনসি

1
@ ভনসি আঙ্গুলগুলি পেরিয়ে গেছে এটি সারা বিশ্বের বিকাশকারীদেরকে খুব বেশি যন্ত্রণা ও সময় অপচয় থেকে বাঁচাতে পারে
কোরাইম

8

আপনি মুছতে চান না এমন সমস্ত কমিটগুলি সহ একটি গিথব পুল অনুরোধটি পূর্বাবস্থায় ফেরাতে আপনাকে একটি চালনা করতে হবে:

git reset --hard --merge <commit hash>

প্রতিশ্রুতিবদ্ধ হ্যাশটির সাথে অনুরোধটিকে মার্জ করার জন্য প্রতিশ্রুতিবদ্ধ অগ্রণী হিসাবে রয়েছে। এটি ইতিহাসের মধ্যে কোনও কমিটকে প্রভাবিত না করে টান অনুরোধ থেকে সমস্ত কমিট সরিয়ে ফেলবে।

এটি সন্ধান করার একটি ভাল উপায় হ'ল এখন বন্ধ হওয়া অনুরোধে গিয়ে এই ক্ষেত্রটি সন্ধান করা:

অনুরোধ চিত্রটি টানুন অনুরোধ চিত্রটি টানুন

আপনি চালানোর পরে git reset, একটি চালান:

git push origin --force <branch name>

এই শাখার যে কোনও কমিটকে প্রভাবিত না করে টানার অনুরোধ থেকে কমিটের মধ্যে কমিটের ইতিহাসে খোলার আগেই টান অনুরোধের আগে এই শাখাটি ফিরিয়ে দেওয়া উচিত।

সম্পাদনা করুন:

আপনি যদি টানার অনুরোধে রিভার্ট বোতামটি ক্লিক করেন, এটি শাখায় একটি অতিরিক্ত অঙ্গীকার তৈরি করে। এটি নিঃসরণ বা নিমজ্জন করে না। এর অর্থ হ'ল আপনি যদি রিভার্ট বোতামটিতে আঘাত করতে চান তবে এই কোডটি সমস্ত পুনরায় যুক্ত করার জন্য আপনি একটি নতুন টান অনুরোধ খুলতে পারবেন না।


কোনও পাগল ফিরিয়ে না দেওয়া বা চেরি-বাছাই ছাড়াই জিনিসগুলি সোজা করার দুর্দান্ত উপায়
কামুলো নিম্বাস

ধন্যবাদ! এটিই আমি করার পরিকল্পনা করছিলাম, তবে চেরি বাছাইয়ের জন্য প্রায় 200 ডলার কমিট হত।
ফ্লফি সামুরাই

1

আমি এই জায়গাটি সব সময় ব্যবহার করি, ধন্যবাদ।

আমি কীভাবে একটি টানার অনুরোধটিকে পূর্বাবস্থায় ফিরিয়ে আনতে পারি তা সন্ধান করছিলাম এবং এখানে আসলাম।

আমি কেবল git reset --hard"অনেক দিন আগে" যেতে যাচ্ছিলাম এবং টান অনুরোধ করার আগে যেখানে ছিলাম সেখানে দ্রুত এগিয়ে যেতে হয়েছিলাম।

এখানে দেখার পাশাপাশি আমি আমার সহকর্মীকে জিজ্ঞাসা করলাম তিনি কী করবেন এবং তার একটি ভাল উত্তর ছিল: উপরের প্রথম উত্তরে উদাহরণ আউটপুটটি ব্যবহার করে:

git reset --hard 9271e6e

গিতের বেশিরভাগ জিনিসের মতো, আপনি যদি এমনভাবে কিছু করেন যা সহজ নয় তবে আপনি সম্ভবত এটি ভুল করছেন wrong

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