একাধিক কমিটিতে পূর্বের প্রতিশ্রুতি ভঙ্গ করুন


1220

একটি শাখা তৈরি না করে এবং একটি নতুন শাখায় একগুচ্ছ মজাদার কাজ না করে, স্থানীয় ভাণ্ডারের প্রতি প্রতিশ্রুতিবদ্ধ হওয়ার পরে কি কোনও একক প্রতিশ্রুতিবদ্ধতা কয়েকটি পৃথক কমিটে ভেঙে ফেলা সম্ভব?


36
এটি কীভাবে করা যায় তা শেখার জন্য একটি ভাল উত্স হ'ল প্রো গিট §6.4 গিট সরঞ্জামগুলি - ইতিহাসের পুনর্লিখন , " কমপ্লিটকে আলাদা করা " বিভাগে।

2
উপরের মন্তব্যে লিঙ্কিত দস্তাবেজগুলি উত্তম, নীচের উত্তরগুলির চেয়ে ভালভাবে ব্যাখ্যা করা হয়েছে।
ব্লেজারব্লেড

2
আমি এই উপনাম স্ট্যাকওভারফ্লো . com/a/19267103/301717 ব্যবহার করার পরামর্শ দিচ্ছি । এটি ব্যবহার করে একটি প্রতিশ্রুতি বিভক্ত করতে দেয়git autorebase split COMMIT_ID
জেরুমে পাউিলার

ইন্টারেক্টিভ রিবেস ব্যতীত সহজ কাজটি হ'ল (সম্ভবত) আপনি যেটি বিভক্ত করতে চান তার আগে কমিট থেকে শুরু করে একটি নতুন শাখা তৈরি করা, চেরি-পিক-ইন কমিট, রিসেট, স্ট্যাশ, ফাইলটি সরানো, স্ট্যাশ পুনরায় আবেদন করা এবং পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন এবং তারপরে হয় পূর্বের শাখার সাথে একীভূত হন বা চেরি-পরে অনুসরণীয় কমিটগুলি বেছে নিন। (তারপরে প্রাক্তন শাখার নামটি বর্তমানের মাথায় স্যুইচ করুন)) (এমবিওএসের পরামর্শ অনুসরণ করা এবং ইন্টারেক্টিভ রিবেস করা সম্ভবত ভাল)) (নীচে ২০১০ উত্তর থেকে অনুলিপি করা হয়েছে)
উইলিয়াম পার্সেল

1
পূর্ববর্তী প্রতিশ্রুতিতে রিবেস চলাকালীন ঘটনাক্রমে দু'টি প্রতিশ্রুতি স্কোয়াশ করার পরে আমি এই সমস্যায় পড়েছিলাম। এটা ঠিক করার আমার পথ চেকআউট squashed কমিট ছিল git reset HEAD~, git stashতারপর, git cherry-pickপ্রথম স্কোয়াশ মধ্যে কমিট তারপর git stash pop। আমার চেরি-বাছুন ক্ষেত্রে এখানে বেশ নির্দিষ্ট হয়, কিন্তু git stashgit stash popঅন্যদের জন্য বেশ সুবিধাজনক।
সফট

উত্তর:


1796

git rebase -i এটা করবো.

প্রথমে একটি পরিষ্কার ওয়ার্কিং ডিরেক্টরি দিয়ে শুরু করুন: git statusকোনও মুলতুবি পরিবর্তন, মুছে ফেলা বা সংযোজনগুলি প্রদর্শন করা উচিত নয়।

এখন, আপনাকে সিদ্ধান্ত নিতে হবে আপনি কোন অঙ্গীকার (গুলি) ভাগ করতে চান।

ক) অতি সাম্প্রতিক প্রতিশ্রুতি বিভক্ত করা

আপনার সাম্প্রতিক প্রতিশ্রুতি বিচ্ছেদ করতে, প্রথমে:

$ git reset HEAD~

এখন আপনার প্রয়োজন অনুসারে যতটা কমিট তৈরি করে এখন স্বতন্ত্রভাবে আলাদাভাবে প্রতিশ্রুতিবদ্ধ করুন।

খ) কমিটিকে আরও পিছনে বিভক্ত করা

এর জন্য রিবাইজ করা দরকার , এটি হিস্ট্রি রাইটিং। সঠিক প্রতিশ্রুতি সন্ধান করতে আপনার বেশ কয়েকটি পছন্দ রয়েছে:

  • যদি এটি তিনটি করে ফিরে আসে তবে

    $ git rebase -i HEAD~3
    

    যেখানে 3কত করে ব্যাক এটা হয়।

  • যদি আপনি গণনা করতে চান তবে এটি যদি গাছের থেকে আরও দূরে ছিল

    $ git rebase -i 123abcd~
    

    123abcdআপনি যে প্রতিশ্রুতি বিভক্ত করতে চান তার SHA1 কোথায় ।

  • আপনি যদি অন্য কোনও শাখায় থাকেন (উদাহরণস্বরূপ, কোনও বৈশিষ্ট্য শাখা) যা আপনি মাস্টারে মার্জ করার পরিকল্পনা করছেন:

    $ git rebase -i master
    

আপনি রিবেস সম্পাদনা স্ক্রিনটি পেয়ে গেলে, আপনি আলাদা করতে চান এমন প্রতিশ্রুতি সন্ধান করুন। এই লাইনের শুরুতে ( সংক্ষেপে) এর pickসাথে প্রতিস্থাপন করুন । বাফার সংরক্ষণ করুন এবং প্রস্থান করুন। আপনি সম্পাদনা করতে চান এমন প্রতিশ্রুতি দেওয়ার পরে এখন রিবেস বন্ধ হবে। তারপর:edite

$ git reset HEAD~

সাধারণভাবে পৃথকভাবে টুকরো টুকরো করে প্রতিশ্রুতিবদ্ধ করুন, তারপরে আপনার যতটুকু কমিট তৈরি করুন, ততক্ষণে তৈরি করুন

$ git rebase --continue

2
এই উত্তরের জন্য আপনাকে ধন্যবাদ। আমি মঞ্চ অঞ্চলে কিছু পূর্বে প্রতিশ্রুতিবদ্ধ ফাইলগুলি রাখতে চেয়েছিলাম, সুতরাং আমার জন্য নির্দেশাবলী কিছুটা আলাদা ছিল। আমি পারা git rebase --continue, আমি আসলে ছিল git add (files to be added), git commitতারপর, git stash(অবশিষ্ট ফাইল জন্য)। এর পরে git rebase --continue, আমি git checkout stash .বাকী ফাইলগুলি
এরিক হু

18
মনোজल्डস এর জবাব আসলে গিট- স্কেমে ডকুমেন্টেশনের সাথে এই লিঙ্কটি রয়েছে , যা খুব স্পষ্টভাবে কমিটস বিভাজনের প্রক্রিয়াটিও ব্যাখ্যা করে।

56
আপনি git add -pকেবলমাত্র ফাইলের কিছু আংশিক বিভাগ যুক্ত করার সুবিধা নিতে চাইবেন , সম্ভবত eকিছুটা কুন্তি করার জন্য ডিফস সম্পাদনা করার বিকল্পের সাহায্যে। git stashআপনি যদি কিছু কাজ এগিয়ে নিয়ে যেতে চান তবে এটি বর্তমান প্রতিশ্রুতি থেকে অপসারণ করতেও দরকারী।
ক্রেগ রিঞ্জার

2
আপনি বিভক্ত করতে চান, এবং পুনর্বিন্যাস করে, আমি কি করতে চান বিভক্ত করা প্রথম এবং তারপর পুনর্বিন্যাস আলাদাভাবে আরেকটি ব্যবহার git rebase -i HEAD^3কমান্ড। এইভাবে যদি বিভক্তি খারাপ হয়ে যায় তবে আপনাকে তেমন কাজটি আগের মতো করতে হবে না।
ডেভিড এম লয়েড

4
@ ক্রেলিক এইচএইডডিতে নতুনভাবে প্রতিশ্রুতিবদ্ধ ফাইলগুলি ডিস্কের পরে ছেড়ে দেওয়া হবে git reset HEAD~। তারা হারিয়ে যায় না।
ওয়েইন কনরাড

312

থেকে Git-রি-বেসের ফলে ম্যানুয়াল (বিভাজন অধ্যায় করে)

ইন্টারেক্টিভ মোডে, আপনি "সম্পাদনা" ক্রিয়াটি দিয়ে কমিটগুলি চিহ্নিত করতে পারেন। যাইহোক, এর অর্থ অগত্যা এই নয় যে গিট রিবেস এই সম্পাদনার ফলাফলটি ঠিক একটি প্রতিশ্রুতি হিসাবে প্রত্যাশা করে। প্রকৃতপক্ষে, আপনি প্রতিশ্রুতিটি পূর্বাবস্থায় ফেরাতে পারেন, বা আপনি অন্যান্য চুক্তি যুক্ত করতে পারেন। এটি একটি অঙ্গীকারকে দুটি ভাগে ভাগ করতে ব্যবহার করা যেতে পারে:

  • একটি ইন্টারেক্টিভ রিবেস শুরু করুন git rebase -i <commit>^, যেখানে <commit>আপনি ভাগ করতে চান সেই প্রতিশ্রুতি। প্রকৃতপক্ষে, যে কোনও প্রতিশ্রুতি সীমাবদ্ধ থাকবে যতক্ষণ না এতে কমিট থাকে।

  • "সম্পাদনা" অ্যাকশনটি দিয়ে আপনি যে কমিট বিভক্ত করতে চান তা চিহ্নিত করুন।

  • যখন সেই প্রতিশ্রুতি সম্পাদনা করার কথা আসে তখন সম্পাদন করুন git reset HEAD^। এর প্রভাবটি হ'ল হেড একের সাথে মিলে যায় এবং সূচকটি অনুসরণ করে। তবে কাজের গাছটি একই থাকে।

  • এখন সূচীতে পরিবর্তনগুলি যুক্ত করুন যা আপনি প্রথম প্রতিশ্রুতিতে রাখতে চান। এটি করতে আপনি git add(সম্ভবত ইন্টারেক্টিভভাবে) বা git gui(বা উভয়) ব্যবহার করতে পারেন ।

  • এখনই বর্তমান সূচীটি যে কোনও প্রতিশ্রুতিবদ্ধ বার্তাই উপযুক্ত Commit

  • আপনার কার্যকারী গাছ পরিষ্কার না হওয়া অবধি শেষ দুটি পদক্ষেপ পুনরাবৃত্তি করুন।

  • সঙ্গে রিবেস চালিয়ে যান git rebase --continue


12
উইন্ডোজে আপনি এর ~পরিবর্তে ব্যবহার করতে পারেন ^
কেভিন কুজিক

13
সতর্কতার শব্দ: এই পদ্ধতির সাথে আমি প্রতিশ্রুতি বার্তাটি হারিয়েছি।
ব্যবহারকারী420667

11
@ user420667 হ্যাঁ, অবশ্যই। আমরা resetপ্রতিশ্রুতি অন্তর্ভুক্ত করছি - বার্তা অন্তর্ভুক্ত। বুদ্ধিমানের কাজটি, আপনি যদি জানেন যে আপনি কোন প্রতিশ্রুতি বিভক্ত করছেন তবে এর কিছু / সমস্ত বার্তা রাখতে চান, সেই বার্তার একটি অনুলিপি নেওয়া। সুতরাং, আইএনজি করার git showআগে কমিট করুন rebase, বা যদি আপনি এটি ভুলে যান বা পছন্দ করেন: পরে এটির মাধ্যমে ফিরে যান reflog। এটি 2 সপ্তাহের মধ্যে বা যা-ই হোক না কেন আবর্জনা সংগ্রহের আগ পর্যন্ত এগুলির কিছুই আসলে "হারিয়ে যাবে"।
আন্ডারস্কোর_ড

4
~এবং ^বিভিন্ন জিনিস, এমনকি Windows এ আছে। আপনি এখনও ক্যারেটটি চান ^, সুতরাং আপনার শেলের জন্য উপযুক্ত হিসাবে এটি এড়াতে হবে। পাওয়ারশেলের মধ্যে, এটি HEAD`^। Cmd.exe এর সাহায্যে আপনি এটিকে এড়াতে দ্বিগুণ করতে পারেন HEAD^^। বেশিরভাগ (সমস্ত?) শেলগুলিতে আপনি চারপাশের মতো কোট দিয়ে দেখতে পারেন "HEAD^"
অ্যান্ড্রুএফ

7
আপনি করতে পারেন git commit --reuse-message=abcd123। এটির জন্য সংক্ষিপ্ত বিকল্পটি -C
j0057

41

git rebase --interactiveপূর্বের প্রতিশ্রুতি সম্পাদনা করতে, চালান git reset HEAD~, এবং তারপরে git add -pকিছু যুক্ত করতে, তারপরে একটি প্রতিশ্রুতিবদ্ধতা করুন, তারপরে আরও কিছু যুক্ত করুন এবং আপনি যতবার চান তার চেয়ে আরও একবার কমিট করুন Use আপনার হয়ে গেলে, চালান git rebase --continue, এবং আপনার স্ট্যাকের আগে সমস্ত বিভাজন কমিট করবে।

গুরুত্বপূর্ণ : নোট করুন যে আপনি চারপাশে খেলতে পারেন এবং আপনি চান সমস্ত পরিবর্তন করতে পারেন, এবং পুরানো পরিবর্তনগুলি হারাতে উদ্বিগ্ন হওয়ার দরকার নেই, কারণ আপনি সবসময় git reflogআপনার প্রকল্পের পয়েন্টটি খুঁজে পেতে চালাতে পারেন যা আপনার চান পরিবর্তনগুলি রয়েছে, (আসুন এটি কল করুন a8c4ab) , এবং তারপর git reset a8c4ab

এটি কীভাবে কাজ করে তা দেখানোর জন্য এখানে কয়েকটি ধারাবাহিক আদেশ রয়েছে:

mkdir git-test; cd git-test; git init

এখন একটি ফাইল যোগ করুন A

vi A

এই লাইন যুক্ত করুন:

one

git commit -am one

তারপরে এই লাইনটি A তে যুক্ত করুন:

two

git commit -am two

তারপরে এই লাইনটি A তে যুক্ত করুন:

three

git commit -am three

ফাইলটি এখন এ জাতীয় দেখাচ্ছে:

one
two
three

এবং আমাদের git logদেখতে নিম্নলিখিতগুলির মতো (ভাল, আমি ব্যবহার করি)git log --pretty=oneline --pretty="%h %cn %cr ---- %s"

bfb8e46 Rose Perrone 4 seconds ago ---- three
2b613bc Rose Perrone 14 seconds ago ---- two
9aac58f Rose Perrone 24 seconds ago ---- one

ধরা যাক আমরা দ্বিতীয় প্রতিশ্রুতি বিভক্ত করতে চাই two,।

git rebase --interactive HEAD~2

এটি এমন একটি বার্তা নিয়ে আসে যা এরকম দেখাচ্ছে:

pick 2b613bc two
pick bfb8e46 three

প্রতিশ্রুতিবদ্ধ সম্পাদনা pickকরতে প্রথমে একটিতে পরিবর্তন করুন e

git reset HEAD~

git diff আমাদের দেখায় যে আমরা দ্বিতীয় প্রতিশ্রুতিবদ্ধতার জন্য যে প্রতিশ্রুতিবদ্ধ করেছি তা কেবল অস্তিত্তর:

diff --git a/A b/A
index 5626abf..814f4a4 100644
--- a/A
+++ b/A
@@ -1 +1,2 @@
 one
+two

আসুন সেই পরিবর্তনটি পর্যায়ক্রমে ফাইলটিতে সেই লাইনে "এবং একটি তৃতীয়" যুক্ত করুন A

git add .

একটি ইন্টারেক্টিভ রিবেস চলাকালীন এটি সাধারণত আমাদের পয়েন্ট যেখানে আমরা দৌড়াব git rebase --continue, কারণ আমরা সাধারণত পূর্বের প্রতিশ্রুতি সম্পাদনা করতে আমাদের কমিটস স্ট্যাকের পিছনে ফিরে যেতে চাই। তবে এবার আমরা একটি নতুন কমিট তৈরি করতে চাই। সুতরাং আমরা চালাতে হবে git commit -am 'two and a third'। এখন আমরা ফাইল সম্পাদনা করি Aএবং লাইন যুক্ত করি two and two thirds

git add . git commit -am 'two and two thirds' git rebase --continue

আমাদের প্রতিশ্রুতিবদ্ধতার সাথে আমাদের বিরোধ রয়েছে three, সুতরাং আসুন এটি সমাধান করুন:

আমরা পরিবর্তন করব

one
<<<<<<< HEAD
two and a third
two and two thirds
=======
two
three
>>>>>>> bfb8e46... three

প্রতি

one
two and a third
two and two thirds
three

git add .; git rebase --continue

এখন আমাদের git log -pচেহারাটি এর মতো:

commit e59ca35bae8360439823d66d459238779e5b4892
Author: Rose Perrone <roseperrone@fake.com>
Date:   Sun Jul 7 13:57:00 2013 -0700

    three

diff --git a/A b/A
index 5aef867..dd8fb63 100644
--- a/A
+++ b/A
@@ -1,3 +1,4 @@
 one
 two and a third
 two and two thirds
+three

commit 4a283ba9bf83ef664541b467acdd0bb4d770ab8e
Author: Rose Perrone <roseperrone@fake.com>
Date:   Sun Jul 7 14:07:07 2013 -0700

    two and two thirds

diff --git a/A b/A
index 575010a..5aef867 100644
--- a/A
+++ b/A
@@ -1,2 +1,3 @@
 one
 two and a third
+two and two thirds

commit 704d323ca1bc7c45ed8b1714d924adcdc83dfa44
Author: Rose Perrone <roseperrone@fake.com>
Date:   Sun Jul 7 14:06:40 2013 -0700

    two and a third

diff --git a/A b/A
index 5626abf..575010a 100644
--- a/A
+++ b/A
@@ -1 +1,2 @@
 one
+two and a third

commit 9aac58f3893488ec643fecab3c85f5a2f481586f
Author: Rose Perrone <roseperrone@fake.com>
Date:   Sun Jul 7 13:56:40 2013 -0700

    one

diff --git a/A b/A
new file mode 100644
index 0000000..5626abf
--- /dev/null
+++ b/A
@@ -0,0 +1 @@
+one

38

পূর্ববর্তী উত্তরগুলি git rebase -iআপনাকে বিভক্ত করতে চাইছেন এমন প্রতিশ্রুতি সম্পাদনা করতে এবং কিছু অংশে প্রতিশ্রুতিবদ্ধ।

ফাইলগুলি বিভিন্ন কমিটে বিভক্ত করার সময় এটি ভাল কাজ করে তবে আপনি যদি পৃথক ফাইলগুলিতে পরিবর্তনগুলি পৃথক করতে চান তবে আপনার আরও অনেক কিছু জানতে হবে।

আপনি বিভক্ত করতে চান এমন প্রতিশ্রুতিটি পেয়ে তা ব্যবহার করে rebase -iএবং এর জন্য চিহ্নিত করার জন্য editআপনার কাছে দুটি বিকল্প রয়েছে।

  1. ব্যবহারের পরে git reset HEAD~, git add -pপ্রতিটি প্রতিশ্রুতিতে আপনি চান সেটি নির্বাচন করতে পৃথক পৃথক প্যাচগুলি ব্যবহার করুন

  2. আপনি চান না এমন পরিবর্তনগুলি সরাতে ওয়ার্কিং কপি সম্পাদনা করুন; অন্তর্বর্তীকালীন রাষ্ট্র প্রতিশ্রুতিবদ্ধ; এবং তারপরে পরবর্তী রাউন্ডের জন্য সম্পূর্ণ প্রতিশ্রুতিটি পিছনে টানুন।

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

কমিট ব্যবহার rebase -ieditইনগ করার পরে , ব্যবহার করুন

git reset --soft HEAD~

প্রতিশ্রুতিবদ্ধতাটিকে পূর্বাবস্থায় ফেরাতে, তবে প্রতিশ্রুতিবদ্ধ ফাইলগুলি সূচীতে ছেড়ে দিন। আপনার প্রাথমিক প্রতিশ্রুতি কতটা চূড়ান্ত ফলাফল হতে চলেছে তার উপর নির্ভর করে আপনি - সোফট বাদ দিয়ে একটি মিশ্র পুনরায় সেট করতে পারেন। পার্থক্যটি হ'ল আপনি মঞ্চস্থ সমস্ত পরিবর্তনগুলি শুরু করেছেন বা সমস্ত অযাচিত অবস্থায় শুরু করেছেন কিনা।

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

আপনি খুশি হয়ে গেলে, প্রয়োজনীয় পর্যায়ে ফাইলগুলি স্টেজ / আনস্টেজ করুন (আমি এটির জন্য ব্যবহার করতে চাই git gui), এবং ইউআই বা কমান্ড লাইনের মাধ্যমে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন

git commit

এটিই প্রথম প্রতিশ্রুতিবদ্ধ। এখন আপনি যে বিচ্ছিন্ন হয়ে যাওয়ার প্রতিশ্রুতি দিচ্ছেন তার পরে আপনি আপনার কর্মের অনুলিপিটি সেই অবস্থায় ফিরিয়ে আনতে চান যাতে আপনি পরবর্তী প্রতিশ্রুতিবদ্ধতার জন্য আরও পরিবর্তন আনতে পারেন। আপনি যে কমিট সম্পাদনা করছেন তার sha1 সন্ধান করতে, ব্যবহার করুন git status। স্থিতির প্রথম কয়েকটি লাইনে আপনি বর্তমানে চালানো রিবেস কমান্ডটি দেখতে পাবেন, যেখানে আপনি আপনার মূল প্রতিশ্রুতিটির sha1 খুঁজে পেতে পারেন:

$ git status
interactive rebase in progress; onto be83b41
Last commands done (3 commands done):
   pick 4847406 US135756: add debugging to the file download code
   e 65dfb6a US135756: write data and download from remote
  (see more in file .git/rebase-merge/done)
...

এই ক্ষেত্রে, আমি সম্পাদনা করছি যে প্রতিশ্রুতিটি সম্পাদনা করা হচ্ছে sha1 আছে 65dfb6a। এটি জেনেও, আমি আমার ওয়ার্কিং ডিরেক্টরিতে সেই প্রতিশ্রুতিবদ্ধ বিষয়বস্তুটি ফর্মটি ব্যবহার করে পরীক্ষা করতে পারি git checkoutযার আকার বা ফাইলের অবস্থান উভয়ই লাগে। .পুরো কাজের অনুলিপি প্রতিস্থাপন করতে এখানে আমি ফাইলের অবস্থান হিসাবে ব্যবহার করি :

git checkout 65dfb6a .

শেষে বিন্দু মিস করবেন না!

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

আপনি এখনই এগিয়ে যেতে পারেন এবং বিভক্তিটি শেষ করতে যেমন-তেমন প্রতিশ্রুতিবদ্ধ করতে পারেন, বা অন্যদিকে অন্তর্বর্তীকালীন প্রতিশ্রুতিবদ্ধ হওয়ার আগে কমিটের কিছু অংশ মুছে ফেলাতে আবার যেতে পারেন।

আপনি যদি এক বা একাধিক কমিটের জন্য মূল প্রতিশ্রুতি বার্তাটি পুনরায় ব্যবহার করতে চান তবে আপনি এটি রিবেসের কার্যকারী ফাইলগুলি থেকে সরাসরি ব্যবহার করতে পারেন:

git commit --file .git/rebase-merge/message

অবশেষে, একবার আপনি সমস্ত পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ হয়ে গেলে,

git rebase --continue

পুনর্বাসনের কাজ চালিয়ে যাবে এবং সম্পূর্ণ করবে।


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

1
আপনি আসল প্রতিশ্রুতি বার্তাটি যেভাবে ব্যবহার করেন তা পছন্দ করি।
সালমানদার

বিকল্প 2 ব্যবহার করা, যখন আমি git checkout *Sha I'm Editing* .এটি করি সর্বদা বলে Updated 0 paths from *Some Sha That's Not In Git Log*এবং কোনও পরিবর্তন দেয় না।
নওম্যানন

18

git rebase --interactiveকমিটকে ছোট কমিটে বিভক্ত করতে ব্যবহার করা যেতে পারে। রি-বেসের ফলে উপর গীত ডক্স প্রক্রিয়ার একটি সংক্ষিপ্ত, walkthrough আছে - বিভাজন করে :

ইন্টারেক্টিভ মোডে, আপনি "সম্পাদনা" ক্রিয়াটি দিয়ে কমিটগুলি চিহ্নিত করতে পারেন। যাইহোক, এর অর্থ এই নয় যে git rebaseএই সম্পাদনার ফলাফলটি ঠিক একটি প্রতিশ্রুতি হিসাবে প্রত্যাশা করে। প্রকৃতপক্ষে, আপনি প্রতিশ্রুতিটি পূর্বাবস্থায় ফেরাতে পারেন, বা আপনি অন্যান্য চুক্তি যুক্ত করতে পারেন। এটি একটি অঙ্গীকারকে দুটি ভাগে ভাগ করতে ব্যবহার করা যেতে পারে:

  • একটি ইন্টারেক্টিভ রিবেস শুরু করুন git rebase -i <commit>^, যেখানে <commit>আপনি ভাগ করতে চান সেই প্রতিশ্রুতি। প্রকৃতপক্ষে, যে কোনও প্রতিশ্রুতি সীমাবদ্ধ থাকবে যতক্ষণ না এতে কমিট থাকে।

  • "সম্পাদনা" অ্যাকশনটি দিয়ে আপনি যে কমিট বিভক্ত করতে চান তা চিহ্নিত করুন।

  • যখন সেই প্রতিশ্রুতি সম্পাদনা করার কথা আসে তখন সম্পাদন করুন git reset HEAD^। এর প্রভাবটি হ'ল হেড একের সাথে মিলে যায় এবং সূচকটি অনুসরণ করে। তবে কাজের গাছটি একই থাকে।

  • এখন সূচীতে পরিবর্তনগুলি যুক্ত করুন যা আপনি প্রথম প্রতিশ্রুতিতে রাখতে চান। এটি করতে আপনি git add(সম্ভবত ইন্টারেক্টিভভাবে) বা গিট গুই (বা উভয়) ব্যবহার করতে পারেন।

  • এখনই বর্তমান সূচীটি যে কোনও প্রতিশ্রুতিবদ্ধ বার্তাই উপযুক্ত Commit

  • আপনার কার্যকারী গাছ পরিষ্কার না হওয়া অবধি শেষ দুটি পদক্ষেপ পুনরাবৃত্তি করুন।

  • সঙ্গে রিবেস চালিয়ে যান git rebase --continue

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


উইন্ডোজ অধীনে, মনে রাখবেন ^কমান্ড লাইনের জন্য একটি পালানোর চরিত্র: এটি দ্বিগুণ করা উচিত। উদাহরণস্বরূপ, git reset HEAD^^পরিবর্তে ইস্যু git reset HEAD^
ফ্রেডেরিক

@ ফ্রিডরিক: s আমি এর মধ্যে কখনই প্রবেশ করিনি। কমপক্ষে পাওয়ারশেলের ক্ষেত্রে এটি হয় না। তারপরে ^দুবার রিসেট ব্যবহার করে বর্তমান হেডের চেয়ে দুটি কমিট পুনরায় সেট করা।
Farway

@ দূর পর্যন্ত, এটি একটি ক্লাসিক কমান্ড লাইনে চেষ্টা করুন। পাওয়ারশেল হ'ল অন্য একটি জন্তু, এর পালানোর চরিত্রটি ব্যাকটিলেট।
ফ্রেডেরিক

সংক্ষিপ্তসার হিসাবে: "HEAD^"সেন্টিমিডি.এক্সে বা পাওয়ারশেল, HEAD^^সেমিডি.এক্সে, HEAD`^পাওয়ারশেলে। শেলগুলি - এবং আপনার নির্দিষ্ট শেলটি কীভাবে কাজ করে তা শিখতে দরকারী (যেমন, কোনও কমান্ড কীভাবে পৃথক অংশে রূপান্তরিত হয় যা প্রোগ্রামে পাস হয়) যাতে আপনি আপনার নির্দিষ্ট শেলের জন্য ডান অক্ষরে অনলাইনে কমান্ডগুলি খাপ খাইয়ে নিতে পারেন। (উইন্ডোজের সাথে নির্দিষ্ট নয়।)
অ্যান্ড্রুএফ

11

এখন উইন্ডোজের সর্বশেষতম টর্টোজাইজেটে আপনি এটি খুব সহজেই করতে পারেন।

রিবেস ডায়ালগটি খুলুন, এটি কনফিগার করুন এবং নিম্নলিখিত পদক্ষেপগুলি করুন।

  • আপনি যে প্রতিশ্রুতি বিভক্ত করতে চান তার ডান ক্লিক করুন এবং " Edit" (বাছাই, স্কোয়াশ, মুছুন ...) নির্বাচন করুন।
  • Startরিবেসিং শুরু করতে " " ক্লিক করুন ।
  • এটি একবারে বিভক্ত হওয়ার প্রতিশ্রুতিতে পৌঁছে গেলে " Edit/Split" বোতামটি পরীক্ষা করে Amendসরাসরি " " ক্লিক করুন । কমিট ডায়লগ খোলে।
    সম্পাদনা / বিভক্ত প্রতিশ্রুতি
  • আপনি পৃথক প্রতিশ্রুতিবদ্ধ করতে চান ফাইলগুলি নির্বাচন করুন।
  • প্রতিশ্রুতিবদ্ধ বার্তাটি সম্পাদনা করুন এবং তারপরে " commit" ক্লিক করুন ।
  • কমিট করার মতো ফাইল না পাওয়া পর্যন্ত কমিট ডায়লগটি বারবার খোলা থাকবে। প্রতিশ্রুতি দেওয়ার জন্য যখন আর কোনও ফাইল নেই, তখনও আপনাকে জিজ্ঞাসা করবে আপনি আরও একটি প্রতিশ্রুতি যুক্ত করতে চান কিনা।

অত্যন্ত সহায়ক, ধন্যবাদ টর্টোজাইজিট!


10

আপনি ইন্টারেক্টিভ রিবেস করতে পারেন git rebase -i। ম্যান পৃষ্ঠাতে আপনি যা চান ঠিক তেমন রয়েছে:

http://git-scm.com/docs/git-rebase#_splitting_commits


14
ইস্যুগুলির কাছে কীভাবে যোগাযোগ করা যায় সে সম্পর্কে আরও কিছু প্রাসঙ্গিক দেওয়া। কেবল একটি আরটিএফএম দেওয়া কিছুটা সহায়ক হবে।
জর্দান ডি-ম্যাটসন

8

দয়া করে নোট করুন git reset --soft HEAD^। এটি অনুরূপ git reset(যা ডিফল্ট হয় --mixed) তবে এটি সূচির বিষয়বস্তু ধরে রাখে। যাতে আপনি যদি ফাইলগুলি যুক্ত / সরিয়ে থাকেন তবে তা ইতিমধ্যে আপনার সূচীতে রয়েছে in

দৈত্য কমিটগুলির ক্ষেত্রে খুব দরকারী হতে দেখা যায়।


3

এখানে কীভাবে ইন্টেলিজ আইডিইএ , পাইচার্ম , পিএইচপিস্টর্ম ইত্যাদি ক্ষেত্রে একটি কমিটকে বিভক্ত করা যায়

  1. সংস্করণ নিয়ন্ত্রণ লগ উইন্ডোতে, আপনি বিভক্ত করতে চান প্রতিশ্রুতি নির্বাচন করুন, ডান ক্লিক করুন এবং নির্বাচন করুন Interactively Rebase from Here

  2. আপনি যে হিসাবে বিভক্ত করতে চান তা চিহ্নিত করুন edit, ক্লিক করুনStart Rebasing

  3. আপনি দেখতে পাচ্ছেন যে একটি হলুদ ট্যাগ স্থাপন করা হয়েছে যার অর্থ হ'ল যে শৃঙ্খলায় সেট করা আছে। সেই প্রতিশ্রুতিতে রাইট ক্লিক করুন, নির্বাচন করুনUndo Commit

  4. এখন সেই প্রতিশ্রুতিগুলি মঞ্চে ফিরে এসেছে, তারপরে আপনি সেগুলি আলাদাভাবে প্রতিশ্রুতিবদ্ধ করতে পারেন। সমস্ত পরিবর্তন প্রতিশ্রুতিবদ্ধ হওয়ার পরে, পুরানো প্রতিশ্রুতি নিষ্ক্রিয় হয়ে যায়।


2

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


এসও স্ট্যান্ডার্ডগুলির মতে আজকাল এটি উত্তর-উত্তর হিসাবে যোগ্য হওয়া উচিত; তবে এটি এখনও অন্যদের জন্য সহায়ক হতে পারে, সুতরাং আপনার যদি আপত্তি না থাকে তবে দয়া করে এটি মূল পোস্টের মন্তব্যে স্থানান্তর করুন
ইয়াকভএল

@ ইয়াকোভেল যুক্তিসঙ্গত বলে মনে হচ্ছে। ন্যূনতম পদক্ষেপের প্রধান হিসাবে, আমি উত্তরটি মুছব না, তবে অন্য কেউ এটি করলে আমি আপত্তি করব না।
উইলিয়াম পার্সেল

এটি সমস্ত rebase -iপরামর্শের চেয়ে অনেক সহজ হবে । যদিও আমি মনে করি কোনও বিন্যাসের অভাবে এটি খুব বেশি মনোযোগ পেল না। হতে পারে আপনি এটি পর্যালোচনা করতে পারেন, এখন আপনার 126k পয়েন্ট রয়েছে এবং সম্ভবত কীভাবে করবেন তা জানেন। ;)
এরিকবওয়ার্ক


1

আপনার যদি এটি থাকে:

A - B <- mybranch

যেখানে আপনি প্রতিশ্রুতি বিতে কিছু সামগ্রী প্রতিশ্রুতিবদ্ধ করেছেন:

/modules/a/file1
/modules/a/file2
/modules/b/file3
/modules/b/file4

তবে আপনি বি কে সি - ডি তে ভাগ করতে চান এবং এই ফলাফলটি পেতে পারেন:

A - C - D <-mybranch

আপনি উদাহরণস্বরূপ এই বিষয়বস্তুকে বিভক্ত করতে পারেন (বিভিন্ন কমিটের বিভিন্ন ডিরেক্টরি থেকে সামগ্রী) ...

বিভক্ত হওয়ার আগে শাখাটি পুনরায় সেট করুন প্রতিশ্রুতিতে:

git checkout mybranch
git reset --hard A

প্রথম প্রতিশ্রুতিবদ্ধ (সি) তৈরি করুন:

git checkout B /modules/a
git add -u
git commit -m "content of /modules/a"

দ্বিতীয় প্রতিশ্রুতি (ডি) তৈরি করুন:

git checkout B /modules/b
git add -u
git commit -m "content of /modules/b"

বি এর উপরে যদি কমিট থাকে তবে কী হবে?
শীতলমাইন্ড

1

এটি 8 বছরেরও বেশি সময় পেরিয়ে গেছে, তবে সম্ভবত যে কোনওভাবেই এটি সহায়ক হতে পারে। আমি ছাড়া চালাকি করতে সক্ষম ছিল rebase -i। ধারণাটি হ'ল গিটকে একই অবস্থানে নিয়ে যাওয়া যা আপনি করার আগে করেছিলেন git commit:

# first rewind back (mind the dot,
# though it can be any valid path,
# for instance if you want to apply only a subset of the commit)
git reset --hard <previous-commit> .

# apply the changes
git checkout <commit-you-want-to-split>

# we're almost there, but the changes are in the index at the moment,
# hence one more step (exactly as git gently suggests):
# (use "git reset HEAD <file>..." to unstage)
git reset

এর পরে আপনি এই চকচকে দেখতে পাবেন Unstaged changes after reset:এবং আপনার রেপো এমন একটি অবস্থায় রয়েছে যেমন আপনি এই সমস্ত ফাইল প্রতিশ্রুত করতে চলেছেন। এখন থেকে আপনি সহজেই নিজের মতো করে আবারও প্রতিশ্রুতিবদ্ধ করতে পারেন। আশা করি এটা সাহায্য করবে.


0

প্রয়োজনীয় কমান্ডগুলির একটি দ্রুত রেফারেন্স, কারণ আমি মূলত জানি কী করতে হবে তবে সর্বদা সঠিক বাক্য গঠনটি ভুলে যাই:

git rebase -i <sha1_before_split>
# mark the targeted commit with 'edit'
git reset HEAD^
git add ...
git commit -m "First part"
git add ...
git commit -m "Second part"
git rebase --continue

ইমানুয়েল বার্নার্ডের ব্লগ পোস্টে কৃতিত্ব ।

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