একটি নির্দিষ্ট প্রতিশ্রুতি পরিবর্তন কিভাবে?


2230

আমি সাধারণত পর্যালোচনার জন্য কমিটের একটি তালিকা জমা দিই। আমার যদি নিম্নলিখিত কমিট থাকে:

  1. HEAD
  2. Commit3
  3. Commit2
  4. Commit1

... আমি জানি যে আমি মাথার প্রতিশ্রুতি দিয়ে সংশোধন করতে পারি git commit --amend। কিন্তু আমি কীভাবে সংশোধন করতে পারি Commit1, এটি প্রদত্ত HEADপ্রতিশ্রুতি নয়?


31
বিকল্প বিকল্পটি এখানে দেখুন: stackoverflow.com/a/18150592/520567 আপনার গৃহীত উত্তরটি আপনার প্রশ্নের সত্যই একটি সঠিক উত্তর তবে আপনি সম্পাদনা ব্যবহারের সিদ্ধান্ত নেওয়ার আগে যদি আপনার নতুন প্রতিশ্রুতি প্রস্তুত থাকে, তবে এই উত্তরটি আরও সহজবোধ্য হবে। এটি কোনও পুরানোের সাথে একত্রীকরণ / স্কোয়াশ করতে চান এমন একাধিক প্রতিশ্রুতিগুলির সাথেও কাজ করতে পারে।
akostadinov

6
এছাড়াও আপনি শুধু দেখতে পারেন বিভাজন একটি কমিট মধ্যে rewriting ইতিহাস - গীত সরঞ্জামসমূহ আরও তথ্যের জন্য।
hakre

উত্তর:


2950

আপনি গিট রিবেস ব্যবহার করতে পারেন । উদাহরণস্বরূপ, আপনি যদি প্রতিশ্রুতি পরিবর্তন করতে চান তবে bbc643cdচালান

$ git rebase --interactive 'bbc643cd^'

^কমান্ডের শেষে ক্যারেটটি লক্ষ্য করুন , কারণ আপনি যেটি সংশোধন করতে চান তার আগে আপনাকে অবশ্যই কমিটের কাছে ফেরত দিতে হবে

ডিফল্ট এডিটর ইন, সংশোধন pickকরার জন্য editলাইন উল্লেখ 'bbc643cd' থেকে।

ফাইলটি সংরক্ষণ করুন এবং প্রস্থান করুন: গিটটি ফাইলটিতে কমান্ডগুলির ব্যাখ্যা ও স্বয়ংক্রিয়ভাবে কার্যকর করবে। আপনি আগের পরিস্থিতিতে নিজেকে খুঁজে পাবেন যেখানে আপনি সবেমাত্র প্রতিশ্রুতি তৈরি করেছিলেন bbc643cd

এই মুহুর্তে, bbc643cdআপনার শেষ প্রতিশ্রুতিবদ্ধ এবং আপনি সহজেই এটিকে সংশোধন করতে পারেন : আপনার পরিবর্তনগুলি করুন এবং তারপরে কমান্ডটি দিয়ে তাদের প্রতিশ্রুতিবদ্ধ করুন:

$ git commit --all --amend --no-edit

এর পরে, টাইপ করুন:

$ git rebase --continue

আগের হেড কমিটিতে ফিরে আসার জন্য।

সতর্কতা : নোট করুন যে এটি সেই প্রতিশ্রুতির SHA-1 এবং একই সাথে সমস্ত শিশুকে বদলে দেবে - অন্য কথায়, এটি ইতিহাসটিকে সেই বিন্দু থেকে আবারও লিখে দেয়। আপনি যদি কমান্ডটি ব্যবহার করে চাপ দিন তবে আপনি এটি করতে বিরতি দিতে পারেনgit push --force


125
এই প্রবাহের মধ্যে আরেকটি আকর্ষণীয় বিকল্প হ'ল একবার আপনি সংশোধন করতে চান এমন প্রতিশ্রুতিতে চলে আসার পরিবর্তে, ফাইলগুলি সংশোধন করার পরিবর্তে এবং উপরের প্রতিশ্রুতিতে সজ্জিত হওয়ার পরিবর্তে (আপনি যেটি সম্পাদনা করছেন) আপনি সেই প্রতিশ্রুতিটিকে দুটি ভিন্ন কমিটে বিভক্ত করতে পারেন (বা আরও বেশি)। সেক্ষেত্রে সম্পাদনার প্রতিশ্রুতিতে ফিরে যান এবং "গিট রিসেট হেড ^" চালান। এটি সেই প্রতিশ্রুতির পরিবর্তিত ফাইলগুলি মঞ্চে ফেলবে। এখন আপনার ইচ্ছামত যেকোন ফাইল বাছাই করুন এবং প্রতিশ্রুতিবদ্ধ করুন। "গিট-রিবেস" ম্যান পৃষ্ঠাতে এই প্রবাহটি বেশ ভালভাবে ব্যাখ্যা করা হয়েছে। "বিভাজন কমিট" বিভাগটি দেখুন। bit.ly/d50w1M
দিয়েগো পিনো

200
গিট ১.6..6 এ এবং এর চেয়েও নতুন আপনি rewordএর git rebase -iপরিবর্তে অ্যাকশনটি ব্যবহার করতে পারেন edit(এটি স্বয়ংক্রিয়ভাবে সম্পাদকটি খোলার জন্য এবং পুনর্বাসনের বাকী সমস্ত পদক্ষেপগুলি অবিরতভাবে চালিয়ে যেতে পারে; এটি ব্যবহারকে বাধা দেয় git commit --ammendএবং git rebase --continueযখন আপনাকে কেবল কমিটের বার্তা পরিবর্তন করতে হবে, সামগ্রীটি নয় )।
ক্রিস জনসন

108
এটি লক্ষণীয় যে আপনার যদি git stashআগে git rebaseথেকে git stash popপরিবর্তনগুলি মুলতুবি করে থাকে তবে আপনাকে আগে এবং তারপরে চালনার দরকার হতে পারে ।
ব্যবহারকারী 123444555621

3
ইন্টারেক্টিভ রিবাজে কোনও নির্দিষ্ট কমিট সম্পাদনা করার জন্য শর্টকাট কমান্ডটি কি সম্পাদকটি না খোলার পরে, প্রতিশ্রুতি খুঁজে না পাওয়া, সম্পাদনাটিকে চিহ্নিত করে, তারপর কমান্ড লাইনে পিছনে ফেলে দেওয়া হয়?
স্টার

15
নোট করুন যে আরও নতুন গিট দিয়ে git commit --all --amend --no-editএখানে অন্ধভাবে ব্যবহার না করে প্রম্পট নির্দেশাবলী অনুসরণ করা বুদ্ধিমানের কাজ হবে । সকল আমি পরে কি ছিল git rebase -i ...ছিল git commit --amendস্বাভাবিকভাবে তারপর git rebase --continue
এরিক চেন

452

দারুণ ইন্টারেক্টিভ রিবেস ব্যবহার করুন:

git rebase -i @~9   # Show the last 9 commits in a text editor

কমিট আপনি চান, পরিবর্তন খুঁজুন pickকরার e( edit), এবং সংরক্ষণ করুন এবং বন্ধ ফাইল। গিট সেই প্রতিশ্রুতিতে পুনরায় পাঠাবে, আপনাকে উভয়কেই অনুমতি দেবে:

  • git commit --amendপরিবর্তন করতে ব্যবহার করুন, বা
  • git reset @~শেষ প্রতিশ্রুতি বাতিল করতে ব্যবহার করুন , তবে ফাইলগুলিতে পরিবর্তনগুলি নয় (যেমন আপনি ফাইলগুলি সম্পাদনা করার সময় আপনি যেখানে ছিলেন সেখানে পৌঁছেছিলেন তবে এখনও প্রতিশ্রুতিবদ্ধ ছিলেন না)।

পরেরটি আরও জটিল স্টাফগুলি যেমন একাধিক কমিটে বিভক্ত করার জন্য দরকারী।

তারপরে, চালান git rebase --continue, এবং গিট আপনার পরিবর্তিত কমিটের শীর্ষে পরবর্তী পরিবর্তনগুলি পুনরায় খেলবে। আপনাকে কিছু সংহত বিবাদগুলি ঠিক করতে বলা হতে পারে।

নোট: @জন্য সাধারণভাবে সংক্ষেপে হয় HEAD, এবং ~কমিট আগে নিদিষ্ট কমিট হয়।

গিট ডক্সে ইতিহাসের পুনর্লিখন সম্পর্কে আরও পড়ুন ।


পুনর্বাসন করতে ভয় পাবেন না

প্রোটিপ ™: ইতিহাসকে পুনর্লিখন করে এমন "বিপজ্জনক" আদেশগুলি নিয়ে পরীক্ষা করতে ভয় করবেন না - গিট ডিফল্টরূপে 90 দিনের জন্য আপনার কমিটগুলি মুছে দেয় না; আপনি এগুলি রিফ্লগে খুঁজে পেতে পারেন:

$ git reset @~3   # go back 3 commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* যেমন --hardএবং --forceযদিও বিকল্পগুলি দেখুন - তারা ডেটা বাতিল করতে পারে।
* এছাড়াও, আপনি সহযোগিতা করছেন এমন কোনও শাখায় ইতিহাস পুনর্লিখন করবেন না।



অনেক সিস্টেমে, git rebase -iডিফল্টভাবে ভিম খুলবে। ভিম বেশিরভাগ আধুনিক পাঠ্য সম্পাদকের মতো কাজ করে না, সুতরাং কীভাবে ভিম ব্যবহার করে পুনরায় ব্যবহার করবেন তা একবার দেখুন । আপনি যদি কোনও ভিন্ন সম্পাদক ব্যবহার করতে চান তবে এটি দিয়ে পরিবর্তন করুন git config --global core.editor your-favorite-text-editor


29
আপনার উত্তরের মাঝখানে হ'ল একটি অদ্ভুত জায়গা যা আমি কেবল ভিআইএমের জন্য একটি বিজ্ঞাপনের বিজ্ঞাপন হিসাবে বর্ণনা করতে পারি put এটি প্রশ্নের সাথে অপ্রাসঙ্গিক এবং কেবল আপনার উত্তরটিকে বিশৃঙ্খলা করে।
ইন্টেন্টস

21
@ তথ্যসূত্র: আহ, আমি দেখতে পাচ্ছি যে কেন অদ্ভুত লাগছিল। এর পিছনে যুক্তিটি হ'ল ভিমে অনেক সিস্টেমে ডিফল্ট পাঠ্য সম্পাদক, তাই অনেকের ইন্টারেক্টিভ রিবেসিংয়ের প্রথম অভিজ্ঞতা এমন একটি স্ক্রিন যেখানে টাইপিং কর্সারটিকে সমস্ত জায়গাতেই উড়ে যায়। তারপরে, তারা তাদের সম্পাদককে অন্য কোনওটিতে স্যুইচ করে এবং তাদের ইন্টারেক্টিভ রিবেসিংয়ের দ্বিতীয় অভিজ্ঞতা মোটামুটি স্বাভাবিক, তবে এটি জিইআইয়ের পরিবর্তে কোনও টেক্সট ফাইল কেন ব্যবহার করে তা ভেবে তাদের ছেড়ে যায়। রিবিসিংয়ের সাথে প্রবাহ অর্জন করতে আপনার ভিম বা ইমাসের রিবেস-মোডের মতো কিছু দরকার।
জাজ

9
ঠিক আছে. অনেক লোক যে অংশটিকে অপ্রাসঙ্গিক বলে মনে হচ্ছে, আমি এটি 3 টি লাইনে ঘনীভূত করেছি এবং প্রয়োজনে সম্পাদককে কীভাবে পরিবর্তন করতে হবে তাও ব্যাখ্যা করেছি।
জাজ

17
অসাধারণ! আমি জানতাম না যে আপনি @শর্টহ্যান্ড হিসাবে ব্যবহার করতে পারেন HEAD। এই পোস্ট করার জন্য ধন্যবাদ।
জেমস কো

3
git reset @~কমিটিকে বেছে নেওয়ার পরে ঠিক কী করতে চাইছিলাম git rebase ...। আপনি আমার নায়ক)
18 ই

79

ইন্টারেক্টিভ রি-বেসের ফলে সঙ্গে --autosquashকিছু যখন আমি ইতিহাসে গভীর পূর্ববর্তী করে ফিক্সআপ প্রয়োজন আমি প্রায়শই ব্যবহার করা হয়। এটি জেলুএক্সের উত্তর চিত্রিত করার প্রক্রিয়াটি মূলত গতিময় করে তোলে এবং যখন আপনার একাধিক প্রতিশ্রুতি থাকে তখন আপনাকে সম্পাদনা করার প্রয়োজন হয় especially

ডকুমেন্টেশন থেকে:

--autosquash

কমিট লগ বার্তাটি যখন "স্কোয়াশ!…" (বা "ফিক্সআপ! ...") দিয়ে শুরু হয়, এবং এমন একটি প্রতিশ্রুতি থাকে যার শিরোনামটি একই সাথে শুরু হয় ..., রিবেস -i-এর টোডো তালিকাটি স্বয়ংক্রিয়ভাবে সংশোধন করুন যাতে প্রতিশ্রুতিবদ্ধ স্কোয়াশিংয়ের জন্য চিহ্নিত চিহ্নিতটি সংশোধন করার প্রতিশ্রুতি দেওয়ার পরে আসে

ধরুন আপনার কাছে এমন একটি ইতিহাস রয়েছে যা দেখতে এরকম দেখাচ্ছে:

$ git log --graph --oneline
* b42d293 Commit3
* e8adec4 Commit2
* faaf19f Commit1

এবং আপনার এমন পরিবর্তন রয়েছে যা আপনি কমিট 2 এ সংশোধন করতে চান তারপরে আপনার পরিবর্তনগুলি ব্যবহার করে প্রতিশ্রুতিবদ্ধ

$ git commit -m "fixup! Commit2"

বিকল্পভাবে আপনি প্রতিশ্রুতি বার্তার পরিবর্তে কমিট শ ব্যবহার করতে পারেন, তাই "fixup! e8adec4বা কমিট বার্তার কেবল একটি উপসর্গও।

তারপরে কমিটের উপর ইন্টারেক্টিভ রিবেস শুরু করুন

$ git rebase e8adec4^ -i --autosquash

আপনার সম্পাদক ইতিমধ্যে সঠিকভাবে অর্ডার করা কমিটগুলির সাথে খোলা হবে

pick e8adec4 Commit2
fixup 54e1a99 fixup! Commit2
pick b42d293 Commit3

আপনাকে যা করতে হবে তা হ'ল সংরক্ষণ এবং প্রস্থান


21
আপনি git commit --fixup=@~পরিবর্তে ব্যবহার করতে পারেন git commit -m "fixup! Commit2"। এটি বিশেষত কার্যকর যখন আপনার প্রতিশ্রুতিবদ্ধ বার্তাগুলি দীর্ঘ হয় এবং পুরো জিনিসটি টাইপ করতে ব্যথা হয়।
জাজ

42

চালান:

$ git rebase --interactive commit_hash^

প্রত্যেকে ^ইঙ্গিত করে যে আপনি কতটা কমিট সম্পাদনা করতে চান, যদি তা কেবলমাত্র একটি (আপনার নির্দিষ্ট করে দেওয়া প্রতিশ্রুতি) থাকে, তবে আপনি কেবল একটি যুক্ত করুন ^

তেজ আপনি শব্দের পরিবর্তন ব্যবহার pickকরতে rewordসংরক্ষণ, করে আপনি পরিবর্তন করতে চান তাদের জন্য এবং প্রস্থান ( :wq)। তারপরে গিট আপনাকে প্রতিটি প্রতিশ্রুতিতে অনুরোধ করবে যা আপনি পুনরায় শব্দ হিসাবে চিহ্নিত করেছেন যাতে আপনি প্রতিশ্রুতি বার্তা পরিবর্তন করতে পারেন।

প্রতিটি প্রতিশ্রুতি বার্তা আপনাকে সংরক্ষণ :wqকরতে হবে এবং পরের প্রতিশ্রুতি বার্তায় যেতে ( ) ছেড়ে দিতে হবে

আপনি যদি পরিবর্তনগুলি প্রয়োগ না করেই প্রস্থান করতে চান তবে টিপুন :q!

সম্পাদনা : এ নেভিগেট করতে vimআপনি ব্যবহার jপর্যন্ত যেতে, kনিচে যেতে hবাম যেতে, এবং lসরাসরি যান (সমস্ত এই NORMALমোড, প্রেস ESCযেতে NORMALমোড)। একটি পাঠ্য সম্পাদনা করতে, টিপুন iযাতে আপনি INSERTমোডটি প্রবেশ করেন , যেখানে আপনি পাঠ্য সন্নিবেশ করান। মোডে ESCফিরে যেতে টিপুন NORMAL:)

আপডেট : এখানে গিথব তালিকা থেকে দুর্দান্ত লিঙ্কটি কীভাবে গিটের সাথে কোনও কিছু পূর্বাবস্থায় ফেলা যায় (প্রায়)


4
আমার জন্য নিখুঁতভাবে কাজ করেছেন। উল্লেখযোগ্য git push --force?
u01jmg3

git push --forceরিমোটগুলি কী করবে তা আপনার স্থানীয় কমিটগুলির সাথে কমানো। এটি এই বিষয়টির ক্ষেত্রে নয় :)
betoharres

@ বেটুউউউ অবশ্যই আপনার প্রতিশ্রুতিগুলি যদি রিমোটে চলে যায় এবং আপনি স্থানীয়ভাবে প্রতিশ্রুতি বার্তা পরিবর্তন করেছেন, আপনি রিমোটে চাপ দিতে বাধ্য করতে চান, তাই না?
সুদীপ ভান্ডারী

@ সুদীপভাণ্ডারী এটাই আমার বোধ হয়। আমি জোর করিনি, এবং এখন আমার একটি অতিরিক্ত শাখা রয়েছে, যাঁর বার্তা আমি বদলেছি, যা অতি-কুরুচিপূর্ণ তার প্রতি সমস্ত কমান্টকে মিরর করে।
ruffin

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

18

যদি কোনও কারণে আপনি ইন্টারেক্টিভ সম্পাদকগুলি পছন্দ করেন না তবে আপনি ব্যবহার করতে পারেন git rebase --onto

বলুন আপনি সংশোধন করতে চান Commit1। প্রথম, আগে থেকে শাখা Commit1:

git checkout -b amending [commit before Commit1]

দ্বিতীয়ত, দখল Commit1সঙ্গে cherry-pick:

git cherry-pick Commit1

এখন, আপনার পরিবর্তনগুলি সংশোধন করে তৈরি করুন Commit1':

git add ...
git commit --amend -m "new message for Commit1"

এবং অবশেষে, অন্য কোনও পরিবর্তন স্থগিত করার পরে, আপনার অবশিষ্ট প্রতিশ্রুতিগুলি masterআপনার নতুন প্রতিশ্রুতি শীর্ষে স্থানান্তর করুন :

git rebase --onto amending Commit1 master

পড়ুন: "শাখায় রিবেস করুন, amendingসমস্ত Commit1(অ-সমেত) এবং master(অন্তর্ভুক্ত) এর মধ্যে কমিট করে "। এটি, কমিট 2 এবং কমিট 3, পুরানো কমিট 1 কে পুরোপুরি কেটে ফেলুন। আপনি কেবল তাদের চেরি-বাছাই করতে পারেন, তবে এই উপায়টি সহজ।

আপনার শাখা পরিষ্কার করতে মনে রাখবেন!

git branch -d amending

4
আপনি git checkout -b amending Commit1~1পূর্বের প্রতিশ্রুতিটি পেতে ব্যবহার করতে পারেন
অ্যারিন টেলর

প্রথম দুটি পদক্ষেপ কি সমান git checkout -b amending Commit1?
হাওশু

16

ডকুমেন্টেশন উপর ভিত্তি করে

পুরানো বা একাধিক প্রতিশ্রুতি বার্তাগুলির সংশোধন করা

git rebase -i HEAD~3 

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

pick e499d89 Delete CNAME
pick 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.

প্রতিস্থাপন বাছাই সঙ্গে ভিন্ন শব্দে রচনা আগে প্রতিটি পরিবর্তন করতে চান বার্তা কমিট। যাক আপনি তালিকার দ্বিতীয় প্রতিশ্রুতি পরিবর্তন করেছেন, আপনার ফাইলটি নীচের মত দেখাবে:

pick e499d89 Delete CNAME
reword 0c39034 Better README
pick f7fde4a Change the commit message but push the same commit.

কমিট লিস্ট ফাইলটি সংরক্ষণ এবং বন্ধ করুন, এটি আপনার প্রতিশ্রুতি বার্তা পরিবর্তন করতে, প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে এবং সংরক্ষণ করার জন্য একটি নতুন সম্পাদককে পপ আপ করবে।

সংশোধিত প্রতিশ্রুতিগুলি ফিনালি ফোর্স-পুশ করুন।

git push --force

আমি নিম্নলিখিত ত্রুটিটি পেয়েছি: ত্রুটি: সম্পাদক 'vi' নিয়ে একটি সমস্যা ছিল। অনুগ্রহ করে -m বা -F বিকল্পটি ব্যবহার করে বার্তা সরবরাহ করুন।
এরিক মেইনার্ড

12

সম্পূর্ণ অ-ইন্টারেক্টিভ কমান্ড (1)

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

git config --global alias.amend-to '!f() { SHA=`git rev-parse "$1"`; git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"; }; f'

এই কমান্ড সবচেয়ে বড় সুবিধা হল যে এটি হয় নো-তেজ


(1) প্রদত্ত যে পুনর্বাসনের সময় অবশ্যই কোনও বিরোধ নেই

ব্যবহার

git amend-to <REV> # e.g.
git amend-to HEAD~1
git amend-to aaaa1111

নামটি amend-toযথাযথ IMHO বলে মনে হচ্ছে। প্রবাহের সাথে তুলনা করুন --amend:

git add . && git commit --amend --no-edit
# vs
git add . && git amend-to <REV>

ব্যাখ্যা

  • git config --global alias.<NAME> '!<COMMAND>'- একটি গ্লোবাল গিট ওরফে নাম তৈরি করে <NAME>যা নন-গিট কমান্ড কার্যকর করবে<COMMAND>
  • f() { <BODY> }; f - একটি "বেনামে" বাশ ফাংশন।
  • SHA=`git rev-parse "$1"`; - আর্গুমেন্টটিকে গিট রিভিশনে রূপান্তরিত করে এবং ফলাফলটি ভেরিয়েবলের জন্য বরাদ্দ করে SHA
  • git commit --fixup "$SHA"- জন্য ফিক্সআপ কমিট SHAদস্তাবেজগুলি দেখুনgit-commit
  • GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^"
    • git rebase --interactive "$SHA^" অংশ অন্যান্য উত্তর দ্বারা কভার করা হয়েছে।
    • --autosquashএর সাথে মিলিয়ে কী ব্যবহার করা হয় git commit --fixup, আরও তথ্যের জন্য git-rebaseডক্স দেখুন
    • GIT_SEQUENCE_EDITOR=trueপুরো জিনিসটি অ-ইন্টারেক্টিভ করে তোলে। এই হ্যাক আমি এই ব্লগ পোস্ট থেকে শিখেছি ।

1
যে কেউ amend-toহস্তক্ষেপহীন ফাইলগুলি তৈরি করতে পারে: git config --global alias.amend-to '!f() { SHA=গিট রেভ-পার্স "$ 1"; git stash -k && git commit --fixup "$SHA" && GIT_SEQUENCE_EDITOR=true git rebase --interactive --autosquash "$SHA^" && git stash pop; }; f'
দেথারিয়েল

2
এই পদ্ধতির সাথে একটি উদ্বেগ হ'ল এটি সম্পর্কযুক্ত ফিক্সআপগুলি প্রয়োগ করতে পারে।
সিরো সান্তিলি 冠状 病毒 审查 六四 事件

প্রশ্নটির বিন্দুটি কি প্রতিশ্রুতি বার্তা পরিবর্তন করার নয়? কারণ এই উত্তরটি সেটিকে সম্বোধন করে না, বা কমপক্ষে সরাসরি নয়।
wETten

@ উইটেন প্রশ্নটি প্রতিশ্রুতিবদ্ধ বার্তা পরিবর্তন করার বিষয়ে জিজ্ঞাসা করে না, এটি অঙ্গীকারটি সংশোধন করার বিষয়ে যা শিরোনাম নয়। সুতরাং আপনার প্রশ্নের উত্তর হবে "না, এটি প্রশ্নের মূল বিষয় নয়"
দেথারিয়েল

আমি বিভ্রান্ত, তাই আমরা কীভাবে প্রতিশ্রুতি বার্তা পরিবর্তন করব?
ggb667

8

অটোমেটেড ইন্টারেক্টিভ রিবেস সম্পাদনা এর পরে কমিট ওভারের জন্য প্রস্তুত প্রতিশ্রুতি দেয়

আমি নিজেকে প্রায়শই যথেষ্ট অতীতের প্রতিশ্রুতি ফিক্স করতে দেখি যে আমি এর জন্য একটি স্ক্রিপ্ট লিখেছি।

ওয়ার্কফ্লো এখানে:

  1. git commit-edit <commit-hash>
    

    এটি আপনাকে সম্পাদনা করতে চান এমন প্রতিশ্রুতিতে আপনাকে ফেলে দেবে।

  2. আপনার ইচ্ছা অনুযায়ী কমিটটি প্রথম স্থানে রেখে ফিক্স করুন এবং মঞ্চ করুন।

    (আপনি যে প্রতিশ্রুতি দিচ্ছেন না এমন git stash saveফাইলগুলি রাখতে আপনি ব্যবহার করতে পারেন )

  3. প্রতিশ্রুতি পুনরায় করুন --amend, উদাহরণস্বরূপ:

    git commit --amend
    
  4. রিবেসটি সম্পূর্ণ করুন:

    git rebase --continue
    

উপরের কাজ করার জন্য, নীচের স্ক্রিপ্টটি git-commit-editআপনার যে কোনও জায়গায় ডেকে একটি এক্সিকিউটেবল ফাইলে রাখুন $PATH:

#!/bin/bash

set -euo pipefail

script_name=${0##*/}

warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "$@"; exit 1; }

[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"

# Default to editing the parent of the most recent commit
# The most recent commit can be edited with `git commit --amend`
commit=$(git rev-parse --short "${1:-HEAD~}")
message=$(git log -1 --format='%h %s' "$commit")

if [[ $OSTYPE =~ ^darwin ]]; then
  sed_inplace=(sed -Ei "")
else
  sed_inplace=(sed -Ei)
fi

export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)"  # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty  #  Commit an empty commit so that that cache diffs are un-reversed

echo
echo "Editing commit: $message" >&2
echo

7

এই পদ্ধতির কাছে এসেছিলেন (এবং এটি সম্ভবত ইন্টারেক্টিভ রিবেস ব্যবহারের মতোই একই) তবে আমার জন্য এটি একধরনের সোজা।

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

বলুন আপনি প্রতিশ্রুতি পরিবর্তন করতে চান 0এবং আপনি বর্তমানে চালু আছেনfeature-branch

some-commit---0---1---2---(feature-branch)HEAD

এই প্রতিশ্রুতিতে চেকআউট করুন এবং একটি তৈরি করুন quick-branch। আপনি পুনরুদ্ধার পয়েন্ট হিসাবে (বৈশিষ্ট্য শুরুর আগে) হিসাবে আপনার বৈশিষ্ট্য শাখা ক্লোন করতে পারেন।

?(git checkout -b feature-branch-backup)
git checkout 0
git checkout -b quick-branch

আপনার এখন এই জাতীয় কিছু থাকবে:

0(quick-branch)HEAD---1---2---(feature-branch)

পর্যায় পরিবর্তন হয়, স্ট্যাশ সব কিছু।

git add ./example.txt
git stash

পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ এবং চেকআউটে ফিরে feature-branch

git commit --amend
git checkout feature-branch

আপনার এখন এই জাতীয় কিছু থাকবে:

some-commit---0---1---2---(feature-branch)HEAD
           \
             ---0'(quick-branch)

রি-বেসের ফলে feature-branchসম্মুখের quick-branch(পথ ধরে কোন দ্বন্দ্ব সমাধান)। স্ট্যাশ প্রয়োগ করুন এবং সরান quick-branch

git rebase quick-branch
git stash pop
git branch -D quick-branch

এবং আপনি এখানে দিয়ে শেষ:

some-commit---0'---1'---2'---HEAD(feature-branch)

গিটটি নকল করবে না (যদিও আমি সত্যিই বলতে পারি না কতটা পরিমাণে) রিবাইজ করার সময় 0 কমিট করে।

দ্রষ্টব্য: সমস্ত প্রতিশ্রুতিবদ্ধ হ্যাশগুলি মূলত পরিবর্তনের উদ্দেশ্যে আমরা যে প্রতিশ্রুতি দিয়েছিলাম তা থেকে শুরু হয়।


6

একটি ইন্টারঅ্যাক্টিভ কমান্ড পেতে, আপনার PATH এ এই লিখিত সামগ্রী সহ একটি স্ক্রিপ্ট রাখুন:

#!/bin/sh
#
# git-fixup
# Use staged changes to modify a specified commit
set -e
cmt=$(git rev-parse $1)
git commit --fixup="$cmt"
GIT_EDITOR=true git rebase -i --autosquash "$cmt~1"

আপনার পরিবর্তনগুলি (এর সাথে git add) মঞ্চ দ্বারা এটি ব্যবহার করুন এবং তারপরে চালান git fixup <commit-to-modify>। অবশ্যই যদি আপনি বিবাদ পান তবে এটি ইন্টারেক্টিভ হবে be


1
এটি ভাল কাজ করে। প্রতিশ্রুতিবদ্ধ সেটটি নিখুঁত করার জন্য কোনও নোংরা গাছের টুকরা মিক্স ফিক্সআপ করতে আমি কিছু অতিরিক্ত কার্যকারিতা যুক্ত করেছি। `নোংরামিট = $ (গিট ডিফ); যদি ["$ {নোংরামো}"! = ""]; তারপরে "স্ট্যাশিং নোংরা গাছ" প্রতিধ্বনি> & 2; গিট স্ট্যাশ; ফাই;
সাইমন বেল্টম্যান

6

git stash+ rebaseঅটোমেশন

জেরিট রিভিউগুলির জন্য যখন আমার কোনও পুরানো প্রতিশ্রুতি অনেকবার সংশোধন করা দরকার তখন আমি করছি:

git-amend-old() (
  # Stash, apply to past commit, and rebase the current branch on to of the result.
  current_branch="$(git rev-parse --abbrev-ref HEAD)"
  apply_to="$1"
  git stash
  git checkout "$apply_to"
  git stash apply
  git add -u
  git commit --amend --no-edit
  new_sha="$(git log --format="%H" -n 1)"
  git checkout "$current_branch"
  git rebase --onto "$new_sha" "$apply_to"
)

গিটহাব উজানের দিকে

ব্যবহার:

  • উত্স ফাইলটি পরিবর্তন করুন, git addরেপোতে ইতিমধ্যে থাকলে দরকার নেই
  • git-amend-old $old_sha

আমি এটি পছন্দ করি --autosquashকারণ এটি অন্যান্য সম্পর্কযুক্ত ফিক্সআপগুলিকে স্কোয়াশ করে না।


খুব সুন্দর কাজ, git amendবর্তমান স্ট্যাশ, খুব চালাক ব্যবহার করে নির্দিষ্ট প্রতিশ্রুতিতে পরিবর্তনগুলি প্রয়োগ করার জন্য এটি একটি ডিফল্ট বিকল্প হওয়া উচিত !
সাইওহামমুরা

5

আমি এটি সমাধান করেছি,

1) আমি চাই পরিবর্তনগুলি সাথে নতুন প্রতিশ্রুতি তৈরি করে ..

r8gs4r commit 0

2) আমি জানি যে এর সাথে আমার একত্রীকরণের জন্য কোন প্রতিশ্রুতিবদ্ধ। যা প্রতিশ্রুতিবদ্ধ 3।

সুতরাং, git rebase -i HEAD~4# 4 সাম্প্রতিক 4 প্রতিশ্রুতি উপস্থাপন করে (এখানে প্রতিশ্রুতিটি 4 র্থ স্থানে রয়েছে)

3) ইন্টারেক্টিভ রিবেস সাম্প্রতিক প্রতিশ্রুতি নীচে অবস্থিত হবে। এটি দেখতে একরকম হবে,

pick q6ade6 commit 3
pick vr43de commit 2
pick ac123d commit 1
pick r8gs4r commit 0

4) এখানে আপনি যদি নির্দিষ্টটির সাথে একত্রীকরণ করতে চান তবে আমাদের প্রতিশ্রুতি পুনরায় সাজানো দরকার। এটা মত হওয়া উচিত,

parent
|_child

pick q6ade6 commit 3
f r8gs4r commit 0
pick vr43de commit 2
pick ac123d commit 1

পুনঃবিন্যাসের পরে আপনাকে এর সাথে প্রতিস্থাপন p pickকরতে হবে f( ফিক্সআপ কমিট মেসেজ ছাড়াই মার্জ হবে) বা s( স্কোয়াশের একত্রীকরণ বার্তায় মার্জ রান চলাকালীন পরিবর্তিত হতে পারে)

এবং তারপরে আপনার গাছটি সংরক্ষণ করুন।

বিদ্যমান কমিটের সাথে এখন মার্জ করুন।

দ্রষ্টব্য: আপনি নিজের বজায় না রেখে এটি পছন্দনীয় পদ্ধতি নয়। আপনার যদি বড় দলের আকার থাকে তবে গিট ট্রি পুনর্লিখনের জন্য এটি একটি গ্রহণযোগ্য পদ্ধতি নয় এমন বিরোধগুলির মধ্যে শেষ হয়ে যাবে যা আপনি জানেন না other যদি আপনি কম কমিট দিয়ে আপনার গাছকে পরিষ্কার রাখতে চান তবে এটি চেষ্টা করতে পারেন এবং যদি এর ছোট দলটি অন্যথায় এটি পছন্দনীয় নয় .....


ইন্টারেক্টিভ রিবেসের সময় আপনি লাইভ-মডিফিকেশন না করতে চাইলে এটি একটি দুর্দান্ত সমাধান।
ডুনাটোটাটোস

4

"ইন্টারেক্টিভ রিবেস কমান্ড" ব্যবহার করা সবচেয়ে ভাল বিকল্প ।

git rebaseকমান্ড অবিশ্বাস্যভাবে শক্তিশালী। এটি আপনাকে প্রতিশ্রুতিবদ্ধ বার্তাগুলি সম্পাদনা করতে , কমিটগুলি একত্রিত করতে , সেগুলি পুনরায় অর্ডার করতে দেয় ... ইত্যাদি।

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

backupরিবেসিংয়ের আগে একটি শাখা তৈরি করার পরামর্শ দেওয়া হয় যাতে যখনই আপনি নিয়ন্ত্রণের বাইরে জিনিসগুলি খুঁজে পান আপনি আগের অবস্থায় ফিরে যেতে পারেন।

এখন এই কমান্ড কিভাবে ব্যবহার করবেন?

git rebase -i <base> 

-i"ইন্টারেক্টিভ" জন্য দাঁড়ানো । নোট করুন যে আপনি অ-ইন্টারেক্টিভ মোডে একটি রিবেস সম্পাদন করতে পারেন। উদা:

#interactivly rebase the n commits from the current position, n is a given number(2,3 ...etc)
git rebase -i HEAD~n 

HEADআপনার বর্তমান অবস্থান নির্দেশ করে (এছাড়াও শাখার নাম বা SHA প্রতিশ্রুতিবদ্ধ হতে পারে)। ~nমানে হলো "এন beforeé, তাই HEAD~nএন" এক আপনার উপর বর্তমানে সামনে করে একটি তালিকা হবে "।

git rebase এর মতো আলাদা কমান্ড রয়েছে:

  • pবা pickপ্রতিশ্রুতি আছে যেমন রাখা।
  • rবা reword: প্রতিশ্রুতিবদ্ধ সামগ্রী রাখতে কিন্তু প্রতিশ্রুতি বার্তা পরিবর্তন।
  • sবা squash: এই প্রতিশ্রুতিবদ্ধকরণের পরিবর্তনগুলি পূর্বের প্রতিশ্রুতি (তালিকার উপরে এটির উপরে অঙ্গীকার) এর সাথে একত্রিত করতে।
  • ... ইত্যাদি

    দ্রষ্টব্য: জিনিসগুলি সহজ করার জন্য গিটকে আপনার কোড সম্পাদকের সাথে কাজ করা আরও ভাল। উদাহরণস্বরূপ যদি আপনি ভিজ্যুয়াল কোড ব্যবহার করেন তবে আপনি এটির মতো যুক্ত করতে পারেন git config --global core.editor "code --wait"। অথবা আপনি কীভাবে আপনার কোড সম্পাদককে জিআইটির সাথে অগ্রাধিকার দেবেন তা গুগলে অনুসন্ধান করতে পারেন।

উদাহরণ git rebase

আমি সর্বশেষ 2 টি প্রতিশ্রুতিগুলি পরিবর্তন করতে চেয়েছিলাম তাই আমি এই জাতীয় প্রক্রিয়াটি করেছি:

  1. বর্তমান কমিটগুলি প্রদর্শন করুন:
    #This to show all the commits on one line
    $git log --oneline
    4f3d0c8 (HEAD -> documentation) docs: Add project description and included files"
    4d95e08 docs: Add created date and project title"
    eaf7978 (origin/master , origin/HEAD, master) Inital commit
    46a5819 Create README.md
    
  2. এখন আমি git rebaseসর্বশেষ 2 টি কমিট বার্তা পরিবর্তন করতে ব্যবহার করি : $git rebase -i HEAD~2 এটি কোড সম্পাদক খোলে এবং এটি দেখায়:

    pick 4d95e08 docs: Add created date and project title
    pick 4f3d0c8 docs: Add project description and included files
    
    # Rebase eaf7978..4f3d0c8 onto eaf7978 (2 commands)
    #
    # Commands:
    # p, pick <commit> = use commit
    # r, reword <commit> = use commit, but edit the commit message
    ...
    

    যেহেতু আমি এই 2 টি কমিটের জন্য প্রতিশ্রুতি বার্তাটি পরিবর্তন করতে চাই। সুতরাং আমি টাইপ করব rবা rewordজায়গায় pick। তারপরে ফাইলটি সেভ করুন এবং ট্যাবটি বন্ধ করুন। নোটটি যে rebaseএকটি বহু-পদক্ষেপ প্রক্রিয়াতে কার্যকর করা হয়েছে তাই পরবর্তী পদক্ষেপটি বার্তাগুলি আপডেট করা। আরও মনে রাখবেন যে কমিটগুলি বিপরীত কালানুক্রমিক ক্রমে প্রদর্শিত হয় যাতে শেষ প্রতিশ্রুতি সেই একটিতে প্রদর্শিত হয় এবং প্রথম লাইনটিতে প্রথম প্রতিশ্রুতি প্রদর্শিত হয় এবং ততক্ষণে।

  3. বার্তাগুলি আপডেট করুন: প্রথম বার্তাটি আপডেট করুন:

    docs: Add created date and project title to the documentation "README.md"
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    ...
    

    দ্বিতীয় বার্তাটি সম্পাদনা এবং সংরক্ষণ করুন

    docs: Add project description and included files to the documentation "README.md"
    
    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    ...
    

    সংরক্ষণ করেন এবং বন্ধ করেন.

  4. রিবেস শেষে আপনি এই জাতীয় বার্তা পাবেন: Successfully rebased and updated refs/heads/documentationযার অর্থ আপনি সফল হয়েছেন । আপনি পরিবর্তনগুলি প্রদর্শন করতে পারেন:

    5dff827 (HEAD -> documentation) docs: Add project description and included files to the documentation "README.md"
    4585c68 docs: Add created date and project title to the documentation "README.md"
    eaf7978 (origin/master, origin/HEAD, master) Inital commit
    46a5819 Create README.md
    

    আমি আশা করি এটি নতুন ব্যবহারকারীদের সহায়তা করতে পারে :)।


2

আমার জন্য এটি কোনও রেপো থেকে কিছু শংসাপত্র সরিয়ে দেওয়ার জন্য ছিল। আমি রিবেসিংয়ের চেষ্টা করেছি এবং --continue রিবেস করার চেষ্টা করার পথে এক টন আপাতদৃষ্টির সাথে সম্পর্কযুক্ত দ্বন্দ্বের মধ্যে দৌড়েছি। নিজেকে পুনর্বাসনের চেষ্টা করতে বিরক্ত করবেন না, ম্যাকের উপরে BFG (ব্রিউ ইনস্টল বিএফজি) নামক সরঞ্জামটি ব্যবহার করুন।


0

যদি আপনি ইতিমধ্যে কমিটগুলিকে ঠেলে না ফেলে থাকেন তবে আপনি ব্যবহার করে আগের প্রতিশ্রুতিতে ফিরে যেতে পারেন git reset HEAD^[1,2,3,4...]

উদাহরণ স্বরূপ

git commit <file1> -m "Updated files 1 and 2"
git commit <file3> -m "Updated file 3"

ওফস, প্রথম প্রতিশ্রুতিতে ফাইল 2 যুক্ত করতে ভুলে গেছি ...

git reset HEAD^1 // because I only need to go back 1 commit

git add <file2>

এটি প্রথম প্রতিশ্রুতিতে ফাইল 2 যুক্ত করবে।


0

ঠিক আছে, এই সমাধানটি খুব নির্বোধ শোনাচ্ছে তবে কিছু পরিস্থিতিতে আপনাকে বাঁচাতে পারে।

আমার এক বন্ধু দুর্ঘটনাক্রমে খুব কিছু বিশাল ফাইল (চারটি স্বতঃ-উত্পাদিত ফাইল প্রতি 3 জিবি থেকে 5 গিগাবাইটের মধ্যে) প্রতিশ্রুতিবদ্ধ হয়ে দৌড়েছে এবং তারপরে git pushআর কোনও কাজ করছে না এমন সমস্যাটি উপলব্ধি করার আগে তার উপরে কিছু অতিরিক্ত কোড কমিট করেছে !

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

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

সুতরাং, আমি যে সমাধানটি নিয়ে এসেছি তা হ'ল:

  1. বর্তমান গিট ফোল্ডারটির নাম পরিবর্তন করুন ~/Project-old
  2. গিথুব (থেকে ~/Project) থেকে আবার গিট ফোল্ডারটি ক্লোন করুন ।
  3. একই শাখায় চেকআউট করুন।
  4. ফোল্ডার cp -rথেকে ম্যানুয়ালি ফাইলগুলি । ~/Project-old~/Project
  5. নিশ্চিত হয়ে নিন যে প্রচুর ফাইলগুলি mvএড করার দরকার নেই এবং এগুলি .gitignoreসঠিকভাবে অন্তর্ভুক্ত করা হয়েছে ।
  6. এছাড়াও নিশ্চিত হয়ে নিন যে আপনি .gitসম্প্রতি ক্লোন করা ফোল্ডারে ওভাররাইট না করেছেন~/Project দ্বারা করা । সমস্যাযুক্ত ইতিহাসের লগগুলি এখানেই বাস করে!
  7. এখন পরিবর্তনগুলি পর্যালোচনা করুন। সমস্যাযুক্ত ফাইলগুলি বাদ দিয়ে এটি সাম্প্রতিক সমস্ত কমেটের ইউনিয়ন হওয়া উচিত।
  8. পরিশেষে পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করুন, এবং এটি push'এড হওয়া ভাল ।

এই সমাধানটির বৃহত্তম সমস্যাটি হ'ল এটি কয়েকটি ফাইল ম্যানুয়াল অনুলিপি করার সাথে সম্পর্কিত হয় এবং এটি সাম্প্রতিক সমস্ত কমিটকে এক করে দেয় (স্পষ্টতই একটি নতুন কমিট-হ্যাশ দিয়ে with) বি

বড় সুবিধাগুলি হ'ল, এটি প্রতিটি পদক্ষেপে খুব স্পষ্ট, এটি বিশাল ফাইলগুলির জন্য দুর্দান্ত কাজ করে (পাশাপাশি সংবেদনশীল) , এবং এটি ইতিহাসের কোনও চিহ্ন রাখে না!

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