গিট রিবেস: বিরোধগুলি অগ্রগতিতে বাধা রাখে


120

আমার একটি গিট শাখা রয়েছে (যা ভি 4 নামে পরিচিত), যা গতকাল মাস্টার থেকে তৈরি হয়েছিল। মাস্টারটিতে বেশ কয়েকটি পরিবর্তন হয়েছে, আমি ভি 4-তে যেতে চাই। সুতরাং, ভি 4-তে, আমি মাস্টারের কাছ থেকে রিবেস করার চেষ্টা করেছি, এবং একটি ফাইল জিনিসগুলিকে স্ক্রু আপ করে রাখে: একটি লাইনের পাঠ্য ফাইল, যাতে সংস্করণ নম্বর রয়েছে। এই ফাইলটি app/views/common/version.txt, যা প্রত্যাবর্তনের আগে এই পাঠ্যটি অন্তর্ভুক্ত করে:

v1.4-alpha-02

আমি যা করছি তা এখানে:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

version.txtএখন এই মত দেখায়:

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

সুতরাং, আমি এটি পরিপাটি করে রাখছি এবং এটি এখন দেখতে এটির মতো দেখাচ্ছে:

v1.4-alpha-02

এবং তারপরে আমি চালিয়ে যাওয়ার চেষ্টা করেছি: প্রথমে আমি একটি প্রতিশ্রুতিটি চেষ্টা করি:

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

ভাগ্য নেই। সুতরাং, আমি ফাইলটি যুক্ত করার চেষ্টা করছিলাম:

git add app/views/common/version.txt

কোন সাড়া নেই। আমার ধারণা, কোনও সংবাদই সুসংবাদ নয়। সুতরাং, আমি চালিয়ে যাওয়ার চেষ্টা করি:

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

এটি এই মুহুর্তে, এটিকে নিয়ে ঘুরতে যাওয়ার পরে, আমি আমার মাথাটি ডেস্ক থেকে বেঁধে দিই।

এখানে কি হচ্ছে? আমি কি ভুল করছি? কেউ আমাকে সোজা সেট করতে পারেন?

সম্পাদনা - আনতবু জন্য

আপনার পরামর্শ অনুসারে আমি ফাইলটি পরিবর্তন করেছি এবং একই ত্রুটি পেয়েছি:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

10
এই প্রশ্নটি জিজ্ঞাসা করার জন্য ধন্যবাদ .. আমি ঠিক একই সমস্যার মুখোমুখি
হয়েছি

6
চমৎকার হবে যদি আপনি কিছু উত্তর নিশ্চিত
holms

3
@ ম্যাক্স উইলিয়ামস, আমি মনে করি আপনি (আমার মত) @ ইউনতবু এর পরামর্শটির ভুল ব্যাখ্যা করেছেন : ১) প্রথমে আপনি দৌড়ান git rebase master এবং এটি ব্যর্থ হতে দিন ; 2) তারপরে আপনি এডিট করুন version.txtএবং এটিকে সেই বিন্দুটির মতো দেখতে হবে এবং সম্পাদনাটি সংরক্ষণ করুন; 3) তারপরে আপনি git add .../version.txt; 4) তারপর আপনি না git rebase --continue( না 'কমিট' )! যদি rebase --continueএখানে সফল হয় তবে এটি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ ( git commitএখানে কোনও প্রয়োজন নেই!) - তাই করার জন্য বাকি সমস্ত কিছুই git push(যদি আপনি কোনও রিমোট রেপো ব্যবহার করেন)। আশা করি এটি সাহায্য করে, যদি আমি এটি সঠিকভাবে পাই :)- চিয়ার্স!
sdaau

@ ম্যাক্সউইলিয়ামস, আপনি কি কখনও এর জন্য উত্তর পেয়েছেন: রুবি-ফর্ম / ডটকম / 187288 (অন্য কেউ যদি প্রথমে সেখানে না পান তবে আমি জবাব দেওয়ার পরে তাৎক্ষণিকভাবে এটি মুছে
ফেলব

উত্তর:


102

আমি রিবেস নিয়ে একই ধরণের সমস্যার মুখোমুখি হয়েছি। আমার সমস্যাটি হয়েছিল কারণ আমার প্রতিশ্রুতিগুলির মধ্যে একটি মাত্র একটি ফাইল পরিবর্তন করেছে এবং সমাধান করার সময় আমি এই প্রতিশ্রুতিতে প্রবর্তিত পরিবর্তনটি বাতিল করে দিয়েছি। আমি সংশ্লিষ্ট কমিট ( git rebase --skip) কে এড়িয়ে আমার সমস্যার সমাধান করতে সক্ষম হয়েছি ।

আপনি এই সমস্যাটিকে পরীক্ষার ভাণ্ডারে পুনরুত্পাদন করতে পারেন। প্রথমে সংগ্রহস্থল তৈরি করুন।

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

তারপরে version.txtমাস্টার এর মূল বিষয়বস্তু প্রতিশ্রুতিবদ্ধ ।

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

v4শাখা তৈরি করুন এবং এর সামগ্রী পরিবর্তন করুন version.txt

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

ফিরে যান masterএবং এর সামগ্রীর পরিবর্তন করুন version.txtযাতে রিবেস চলাকালীন একটি বিবাদ থাকবে।

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

v4শাখায় ফিরে যান এবং পুনরায় চালু করার চেষ্টা করুন। এটি version.txtপরিকল্পনা হিসাবে একটি সংঘাতের সাথে ব্যর্থ হয় ।

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

আমরা এর masterবিষয়বস্তু নির্বাচন করে সংঘাতের সমাধান করি version.txt। আমরা ফাইলটি যুক্ত করি এবং আমাদের পুনর্ব্যবহার চালিয়ে যাওয়ার চেষ্টা করি।

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

এটা ব্যর্থ! আসুন দেখে নেওয়া যাক gitআমাদের ভাণ্ডারে কী পরিবর্তন রয়েছে।

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

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

$ git rebase --skip
HEAD is now at 7313eb3 master

সতর্কতার শব্দ : দয়া করে নোট করুন যে git rebase --skipএটি gitপুনর্বাসনের চেষ্টা করেছিল এমন প্রতিশ্রুতি পুরোপুরি বাদ দেবে । আমাদের ক্ষেত্রে এটি ঠিক হওয়া উচিত যেহেতু gitঅভিযোগ করা এটি একটি খালি অঙ্গীকার। আপনি যদি ভাবেন যে একবার রিবেস সম্পূর্ণ হয়ে গেলে আপনি পরিবর্তনগুলি হারিয়ে ফেলেছেন, আপনি git reflogরিবেসের আগে আপনার ভান্ডারটির প্রতিশ্রুতি আইডিটি ব্যবহার git reset --hardকরতে পারেন এবং আপনার ডিপোটিকে সেই অবস্থায় ফিরিয়ে আনতে ব্যবহার করতে পারেন (এটি আরও একটি ধ্বংসাত্মক অপারেশন)।


4
সেই দীর্ঘ ব্যাখ্যাটি লেখার জন্য সময় দেওয়ার জন্য ধন্যবাদ স্যালভাইন! এটি এটি পরিষ্কার করে তোলে। আমি মনে করি যে আমি কোনও প্যাচ এড়িয়ে চলাতে সর্বদা নার্ভাস ছিলাম কারণ মনে হয়েছিল যে কাজটি নষ্ট হয়ে যেতে পারে: অর্থাত্ প্যাচটি দ্বন্দ্বের সাথে সংঘটিত একটির চেয়ে বরং রিবেস দ্বারা প্রভাবিত সমস্ত ফাইলকে জড়িত। প্যাচটি কি কেবল তখনই একটি ফাইলে একক একত্রীকরণ হয়?
ম্যাক্স উইলিয়ামস

3
না, একটি প্যাচে একটি একক প্রতিশ্রুতিতে পরিবর্তিত সমস্ত ফাইলের মধ্যে সমস্ত পার্থক্য রয়েছে। কিন্তু ব্যবহার করার সময় git rebase --skip, আপনি কেবল একটি একক প্রতিশ্রুতি এড়িয়ে যান। আমি git statusএই পরিস্থিতিতে আছি কিনা তা দেখার জন্য কোনও প্রতিশ্রুতি এড়িয়ে যাওয়ার আগে আমি সাধারণত একটি ইস্যু করি।
সিলভাইন ডিফ্রেসনে

1
আমি কেবল একটি দুর্দান্ত ব্যাখ্যা লেখার জন্য সময় দেওয়ার জন্য ধন্যবাদ বলার জন্য ম্যাক্সকে প্রতিধ্বনি করতে চেয়েছিলাম - অবশেষে বুঝতে পারছি কেন এটি হচ্ছে। আমি আর ভয় পাই rebase --skipনা :)।
বেন ডলম্যান

1
সতর্কতা - আপনার যদি একটি প্রতিশ্রুতিতে বেশ কয়েকটি পরিবর্তন হয়, আপনি গিট রিবেস --স্কিপ করে কাজ হারাতে পারেন। আমি সবেমাত্র করেছি
ক্রিসি এইচ

@ ক্রিসিএইচ না করা আপনি যদি না করেন git reflog purgeবা git reflog deleteআপনি এখনও ব্যবহার করে আপনার পরিবর্তনগুলি ফিরে পেতে পারেন git reflog। সেখানে বর্ণিত বিভিন্ন প্রতিশ্রুতি চেক আউট করার চেষ্টা করুন, আপনি সম্পূর্ণ শুরু করার আগে তার মধ্যে একটি আপনার গাছের অবস্থা হওয়া উচিত git rebase
সিলভাইন ডিফ্রেসনে

23

এখান থেকে উদ্ধৃত: http : // wholemeal.co.nz/node/9

হাহ?!? না, আমি গিট অ্যাড ব্যবহার করতে ভুলে যাইনি, আমি এটি করেছি ... 2 সেকেন্ড আগে ভালো লেগেছে!

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

ত্রুটি বার্তাটি খুব স্বজ্ঞাত নয়, তবে এতে উত্তর রয়েছে। আমাদের এই প্যাচটি এড়িয়ে যাওয়ার জন্য পুনরায় বলার দরকার। ফাইলে সংঘাতের চিহ্নিতকারীদের ঠিক করারও দরকার নেই। আপনি যে শাখাটি পুনরায় চালু করছেন তার ফাইল সংস্করণটি শেষ করবেন।

$ git rebase --skip

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

প্রকৃতপক্ষে, আমি মনে করি এটি ক্রমাগত চলমান গিট মার্জেটুল, তারপরে গিট রিবেস - কনটিনিউ, তারপর গিট মার্জেটুল ইত্যাদি সমন্বয় ছিল যা শেষ পর্যন্ত আমার পরিস্থিতি স্থির করেছিল।
geerlingguy

6

এই ত্রুটি বার্তাটি আপনার ফলাফল git commit -a -m "merged"। যদি আপনি কেবল ফাইলটি ঠিক করেন, তবে চালান git add <file>, এবং git rebase --continue, এটি ভাল কাজ করা উচিত। git rebase --continueপ্রতিশ্রুতিবদ্ধ হওয়ার চেষ্টা করছে, কিন্তু এটি সন্ধান করার জন্য কোনও মুলতুবি পরিবর্তন নেই (কারণ আপনি ইতিমধ্যে তাদের প্রতিশ্রুতি দিয়েছিলেন)।


1
কমপক্ষে সাধারণ ক্ষেত্রে এড়িয়ে যাওয়ার চেয়ে এটি বেশ ভাল যুক্তিযুক্ত বলে মনে হয়। আমি অবাক হয়েছি এটি সেরা উত্তর হিসাবে তালিকাভুক্ত নয়।
পান্না

1
@ এমেরালডি।, কাজ করে না। ফাইল ঠিক করা এবং চলমান git add <file>সমস্যার সমাধান করবে না। git rebase --continue এখনও প্রতিবেদনগুলিNo changes - did you forget to use 'git add'?
পেসিয়ার

6

অ্যাপ্লিকেশন / দর্শনগুলি / সাধারণ / version.txt এ পরিবর্তন করুন

v1.4-alpha-01

রিবাজে এই মুহুর্তে, মনে রাখবেন যে আপনি অ-মাস্টার শাখার অগ্রগতি দেখানোর জন্য মার্জ সংঘাতগুলি সমাধান করছেন ।

সুতরাং, থেকে মুক্তি

      A---B---C topic
     /
D---E---F---G master

প্রতি

              A*--B*--C* topic
             /
D---E---F---G master

আপনি যে দ্বন্দ্ব সমাধান করছেন তা বিষয় শাখায় কীভাবে * তৈরি করবেন।

সুতরাং কাজ করার পরে git rebase --abort, আদেশগুলি হওয়া উচিত

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue

3
ধন্যবাদ আনতুবু, আমি চেষ্টা করেছিলাম কিন্তু ভাগ্য নেই: নতুন সম্পাদনার জন্য ওপি দেখুন। চিয়ার্স
ম্যাক্স উইলিয়ামস

4

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

এই সর্বনিম্ন উদাহরণে, প্রত্যাবর্তন প্রত্যাশা অনুযায়ী কাজ করে। আপনি কি এমন উদাহরণ প্রদান করতে পারেন যা আপনি যে আচরণটি দেখছেন তা দেখায়?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue

4

এখানে কিছু ধারনা:

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