গিট: মাস্টারটিতে আনস্টেজড / অনির্দিষ্ট পরিবর্তন থেকে একটি শাখা তৈরি করুন


991

প্রসঙ্গ: আমি একটি সাধারণ বৈশিষ্ট্য যুক্ত করতে মাস্টার নিয়ে কাজ করছি। কয়েক মিনিটের পরে আমি বুঝতে পারি এটি এত সহজ ছিল না এবং একটি নতুন শাখায় কাজ করা আরও ভাল হওয়া উচিত ছিল।

এটি আমার কাছে সর্বদা ঘটে এবং আমি কীভাবে অন্য শাখায় স্যুইচ করব এবং মাস্টার শাখাটি পরিষ্কার রেখে আমার সাথে এই সমস্ত আপত্তিহীন পরিবর্তনগুলি গ্রহণ করব তা সম্পর্কে আমার কোনও ধারণা নেই। আমার ধারণাটি git stash && git stash branch new_branchকেবল এটি সম্পাদন করতে পারে তবে আমি যা পাই তা হ'ল:

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ echo "hello!" > testing 

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git stash
Saved working directory and index state WIP on master: 4402b8c testing
HEAD is now at 4402b8c testing

~/test $ git status
# On branch master
nothing to commit (working directory clean)

~/test $ git stash branch new_branch
Switched to a new branch 'new_branch'
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (db1b9a3391a82d86c9fdd26dab095ba9b820e35b)

~/test $ git s
# On branch new_branch
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

~/test $ git checkout master
M   testing
Switched to branch 'master'

~/test $ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   testing
#
no changes added to commit (use "git add" and/or "git commit -a")

আপনি কি জানেন যে এটি সম্পাদন করার কোনও উপায় আছে কিনা?


1
যদিও আপনার সমস্যার একটি সহজ সমাধান রয়েছে, আপনি কী চান তার চেয়ে আলাদা ফলাফল কী পেতে পারেন তা আপনি নির্দিষ্ট করতে পারেন?
গৌথির

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

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

উত্তর:


1207

স্ট্যাশ করার দরকার নেই।

git checkout -b new_branch_name

আপনার স্থানীয় পরিবর্তনগুলি স্পর্শ করে না। এটি কেবল বর্তমান হেড থেকে শাখা তৈরি করে এবং সেখানে প্রধান নির্ধারণ করে। সুতরাং আমি অনুমান করি আপনি এটি চান কি।

--- চেকআউট মাস্টারের ফলাফল ব্যাখ্যা করতে সম্পাদনা করুন ---

checkout masterআপনার পরিবর্তনগুলি বাতিল না করার কারণে আপনি কি বিভ্রান্ত ?

যেহেতু পরিবর্তনগুলি কেবল স্থানীয় g তাই গিট চান না যে আপনি এগুলি খুব সহজেই হারাবেন। শাখা পরিবর্তন করার পরে, গিট আপনার স্থানীয় পরিবর্তনগুলি ওভাররাইট করে না। আপনার ফলাফল checkout master:

M   testing

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

আপনি যদি সত্যিই স্থানীয় পরিবর্তনগুলি বাতিল করতে চান তবে আপনাকে চেকআউটটি বাধ্য করতে হবে -f

git checkout master -f

যেহেতু আপনার পরিবর্তনগুলি কখনই প্রতিশ্রুতিবদ্ধ ছিল না, তাই আপনি সেগুলি হারাবেন।

আপনার শাখায় ফিরে যাওয়ার চেষ্টা করুন, আপনার পরিবর্তনগুলি প্রতিশ্রুতি দিন, তারপরে আবার মাস্টারকে চেকআউট করুন।

git checkout new_branch
git commit -a -m"edited"
git checkout master
git status

Mপ্রথম চেকআউটের পরে আপনার একটি বার্তা পাওয়া উচিত , তবে তার পরে আর নয় checkout master, git statusকোনও পরিবর্তিত ফাইল প্রদর্শন করা উচিত নয়।

--- ওয়ার্কিং ডিরেক্টরি (স্থানীয় ফাইল) সম্পর্কে বিভ্রান্তি দূর করতে সম্পাদনা করুন ---

আপনার প্রথম মন্তব্যের উত্তরে, স্থানীয় পরিবর্তনগুলি ঠিক ... ভাল, স্থানীয়। গিট এগুলি স্বয়ংক্রিয়ভাবে সংরক্ষণ করে না, আপনাকে অবশ্যই এটি পরবর্তী সময়ের জন্য সংরক্ষণ করার জন্য বলতে হবে। যদি আপনি পরিবর্তন করেন এবং স্পষ্টভাবে প্রতিশ্রুতিবদ্ধ বা স্ট্যাশ না করেন, গিট তাদের সংস্করণ দেবে না। যদি আপনি হেড ( checkout master) পরিবর্তন করেন তবে স্থানীয় পরিবর্তনগুলি সংরক্ষণ না করা থেকে ওভাররাইট করা হয় না।


32
এখানে বিভ্রান্তিকর বিষয়টি হ'ল, এই গিটের ম্যান পেজটি বলে যে git checkout"সূচী বা নির্দিষ্ট গাছের সংস্করণটি মেলাতে কাজের গাছের ফাইলগুলিকে আপডেট করে” " যে অনুমান আপনার ফাইল সিস্টেমের মধ্যে আপনার পরিবর্তনগুলি করা হবে Gone পরে। তাদের ফিরে পাওয়ার কোনও সুযোগ ছাড়াই। এমনকি যদি আপনি বলেন যে তারা না করে, এটি এখনও একটি খুব খারাপ অনুভূতি ছেড়ে দেয়। আমি এই বিশ্বাস করতে পারি না এ সব । হয় ডকুমেন্টেশন সত্যিই খারাপ বা গিট এর ডিফল্ট আচরণ সত্যিই বিপজ্জনক। এক্ষেত্রে আপনি আপনার পরিবর্তনগুলি হারাতে চান না তা সনাক্ত করার জন্য কাউকে কিছু "অটোমেজিক" হিউরিস্টিকের উপর নির্ভর করা উচিত নয়।
Evi1M4chine

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

1
ভাল, আমি সেখানে স্থানীয় পরিবর্তন না নিয়ে কীভাবে অন্য শাখায় চেকআউট করব?
レ ッ ク ス

5
@Alex git checkout <other_branch> -f। সতর্কতা ছাড়াই আপনি আপনার স্থানীয় পরিবর্তনগুলি হারাবেন।
গৌথিয়ার

2
@ Evi1M4chine প্রথমটি। ডকুমেন্টেশন হয় সত্যিই খারাপ।
কিওয়ারটি

62

চেষ্টা করুন:

git stash
git checkout -b new-branch
git stash apply

6
এটি কেবল 'গিট চেকআউট-বি-নতুন শাখা' করা কি আলাদা?
অ্যাড্রিয়ান মোউত

আমি মনে করি না উত্তরটি মূলত যখন লেখা হয়েছিল, তবে আমি ভুল হতে পারি। দুর্ভাগ্যক্রমে আমার কাজের পরিস্থিতিতে, আমি গত কয়েক বছর ধরে পারফর্ম্স ব্যবহার করছি তাই এখন আমি তার যথার্থতার সাথে সাক্ষ্য দিতে পারি না।
গ্রান্ট লিমবার্গ

6
অথবা শেষ দুটি পদক্ষেপের পরিবর্তে: গিট স্ট্যাশ ব্রাঞ্চ নতুন শাখা
পুনর্বাসিত

1
গিট স্ট্যাশ আর প্রয়োজন হয় না
কোরি

আপনার যদি ইতিমধ্যে একটি বিদ্যমান শাখা থাকে যেখানে আপনি আপনার সমস্ত জিনিসপত্র রাখতে চান, তখন স্ট্যাশ আমার পক্ষে বোঝায়: (শেষ পর্যন্ত গিট আনুন - সব; মূলতে দূরবর্তী শাখাটি পেতে) গিট স্ট্যাশ; গিট চেকআউট <existing- ব্র্যাঞ্চ>; গিট স্ট্যাশ প্রয়োগ;
Paolof76

24

দুটি কাজ আপনি করতে পারেন:

git checkout -b sillyname
git commit -am "silly message"
git checkout - 

অথবা

git stash -u
git branch sillyname stash@{0}

( git checkout -<- ড্যাশটি আপনি যে আগের শাখায় ছিলেন সেটির শর্টকাট)

( git stash -u<- এর -uঅর্থ এটি অচিহ্নবদ্ধ পরিবর্তনগুলিও নেয়)


7

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

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


যা নতুন শাখাটি তৈরি করার আগে পরিবর্তনগুলিকে স্ট্যাশ করে যাতে এটি সেগুলি রাখে না (ম্যাক ওএসে 223 সংস্করণ)
ফার্নান্দো গালেগো

2

আপনি যদি বর্তমান শাখায় আপনার বর্তমান অসমর্কিত পরিবর্তনগুলি একটি নতুন শাখায় স্থানান্তরিত করতে চান তবে একটি নতুন শাখা তৈরি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন এবং আপত্তিহীন পরিবর্তনগুলি স্বয়ংক্রিয়ভাবে অনুলিপি করুন।

git checkout -b branch_name

এটি আপনার বর্তমান শাখা থেকে একটি নতুন শাখা তৈরি করবে (এটিকে মাস্টার হিসাবে ধরে নিয়েছে), আপত্তিযুক্ত পরিবর্তনগুলি অনুলিপি করুন এবং নতুন শাখায় স্যুইচ করুন।

নতুন শাখায় আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ।

git commit -m "First commit"

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

git push --set-upstream origin feature/feature/NEWBRANCH

আপনি এই আদেশটি হিট করার পরে, রিমোটে একটি নতুন শাখা তৈরি করা হবে এবং আপনার নতুন স্থানীয় শাখা দূরবর্তী স্থানান্তরিত হবে।

এখন, আপনি যদি মাস্টার শাখা থেকে আপনার আপত্তিহীন পরিবর্তনগুলি ফেলে দিতে চান তবে ব্যবহার করুন:

git checkout master -f

এটি চেকআউটে কোনও আপত্তিজনক স্থানীয় পরিবর্তনগুলি ফেলে দেবে।


এই উত্তর গৃহীত উত্তর থেকে আলাদা কীভাবে?

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

এই উত্তরটি পরিষ্কার এবং আমাকে অনেক সাহায্য করেছে।
ভাদিম

0

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

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

আপনি যদি খুব সহজে শাখাটি স্যুইচ করেন তবে একই প্রযোজ্য।

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