গিট সংগ্রহস্থলের প্রথম দুটি কমিট একত্রিত করবেন?


197

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

A-B-C

আমি দুই করে একত্রিত করতে চাই একটি এবং বি এক কমিট এবি :

AB-C

আমি চেষ্টা করেছিলাম

git rebase -i A

যা নিম্নলিখিত বিষয়বস্তু সহ আমার সম্পাদককে খুলবে:

pick e97a17b B
pick asd314f C

আমি এই পরিবর্তন

squash e97a17b B
pick asd314f C

তারপরে গিট 1.6.0.4 বলেছেন:

Cannot 'squash' without a previous commit

কোন উপায় আছে বা এটি কি অসম্ভব?



উত্তর:


168

git rebase -i --root গিট সংস্করণ 1.7.12 হিসাবে ব্যবহার করুন ।

ইন্টারেক্টিভ রি-বেসের ফলে ফাইলের মধ্যে, কমিট দ্বিতীয় লাইন পরিবর্তন বি থেকে স্কোয়াশ এবং অন্যান্য লাইনের ছেড়ে পিক :

pick f4202da A
squash bea708e B
pick a8c6abc C

এই দুটি করে একত্রিত করা হবে একটি এবং বি এক কমিট এবি

এই উত্তরে পাওয়া গেছে ।


126

আপনি চেষ্টা করেছেন:

git rebase -i A

মনে হচ্ছে শুরু করার জন্য সম্ভব যে আপনি চালিয়ে যেতে চান editবদলে squash:

edit e97a17b B
pick asd314f C

তারপর চালান

git reset --soft HEAD^
git commit --amend
git rebase --continue

সম্পন্ন.


4
আপনি যদি চুপচাপ কোনও গিথুব গিস্টটি ঠিক করার জন্য এটি করছেন, আপনাকে কমিটের সাথে -m "প্রাথমিক" যুক্ত করতে হবে। ;-)
ব্রুনো ব্রোনসকি

1
git rebase --abortআবার শুরু করতে এবং এটি সঠিক উপায়ে করতে (সম্পাদকটিতে প্রথম প্রতিশ্রুতি স্কোয়াশ করে না)
ওমা

66

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

এ এবং বি এবং বি এবং সি এর মধ্যে একাধিক কমিট থাকলেও এই রেসিপিটি কাজ করে

# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout <sha1_for_B>

# reset the branch pointer to the initial commit,
# but leaving the index and working tree intact.
git reset --soft <sha1_for_A>

# amend the initial tree using the tree from 'B'
git commit --amend

# temporarily tag this new initial commit
# (or you could remember the new commit sha1 manually)
git tag tmp

# go back to the original branch (assume master for this example)
git checkout master

# Replay all the commits after B onto the new initial commit
git rebase --onto tmp <sha1_for_B>

# remove the temporary tag
git tag -d tmp

1
আমি যখন করিgit rebase --onto tmp <sha1_for_B>
এলেক্স

মাত্র দুটি কমিট (যেটি আমি একটিতে রোল করতে চেয়েছিলাম) দিয়ে আমার একটি ব্র্যান্ড নিউ রেপো বিবেচনা করে, এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছিল। আপনাকে ধন্যবাদ সিসিবি বেইলি
রোমানরনিন

10

ইন্টারেক্টিভ রিবেসের ক্ষেত্রে, আপনাকে এ এর ​​আগে এটি করতে হবে যাতে তালিকাটি হবে:

pick A
pick B
pick C

হতে:

pick A
squash B
pick C

এ যদি প্রাথমিক প্রতিশ্রুতি থাকে তবে এ গিট তারতম্যের বিষয়ে ভাবার আগে আপনাকে আলাদা আলাদা প্রাথমিক প্রতিশ্রুতিবদ্ধ করতে হবে, এটি (এ এবং বি) এবং (বি এবং সি) এর মধ্যে পার্থক্য নিয়ে কাজ করবে। সুতরাং স্কোয়াশ আপনার উদাহরণে কাজ করছে না।


9

আপনার কাছে কোস্টমো এর উত্তরটি ব্যবহার করে কয়েকশ বা হাজার হাজার কমিট রয়েছে

git rebase -i --root

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

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

git checkout --orphan orphan <second-commit-sha>
git commit -m "Enter a commit message for the new root commit"
git rebase --onto orphan <second-commit-sha> master

নথিপত্র


1

একটি সম্পর্কিত প্রশ্নে, আমি প্রথম প্রতিশ্রুতিটির বিরুদ্ধে স্কোয়াশিংয়ের প্রয়োজনীয়তার জন্য একটি ভিন্ন পদ্ধতির সাথে এগিয়ে এসেছি, যা এটি দ্বিতীয়টি করার পক্ষে রয়েছে।

আপনি যদি আগ্রহী: গিট: প্রথম হিসাবে প্রতিশ্রুতি কীভাবে সন্নিবেশ করবেন, অন্য সকলকে স্থানান্তর করবেন?


উত্তরটিও এখানে পুনরাবৃত্তি করা ভাল কি হবে? আমি নিশ্চিত নই.

0

স্কোয়াডের জন্য গিট কমান্ড: গিট রিবেস -i হেড ~ [কমিটের সংখ্যা]

বলুন আপনার কাছে গিট কমিটের ইতিহাস নীচে রয়েছে:


5152061 বৈশিষ্ট্যটি চয়ন করুন: চিত্র সংরক্ষণের জন্য সমর্থন যুক্ত করা হয়েছে। (ক)
39c5a04 ফিক্স চয়ন করুন: বাগ ফিক্স। (বি)
839c6b3 সংশোধন করুন: বিরোধ নিষ্পত্তি হয়েছে resolved (গ)

এখন আপনি A এবং B কে AB তে স্কোয়াশ করতে চান, নীচের পদক্ষেপগুলি সম্পাদন করুন:


5152061 বৈশিষ্ট্যটি চয়ন করুন: চিত্র সংরক্ষণের জন্য সমর্থন যুক্ত করা হয়েছে। (ক)
এর 39c5a04 ফিক্স: বাগ ফিক্স। (খ)
839c6b3 সংশোধন করুন: বিরোধ নিষ্পত্তি হয়েছে resolved (গ)

দ্রষ্টব্য: স্কোয়াশিং কমিটের জন্য আমরা স্কোয়াশ বা এস ব্যবহার করতে পারি। শেষ ফলাফলটি হবে:
5152061 কীর্তিটি চয়ন করুন: চিত্র সংরক্ষণের জন্য যোগ করা সমর্থন। (এবি)
839c6b3 সংশোধন করুন: বিরোধ নিষ্পত্তি হয়েছে resolved (গ)


-1

আপনাকে কিছুটা কমান্ড-লাইন ম্যাজিক সম্পাদন করতে হবে।

git checkout -b a A
git checkout B <files>
git commit --amend
git checkout master
git rebase a

এটি আপনাকে এমন একটি শাখা ছেড়ে দেবে যাতে কমিট হিসাবে AB এবং C রয়েছে।


পুরানো এবং নতুন প্রাথমিক কমিটগুলির কোনও সাধারণ পূর্বপুরুষ না থাকায় আপনি কিছু অযৌক্তিক দ্বন্দ্ব পেতে পারেন কারণ গিট মাস্টারটির পুরো ইতিহাসটি একটিতে সাধারণভাবে প্রয়োগ করার পরেও মাস্টারটির পুরো ইতিহাস প্রয়োগ করার চেষ্টা করে। গিট রিবেস করার জন্য --onto বিকল্পটি ব্যবহার করে আপনি গিটকে প্রয়োগ শুরু করার জন্য সঠিক জায়গাটি বলতে পারেন।
সিবি বেইলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.