গিট-এ রুট কমিট করার আগে একটি কমিট Inোকান?


231

আমি আগে জিজ্ঞাসা করেছি কীভাবে প্রথম দুটি গিটার সংগ্রহস্থলে কমিট করতে হয়।

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

সুতরাং, আমি বরং একবারই ব্যথার মধ্য দিয়ে যাব এবং তারপরে চিরতরে স্ট্যান্ডার্ড ইন্টারেক্টিভ রিবেসটি ব্যবহার করতে সক্ষম হব।

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

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


3
;) আমার ধারণা এটি যাইহোক একটি উত্তর ওয়ারেন্ট দেয়। আমি ইতিহাসকে নিবিড়ভাবে সম্পাদনা করে উন্মাদ হয়ে যেতে পারে এমন বিভিন্ন উপায়ে অনুসন্ধান করার পদ্ধতি আমি করছি। ভাবিবেন না, ভাগ করা ভাণ্ডার নয়।
kch

11
এক উন্মত্ত, উন্মাদ ইতিহাস সম্পাদক থেকে অন্য একজন, প্রশ্ন পোস্ট করার জন্য ধন্যবাদ! ; ডি
মার্কো

10
@ কেচির প্রতিরক্ষাতে, একটি পুরোপুরি বৈধ কারণ হ'ল আমি নিজেকে খুঁজে পাচ্ছি: historicalতিহাসিক সংস্করণের একটি স্ন্যাপশট যুক্ত করা যা রেপোতে কখনই ধরা পড়ে নি।
ওল্ড ম্যাকস্টোফার

4
আমার আর একটি বৈধ কারণ আছে! প্রথম প্রতিশ্রুতি পুনর্বাসনের জন্য সক্ষম হওয়ার জন্য প্রথমটির আগে একটি খালি প্রতিশ্রুতি যুক্ত করা এবং বাইনারি ব্লাট সরিয়ে ফেলতে কোনও সংগ্রহস্থলের প্রাথমিক প্রতিশ্রুতিতে যুক্ত করা: (
পোস্টপিপি

উত্তর:


314

এটি অর্জনের জন্য দুটি পদক্ষেপ রয়েছে:

  1. একটি নতুন ফাঁকা কমিট তৈরি করুন
  2. এই খালি প্রতিশ্রুতি থেকে শুরু করার জন্য ইতিহাস পুনরায় লেখুন

আমরা newrootসুবিধার জন্য নতুন খালি প্রতিশ্রুতি অস্থায়ী শাখায় রেখে দেব ।

1. একটি নতুন ফাঁকা কমিট তৈরি করুন

আপনি এটি করতে পারেন এমন অনেকগুলি উপায় রয়েছে।

শুধু নদীর গভীরতানির্ণয় ব্যবহার

সবচেয়ে পরিষ্কার পদ্ধতিটি হ'ল গিটের নদীর গভীরতানির্ণয়টি কেবলমাত্র একটি প্রতিশ্রুতি তৈরি করতে ব্যবহার করা হয়, যা কার্যকরী অনুলিপি বা সূচককে স্পর্শ করা এড়ায় বা কোন শাখাটি পরীক্ষা করে আনা হয়, ইত্যাদি etc.

  1. খালি ডিরেক্টরিতে একটি ট্রি অবজেক্ট তৈরি করুন:

    tree=`git hash-object -wt tree --stdin < /dev/null`
    
  2. এর চারপাশে একটি প্রতিশ্রুতি জড়ান:

    commit=`git commit-tree -m 'root commit' $tree`
    
  3. এটিতে একটি রেফারেন্স তৈরি করুন:

    git branch newroot $commit
    

আপনি যদি নিজের শেলটি যথেষ্ট পরিমাণে জানেন তবে আপনি অবশ্যই পুরো পদ্ধতিটিকে ওয়ান-লাইনারে পুনর্বিন্যস্ত করতে পারেন।

নদীর গভীরতানির্ণয় ছাড়া

নিয়মিত চীনামাটির কমান্ডের সাহায্যে, আপনি newrootকোনও উপযুক্ত কারণ ছাড়াই, শাখাটি পরীক্ষা করে এবং সূচকটি আপডেট না করে এবং বার বার অনুলিপি কার্য সম্পাদন করে খালি প্রতিশ্রুতি তৈরি করতে পারবেন না । তবে কারও কারও পক্ষে এটি বোঝা সহজ হতে পারে:

git checkout --orphan newroot
git rm -rf .
git clean -fd
git commit --allow-empty -m 'root commit'

নোট করুন যে গিটের খুব পুরানো সংস্করণগুলিতে যেটিতে --orphanস্যুইচ নেই checkout, আপনাকে প্রথম লাইনের সাথে এটি পরিবর্তন করতে হবে:

git symbolic-ref HEAD refs/heads/newroot

এই খালি প্রতিশ্রুতি থেকে শুরু করতে ইতিহাসের পুনর্লিখন করুন

আপনার কাছে এখানে দুটি বিকল্প রয়েছে: রিবেসিং, বা একটি পরিষ্কার ইতিহাস পুনর্লিখন।

Rebasing

git rebase --onto newroot --root master

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

এছাড়াও, কিছু প্রান্তের মামলার ইতিহাস সহ, মার্জ কোন্দলের কারণে এটি ব্যর্থও হতে পারে - আপনি এমন কোনও প্রতিশ্রুতি দিচ্ছেন যাতে কিছুই নেই।

ইতিহাস পুনর্লিখন

ক্লিনার পদ্ধতির শাখাটি পুনরায় লেখার জন্য। এর বিপরীতে git rebase, আপনাকে দেখতে হবে আপনার শাখাটি কখন থেকে শুরু করে প্রতিশ্রুতিবদ্ধ:

git replace <currentroot> --graft newroot
git filter-branch master

পুনর্লিখন দ্বিতীয় ধাপে ঘটে, স্পষ্টতই; এটি প্রথম পদক্ষেপ যার ব্যাখ্যা প্রয়োজন। git replaceএটি গিতকে কী বলে যে এটি যখনই আপনার প্রতিস্থাপন করতে চাইছে এমন কোনও সামগ্রীর রেফারেন্স দেখে, গিটের পরিবর্তে সেই বস্তুর প্রতিস্থাপনের দিকে নজর দেওয়া উচিত।

--graftস্যুইচ দিয়ে আপনি এটিকে স্বাভাবিকের চেয়ে কিছুটা আলাদা বলছেন। আপনি বলছেন এখনো একটি প্রতিস্থাপন বস্তুর হবে না, কিন্তু আপনি প্রতিস্থাপন করতে চান <currentroot>নিজেই একটি সঠিক অনুলিপি সঙ্গে বস্তুর কমিট ব্যতীত পিতা বা মাতা কমিট (গুলি) প্রতিস্থাপন এক (গুলি) আপনার যে তালিকাভুক্ত হওয়া উচিত (অর্থাত newrootকমিট )। তারপরে git replaceএগিয়ে যায় এবং আপনার জন্য এই প্রতিশ্রুতি তৈরি করে এবং তারপরে সেই প্রতিশ্রুতিটিকে আপনার মূল প্রতিশ্রুতির প্রতিস্থাপন হিসাবে ঘোষণা করে।

এখন আপনি যদি এটি করেন git log, আপনি দেখতে পাবেন যে জিনিসগুলি ইতিমধ্যে আপনি যেমন দেখতে চান তেমন দেখাচ্ছে: শাখাটি শুরু হয় newroot

তবে নোট করুন যা git replace আসলে ইতিহাস পরিবর্তন করে না - এটি আপনার সংগ্রহশালার বাইরেও প্রচার করে না। এটি কেবলমাত্র আপনার রিপোজিটরিতে এক থেকে অন্য বস্তুতে স্থানীয় পুনর্নির্দেশকে যুক্ত করে। এর অর্থ হ'ল এই প্রতিস্থাপনের প্রভাব আর কেউ দেখেনি - কেবল আপনি।

এজন্য filter-branchপদক্ষেপটি প্রয়োজনীয়। সঙ্গে git replaceআপনি রুট জন্য স্থায়ী পিতা বা মাতা করে দিয়ে একটি সঠিক অনুলিপি তৈরি কমিট; git filter-branchতারপরে নিম্নলিখিত সমস্ত প্রতিশ্রুতিগুলির জন্যও এই প্রক্রিয়াটি পুনরাবৃত্তি করে। এইখানেই ইতিহাসটি পুনরায় লিখিত হয় যাতে আপনি এটি ভাগ করে নিতে পারেন।


1
এই --onto newrootবিকল্পটি নিরর্থক; আপনি এটা ছাড়া কি করতে পারবেন না কারণ যুক্তি আপনি এটা পাস, newroot, মূল প্রজেক্টের যুক্তি হিসাবে একই - newroot
উইলহেমটেল

7
প্লাম্বিং কমান্ড পরিবর্তে চীনামাটির বাসন ব্যবহার করবেন না কেন ?. আমি গিট সিম্বলিক-রেফ হেড রেফ / হেডস / নিউরোটকে গিট চেকআউট -অরফান নিউরোট
আলবফান

4
@ নেনোপেরা: কারণ এই উত্তরটি আগে লেখা git-checkoutহয়েছিল সেই সুইচটি ছিল। আমি প্রথমে এ পদ্ধতির উল্লেখ করার জন্য এটি আপডেট করেছি, পয়েন্টারের জন্য ধন্যবাদ।
অ্যারিস্টটল পাগাল্টজিস

1
যদি আপনার নিউরোট খালি না থাকে তবে git rebase --merge -s recursive -X theirs --onto newroot --root masterসমস্ত বিবাদগুলি স্বয়ংক্রিয়ভাবে সমাধান করতে ব্যবহার করুন ( এই উত্তরটি দেখুন)। @ আলেকজান্ডারকুজিন
ব্যবহারকারী

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

30

অ্যারিস্টটল পাগাল্টজিস এবং উউ ক্লিন-কনিগের উত্তর এবং রিচার্ড ব্রোনোস্কির মন্তব্যটি মার্জ করুন।

git symbolic-ref HEAD refs/heads/newroot
git rm --cached -r .
git clean -f -d
# touch .gitignore && git add .gitignore # if necessary
git commit --allow-empty -m 'initial'
git rebase --onto newroot --root master
git branch -d newroot

(কেবল সবকিছুই এক জায়গায় রাখার জন্য)


এটি দুর্দান্ত। অভ্যন্তরীণভাবে গিট রিবেস -i - রুট যা করতে পারে তা যদি এটিই হতে পারে তবে ভাল লাগবে।
8d12

হ্যাঁ, আমি তা জানতে পেরে অবাক হয়েছি।
অ্যান্টনি হ্যাচকিন্স

git rebase newroot masterত্রুটির কারণে আমাকে রিবেস কমান্ডটি পরিবর্তন করতে হয়েছিল ।
মার্বেল 82

@ এন্টনি-হ্যাচকিন্স এর জন্য ধন্যবাদ। আমার একটি বিদ্যমান গিট রেপো আছে এবং (বিভিন্ন কারণে যা আমি এখানে যেতে চাই না) আমি আমার প্রথম প্রতিশ্রুতি হিসাবে নন-ইমপিটিওয়ান গিট কমিট যুক্ত করার চেষ্টা করছি। সুতরাং আমি গিট কমিট - গিলে-ফাঁকা-এম 'প্রাথমিক' গিট অ্যাডের সাথে প্রতিস্থাপন করেছি ;; গিট কমিট-এম "প্রাথমিক লারাভেল কমিট"; গিট ধাক্কা; এবং তারপরে এই পুনর্বাসনের পদক্ষেপ: গিট রিবেস - নতুন নিউরুট --রূট মাস্টার একত্রিত হওয়া সংঘাতগুলির একটি টন দিয়ে ব্যর্থ হচ্ছে। কোন পরামর্শ? : ((
কেপি 123

@ কেপি 123 একটি খালি প্রতিশ্রুতি দেওয়ার চেষ্টা করুন :)
অ্যান্টনি হ্যাচকিন্স

12

আমি এরিস্টটলের উত্তর পছন্দ করি। তবে দেখা গেছে যে কোনও বৃহত ভাণ্ডার (> 5000 কমিট) ফিল্টার-ব্রাঞ্চ বিভিন্ন কারণে রিবেসের চেয়ে আরও ভাল কাজ করে 1) এটি আরও দ্রুত 2) যখন একত্রীকরণের বিরোধ আছে তখন এর জন্য মানুষের হস্তক্ষেপের প্রয়োজন হয় না। 3) এটি ট্যাগগুলি পুনরায় লিখতে পারে - সেগুলি সংরক্ষণ করে। নোট করুন যে ফিল্টার-শাখা কাজ করে কারণ প্রতিটি প্রতিশ্রুতিবদ্ধতার বিষয়বস্তু সম্পর্কে কোনও প্রশ্ন নেই - এটি 'রিবেস' এর আগের মতোই।

আমার পদক্ষেপগুলি হ'ল:

# first you need a new empty branch; let's call it `newroot`
git symbolic-ref HEAD refs/heads/newroot
git rm --cached -r .
git clean -f -d

# then you apply the same steps
git commit --allow-empty -m 'root commit'

# then use filter-branch to rebase everything on newroot
git filter-branch --parent-filter 'sed "s/^\$/-p <sha of newroot>/"' --tag-name-filter cat master

মনে রাখবেন যে '--tag-name-ફિલ્ટર বিড়াল' বিকল্পগুলির অর্থ ট্যাগগুলি নতুন তৈরি করা কমিটগুলিকে নির্দেশ করতে পুনরায় লেখা হবে।


এটি খালি কমিট তৈরি করতে সহায়তা করে না এটি একটি আকর্ষণীয় ব্যবহারের ক্ষেত্রেও।
ceztko

অন্যান্য সমাধানগুলির সাথে তুলনা করে, আপনার কেবলমাত্র একটি তাত্পর্যপূর্ণ পার্শ্ব-প্রতিক্রিয়া রয়েছে: এটি হ্যাশগুলি পরিবর্তন করে, তবে পুরো ইতিহাসটি অদৃশ্য থাকে। ধন্যবাদ!
ভ্লাদিস্লাভ সাভচেঙ্কো

5

আমি অ্যারিস্টটল এবং কেন্টের উত্তরটির টুকরো সফলভাবে ব্যবহার করেছি:

# first you need a new empty branch; let's call it `newroot`
git checkout --orphan newroot
git rm -rf .
git commit --allow-empty -m 'root commit'
git filter-branch --parent-filter \
'sed "s/^\$/-p <sha of newroot>/"' --tag-name-filter cat -- --all
# clean up
git checkout master
git branch -D newroot
# make sure your branches are OK first before this...
git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d

এটি masterট্যাগ ছাড়াও সমস্ত শাখা (কেবল নয় ) পুনর্লিখন করবে ।


এই শেষ লাইনটি কি করে?
ডিয়েডেরিক সি। নীহর্স্টার

এটি refs/original/প্রতিটি রেফ অনুসন্ধান করে এবং মুছে দেয়। এটি মুছে ফেলা রেফগুলি ইতিমধ্যে অন্য কোনও শাখা দ্বারা রেফারেন্স করা উচিত, যাতে তারা সত্যিকার অর্থে চলে না, কেবল refs/original/সরিয়ে ফেলা হয়।
ldav1s

এটি আমার পক্ষে কাজ করেছে। অতিরিক্ত হিসাবে আমি একটি পুরানো টাইমস্ট্যাম্প timedatectl set-time '2017-01-01 00:00:00'দিতে ব্যবহৃত newroot
chrm

4

git rebase --root --onto $emptyrootcommit

কৌশলটি সহজেই করা উচিত


3
$emptyrootcommitএকটি শেল পরিবর্তনশীল যা কিছুই প্রসারিত হয় না, অবশ্যই?
ফ্লিম 11

@ ফ্লিম: $ শূন্যস্থান কমিট হ'ল মূল পোস্টারটি ইতিমধ্যে মনে হয়েছে এমন একটি শূন্য প্রতিশ্রুতির শ্যা 1।
উয়ে ক্লেইন-কনিগ

4

আমি মনে করি যে ব্যবহার git replaceএবং git filter-branchএকটি ব্যবহার তুলনায় ভাল সমাধান পাওয়া যাবে git rebase:

  • ভাল কর্মক্ষমতা
  • সহজ এবং কম ঝুঁকিপূর্ণ (আপনি প্রতিটি পদক্ষেপে আপনার ফলাফল যাচাই করতে পারেন এবং আপনি যা করেছেন তা পূর্বাবস্থায় ফিরিয়ে আনতে পারে ...)
  • গ্যারান্টিযুক্ত ফলাফল সহ একাধিক শাখার সাথে ভাল কাজ করুন

এর পিছনে ধারণাটি হ'ল:

  • অতীতে অতীতে একটি নতুন খালি প্রতিশ্রুতি তৈরি করুন
  • পুরানো মূল প্রতিশ্রুতিটি ঠিক একই অনুরূপ দ্বারা প্রতিস্থাপন করুন পিতা-মাতার হিসাবে নতুন রুট প্রতিশ্রুতি যুক্ত করা ছাড়া
  • যা যা প্রত্যাশিত এবং চালিত হয়েছে তা যাচাই করুন git filter-branch
  • আবার, যাচাই করুন যে সব ঠিক আছে এবং প্রয়োজনীয় গিট ফাইলগুলি পরিষ্কার করুন

এখানে প্রথম 2 টি পদক্ষেপের জন্য একটি স্ক্রিপ্ট রয়েছে:

#!/bin/bash
root_commit_sha=$(git rev-list --max-parents=0 HEAD)
git checkout --force --orphan new-root
find . -path ./.git -prune -o -exec rm -rf {} \; 2> /dev/null
git add -A
GIT_COMMITTER_DATE="2000-01-01T12:00:00" git commit --date==2000-01-01T12:00:00 --allow-empty -m "empty root commit"
new_root_commit_sha=$(git rev-parse HEAD)

echo "The commit '$new_root_commit_sha' will be added before existing root commit '$root_commit_sha'..."

parent="parent $new_root_commit_sha"
replacement_commit=$(
 git cat-file commit $root_commit_sha | sed "s/author/$parent\nauthor/" |
 git hash-object -t commit -w --stdin
) || return 3
git replace "$root_commit_sha" "$replacement_commit"

আপনি ঝুঁকি ছাড়াই এই স্ক্রিপ্টটি চালাতে পারেন (এমন কোনও ক্রিয়া করার আগে ব্যাকআপ করা আগে কখনও করা ভাল ধারণা নয়)) এবং ফলাফলটি যদি প্রত্যাশিত না হয় তবে কেবল ফোল্ডারে তৈরি ফাইলগুলি মুছুন .git/refs/replaceএবং আবার চেষ্টা করুন; )

একবার আপনি যাচাই করেছেন যে সংগ্রহস্থলের অবস্থা আপনার প্রত্যাশাটি কী, সমস্ত শাখার ইতিহাস আপডেট করার জন্য নিম্নলিখিত কমান্ডটি চালান :

git filter-branch -- --all

এখন, আপনাকে অবশ্যই দুটি ইতিহাস দেখতে হবে, পুরাতনটি এবং একটি নতুন ( filter-branchআরও তথ্যের জন্য সহায়তা দেখুন)। আপনি 2 টি তুলনা করতে পারেন এবং সব ঠিক আছে কিনা তা আবার পরীক্ষা করতে পারেন। আপনি যদি সন্তুষ্ট হন তবে আর প্রয়োজনীয় ফাইলগুলি মুছুন:

rm -rf ./.git/refs/original
rm -rf ./.git/refs/replace

আপনি আপনার masterশাখায় ফিরে আসতে পারেন এবং অস্থায়ী শাখা মুছতে পারেন :

git checkout master
git branch -D new-root

এখন, সব করা উচিত;)


3

আমি উত্তেজিত হয়েছি এবং এই দুর্দান্ত স্ক্রিপ্টটির একটি 'আদর্শবান' সংস্করণ লিখেছি ... এটি সর্বদা একই খালি প্রতিশ্রুতি সন্নিবেশ করবে এবং আপনি যদি এটি দুটিবার চালনা করেন তবে প্রতিবার এটি আপনার প্রতিশ্রুতিবদ্ধ হ্যাশগুলি পরিবর্তন করে না। সুতরাং, এখানে আমার গিট-সন্নিবেশ-খালি-মূলটি নেওয়া :

#!/bin/sh -ev
# idempotence achieved!
tmp_branch=__tmp_empty_root
git symbolic-ref HEAD refs/heads/$tmp_branch
git rm --cached -r . || true
git clean -f -d
touch -d '1970-01-01 UTC' .
GIT_COMMITTER_DATE='1970-01-01T00:00:00 +0000' git commit \
  --date='1970-01-01T00:00:00 +0000' --allow-empty -m 'initial'
git rebase --committer-date-is-author-date --onto $tmp_branch --root master
git branch -d $tmp_branch

এটি অতিরিক্ত জটিলতা মূল্য? সম্ভবত না, তবে আমি এটি ব্যবহার করব।

এটি রেপোর বেশ কয়েকটি ক্লোন অনুলিপিগুলিতে এই ক্রিয়াকলাপটি সম্পাদন করার অনুমতি দেয় এবং একই ফলাফলগুলি সমাপ্ত করে, সুতরাং তারা এখনও সামঞ্জস্যপূর্ণ ... টেস্টিং ... হ্যাঁ এটি করে, কাজ করে তবে আপনার মুছতে এবং যুক্ত করতে হবে রিমোটগুলি আবার যেমন:

git remote rm origin
git remote add --track master user@host:path/to/repo

3

একটি সংগ্রহস্থলের শুরুতে একটি খালি প্রতিশ্রুতি যুক্ত করতে, আপনি যদি "git init" এর সাথে সাথে খালি কমিট তৈরি করতে ভুলে যান:

git rebase --root --onto $(git commit-tree -m 'Initial commit (empty)' 4b825dc642cb6eb9a060e54bf8d69288fbee4904)

1
: 4b825dc ... খালি গাছের হ্যাশ হয় stackoverflow.com/questions/9765453/...
mrks

2

আচ্ছা, আমি এখানে যা এলাম:

# Just setting variables on top for clarity.
# Set this to the path to your original repository.
ORIGINAL_REPO=/path/to/original/repository

# Create a new repository…
mkdir fun
cd fun
git init
# …and add an initial empty commit to it
git commit --allow-empty -m "The first evil."

# Add the original repository as a remote
git remote add previous $ORIGINAL_REPO
git fetch previous

# Get the hash for the first commit in the original repository
FIRST=`git log previous/master --pretty=format:%H  --reverse | head -1`
# Cherry-pick it
git cherry-pick $FIRST
# Then rebase the remainder of the original branch on top of the newly 
# cherry-picked, previously first commit, which is happily the second 
# on this branch, right after the empty one.
git rebase --onto master master previous/master

# rebase --onto leaves your head detached, I don't really know why)
# So now you overwrite your master branch with the newly rebased tree.
# You're now kinda done.
git branch -f master
git checkout master
# But do clean up: remove the remote, you don't need it anymore
git remote rm previous

2

উন্নতির সাথে কেন্টের উত্তরের bashউপর ভিত্তি করে আমার স্ক্রিপ্ট এখানে রয়েছে :

  • এটি মূল শাখাটি পরীক্ষা করে, কেবল masterতখনই করা হয় না;
  • আমি অস্থায়ী শাখা এড়াতে চেষ্টা করেছি, তবে git checkout --orphanকেবল একটি শাখার সাথে কাজ করি, বিচ্ছিন্ন-মাথা অবস্থিত নয়, সুতরাং এটি নতুন মূল প্রতিশ্রুতিবদ্ধকরণের জন্য যথেষ্ট দীর্ঘ সময় যাচাই করা হয়েছে এবং তারপরে মুছে ফেলা হয়েছে;
  • এটি চলাকালীন নতুন রুট কমিটের হ্যাশ ব্যবহার করে filter-branch(ক্যান্ট ম্যানুয়াল প্রতিস্থাপনের জন্য কোনও স্থানধারককে সেখানে রেখে গেছে);
  • filter-branchঅপারেশন শুধুমাত্র স্থানীয় শাখা নতুন করে লেখা হয়, খুব না remotes
  • লেখক এবং প্রতিশ্রুতিবদ্ধ মেটাডেটা মানক করা হয়েছে যাতে মূল প্রতিশ্রুতি সংগ্রহস্থলগুলিতে অভিন্ন হয়।

#!/bin/bash

# Save the current branch so we can check it out again later
INITIAL_BRANCH=`git symbolic-ref --short HEAD`
TEMP_BRANCH='newroot'

# Create a new temporary branch at a new root, and remove everything from the tree
git checkout --orphan "$TEMP_BRANCH"
git rm -rf .

# Commit this empty state with generic metadata that will not change - this should result in the same commit hash every time
export GIT_AUTHOR_NAME='nobody'
export GIT_AUTHOR_EMAIL='nobody@example.org'
export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000'
export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
git commit --allow-empty -m 'empty root'
NEWROOT=`git rev-parse HEAD`

# Check out the commit we just made and delete the temporary branch
git checkout --detach "$NEWROOT"
git branch -D "$TEMP_BRANCH"

# Rewrite all the local branches to insert the new root commit, delete the 
# original/* branches left behind, and check out the rewritten initial branch
git filter-branch --parent-filter "sed \"s/^\$/-p $NEWROOT/\"" --tag-name-filter cat -- --branches
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git checkout "$INITIAL_BRANCH"

2

রুট কমিট স্যুইচ করতে:

প্রথম, প্রথম হিসাবে আপনি যে প্রতিশ্রুতিবদ্ধ তা তৈরি করুন।

দ্বিতীয়ত: ব্যবহার করে কমিটের ক্রমটি পরিবর্তন করুন:

গিট রিবেস -i - রুট

মূল সম্পাদন না করা অবধি কমিটিকে নিয়ে কোনও সম্পাদক উপস্থিত হবে, যেমন:

1234 পুরানো মূল বার্তাটি চয়ন করুন

মাঝখানে একটি প্রতিশ্রুতি চয়ন করুন

5678 টি কমিট করুন যা আপনি মূলে রাখতে চান

তারপরে আপনি প্রথমে চান প্রতিশ্রুতিটি প্রথম লাইনে রেখে can উদাহরণে:

5678 টি কমিট করুন যা আপনি মূলে রাখতে চান

1234 পুরানো মূল বার্তাটি চয়ন করুন

মাঝখানে একটি প্রতিশ্রুতি চয়ন করুন

সম্পাদক থেকে প্রস্থান করুন কমিটের আদেশ বদলে যাবে।

PS: সম্পাদক গিট ব্যবহার পরিবর্তন করতে, চালান:

Git কনফিগ --global core.editor name_of_the_editor_program_you_want_to_use


1
এখন যে রিবেসে --root রয়েছে, এটি এখন পর্যন্ত সর্বাধিক নিকটতম সমাধান।
রস বার্টন

1

সর্বশেষ এবং দুর্দান্ততমটির সংমিশ্রণ। কোনও পার্শ্ব প্রতিক্রিয়া নেই, কোনও বিরোধ নেই, ট্যাগ রাখছেন।

git log --reverse

tree=`git hash-object -wt tree --stdin < /dev/null`
commit=`git commit-tree -m 'Initialize empty repository' $tree`
echo $commit # copy below, interpolation didn't work for me

git filter-branch --parent-filter 'sed "s/^\$/-p <commit>/"' --tag-name-filter cat master

git log --reverse

নোট করুন যে গিটহাবে আপনি সিআই রান ডেটা হারাবেন এবং অন্য শাখাগুলিও ঠিক না করা হলে পিআর মেসে যেতে পারে।


0

উত্তর অনুসরণ করে অ্যারিস্টটল প্যাগাল্টজিস এবং অন্যান্য কিন্তু আরও সাধারণ কমান্ড ব্যবহার করছেন

zsh% git checkout --orphan empty     
Switched to a new branch 'empty'
zsh% git rm --cached -r .
zsh% git clean -fdx
zsh% git commit --allow-empty -m 'initial empty commit'
[empty (root-commit) 64ea894] initial empty commit
zsh% git checkout master
Switched to branch 'master'
zsh% git rebase empty
First, rewinding head to replay your work on top of it...
zsh% git branch -d empty 
Deleted branch empty (was 64ea894).

নোট করুন আপনার রেপোতে কোনও স্থানীয় পরিবর্তন আসার অপেক্ষা রাখে না comm
নোট git checkout --orphanগিটের নতুন সংস্করণে কাজ করবে বলে আমার ধারণা।
নোট বেশিরভাগ সময় git statusদরকারী ইঙ্গিত দেয়।


-6

একটি নতুন সংগ্রহস্থল শুরু করুন।

আপনার তারিখটি আপনি শুরু করার তারিখে সেট করুন।

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

আপনি আজ পৌঁছে গেলে, সংগ্রহস্থলগুলি অদলবদল করুন এবং আপনার কাজ শেষ।

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

আপনি যখন সিদ্ধান্ত নেবেন যে আপনি এখন থেকে এক সপ্তাহ অন্য কোনও উপায়ে ঘটনাটি ঘটানোর সিদ্ধান্ত নেবেন তখন এটি আরও সুন্দর হয়ে উঠবে।


এমন একটি সমাধান সম্পর্কে আমার খারাপ অনুভূতি রয়েছে যার জন্য আপনাকে সিস্টেমের তারিখটি নিয়ে গণ্ডগোল করতে হবে তবে আপনি আমাকে একটি ধারণা দিয়েছেন, যা আমি কিছুটা বিকাশ করেছি এবং হায় আফসোস এটি কার্যকর হয়েছিল। সূতরাং ধন্যবাদ.
kch

-7

আমি জানি এই পোস্টটি পুরানো, তবে গুগলিং "কমিট গিট সন্নিবেশ করানো" যখন এই পৃষ্ঠাটি প্রথম।

সাধারণ জিনিসকে জটিল করে তুলছেন কেন?

আপনার কাছে এবিসি রয়েছে এবং আপনি এবিজেডিসি চান।

  1. git rebase -i trunk (বা বি এর আগে কিছু)
  2. বি লাইনে সম্পাদনা করতে পিক পরিবর্তন করুন
  3. আপনার পরিবর্তনগুলি করুন: git add ..
  4. git commit( git commit --amendযা বি সম্পাদনা করবে এবং জেড তৈরি করবে না)

[ git commitএখানে আরও কমিট সন্নিবেশ করতে আপনি যতটা চান এখানে করতে পারেন। অবশ্যই, আপনার 5 ম পদক্ষেপ নিয়ে সমস্যা হতে পারে, তবে গিটের সাথে সংশ্লেষিত সংঘাতের সমাধান করা আপনার দক্ষতা থাকা উচিত। যদি না হয়, অনুশীলন!]

  1. git rebase --continue

সরল, তাই না?

যদি তুমি বোঝ git rebase , একটি 'রুট' কমিট যুক্ত হওয়া উচিত নয় a

গিট সাথে মজা আছে!


5
প্রশ্নটি প্রথম প্রতিশ্রুতি সন্নিবেশ করানোর জন্য জিজ্ঞাসা করে : এবিসি থেকে আপনি জেডএবিসি চান। একটি সরল ব্যক্তি এটি git rebaseকরতে পারে না।
পেটর ভিক্টরিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.