অতীতে আমি কীভাবে গিট কমিট করব?


222

আমি নিজের ব্যক্তিগত ব্যবহারের জন্য সমস্ত কিছুই গিটকে রূপান্তর করছি এবং আমি ইতিমধ্যে সংগ্রহস্থলের মধ্যে একটি ফাইলের কিছু পুরানো সংস্করণ পেয়েছি। ফাইলটির "সঠিক তারিখ সংশোধিত" ফাইলের সঠিক সংস্থায় আমি কীভাবে এটি ইতিহাসের সাথে প্রতিশ্রুতিবদ্ধ করব?

আমাকে এমন কিছু বলা হয়েছিল যা এইভাবে কাজ করবে:

git filter-branch --env-filter="GIT_AUTHOR_DATE=... --index-filter "git commit path/to/file --date " --tag-name-filter cat -- --all  

সংক্ষিপ্ত এবং সহজ উত্তর: স্ট্যাকওভারফ্লো.com
যশ

33
আমি অবাক হই যদি লোকেরা এর উত্তর সন্ধান করে কেবল তাদের গিটহাবের "অবদানের ধারা অব্যাহত"
এইভাবেই

1
@ জিতরো হ্যাঁ git commit --date="xxx day ago" -m "yyy"কেউ যদি ভাবছেন তবে কেবল সেটির জন্য সেটিংসই যথেষ্ট।
ভ্লাস সোকোলভ

alexpeattie.com/blog/working-with-dates-in-git : মৃদু ব্যাখ্যা
খুঁজলে

উত্তর:


198

আপনার দেওয়া পরামর্শটি ত্রুটিযুক্ত। নিঃশর্তভাবে GIT_AUTHOR_DATE সেট --env-filterকরতে প্রতিটি প্রতিশ্রুতিবদ্ধতার তারিখটি পুনরায় লিখবে । এছাড়াও, ভিতরে গিট কমিট ব্যবহার করা অস্বাভাবিক হবে --index-filter

আপনি এখানে একাধিক, স্বাধীন সমস্যা নিয়ে কাজ করছেন।

"এখন" ছাড়া অন্য তারিখগুলি নির্দিষ্ট করা

প্রতিটি কমিটের দুটি তারিখ থাকে: লেখকের তারিখ এবং প্রতিশ্রুতিবদ্ধতার তারিখ। নতুন প্রতিশ্রুতি লেখার যে কোনও কমান্ডের জন্য আপনি পরিবেশের ভেরিয়েবল GIT_AUTHOR_DATE এবং GIT_COMMITTER_DATE এর মাধ্যমে মান সরবরাহ করে প্রত্যেককে ওভাররাইড করতে পারেন। দেখুন "তারিখ ফর্ম্যাট" এ Git কমিট (1) অথবা নীচের:

Git internal format = <unix timestamp> <time zone offset>, e.g.  1112926393 +0200
RFC 2822            = e.g. Thu, 07 Apr 2005 22:13:13 +0200
ISO 8601            = e.g. 2005-04-07T22:13:13

সাধারণ ব্যবহারের সময় একটি নতুন আদেশ লেখার একমাত্র আদেশ হ'ল গিট কমিট । এটিতে একটি --dateবিকল্প রয়েছে যা আপনাকে সরাসরি লেখকের তারিখ নির্দিষ্ট করতে দেয়। আপনার প্রত্যাশিত ব্যবহারের সাথে git filter-branch --env-filterউপরে বর্ণিত পরিবেশের ভেরিয়েবলগুলিও অন্তর্ভুক্ত রয়েছে (এগুলি "এনভির অংশ" যার পরে বিকল্পটির নামকরণ করা হয়েছে; গিট-ফিল্টার-শাখায় "বিকল্পগুলি" দেখুন (1) এবং অন্তর্নিহিত "নদীর গভীরতানির্ণয়" কমান্ড গিট-কমিট -tree (1)

একটি একক রেফ ইতিহাসে একটি ফাইল In োকানো

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

নিম্নলিখিত কমান্ডগুলিতে কমিটের অবজেক্টের নাম (SHA-1 হ্যাশ) "A" এর পরিবর্তে ব্যবহার করুন। আপনি যখন গিট কমিট পরিচালনা করেন তখন একটি "তারিখ ওভাররাইড" পদ্ধতি ব্যবহার করতে ভুলবেন না

---A---B---C---o---o---o   master

git checkout master
git checkout A~0
git add path/to/file
git commit --date='whenever'
git tag ,new-commit -m'delete me later'
git checkout -
git rebase --onto ,new-commit A
git tag -d ,new-commit

---A---N                      (was ",new-commit", but we delete the tag)
        \
         B'---C'---o---o---o   master

আপনি যদি নতুন ফাইল অন্তর্ভুক্ত করতে A আপডেট করতে চান (যেখানে এটি যুক্ত হয়েছিল সেখানে নতুন প্রতিশ্রুতি তৈরি করার git commit --amendপরিবর্তে ), তার পরিবর্তে ব্যবহার করুন git commit। ফলাফলটি দেখতে এই রকম হবে:

---A'---B'---C'---o---o---o   master

উপরেরগুলি ততক্ষণ কাজ করে যতক্ষণ আপনি এই প্রতিশ্রুতিটির নাম দিতে পারেন যা আপনার নতুন প্রতিশ্রুতির পিতামাতার হওয়া উচিত। আপনি যদি সত্যিই নিজের নতুন ফাইলটি নতুন মূল প্রতিশ্রুতি (পিতামাতা নন) এর মাধ্যমে যুক্ত করতে চান তবে আপনার কিছুটা আলাদা প্রয়োজন:

B---C---o---o---o   master

git checkout master
git checkout --orphan new-root
git rm -rf .
git add path/to/file
GIT_AUTHOR_DATE='whenever' git commit
git checkout -
git rebase --root --onto new-root
git branch -d new-root

N                       (was new-root, but we deleted it)
 \
  B'---C'---o---o---o   master

git checkout --orphanতুলনামূলকভাবে নতুন (গিট 1.7.2), তবে গিটের পুরানো সংস্করণগুলিতে একই জিনিসটি করার অন্যান্য উপায় রয়েছে

একটি মাল্টি- একটি ফাইল সন্নিবেশ করানো হচ্ছে সুত্র ইতিহাস

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

দ্রষ্টব্য: নীচের উদাহরণগুলি git update-index --addপরিবর্তে নিম্ন-স্তরের কমান্ড ব্যবহার করে git add। আপনি গিট অ্যাড ব্যবহার করতে পারেন , তবে আপনাকে প্রথমে কোনও বাহ্যিক অবস্থান থেকে প্রত্যাশিত পথে কপি করতে হবে ( --index-filterখালি একটি অস্থায়ী GIT_WORK_TREE এ এর ​​কমান্ড চালায়)।

যদি আপনি চান যে আপনার নতুন ফাইলটি বিদ্যমান বিদ্যমান প্রতিশ্রুতিতে যুক্ত করা যায় তবে আপনি এটি করতে পারেন:

new_file=$(git hash-object -w path/to/file)
git filter-branch \
  --index-filter \
    'git update-index --add --cacheinfo 100644 '"$new_file"' path/to/file' \
  --tag-name-filter cat \
  -- --all
git reset --hard

বিদ্যমান কমিটের তারিখগুলি পরিবর্তনের কোনও কারণ আমি সত্যিই দেখতে পাচ্ছি না --env-filter 'GIT_AUTHOR_DATE=…'। আপনি যদি এটি ব্যবহার করে থাকেন তবে আপনি এটি শর্তযুক্ত করে তুলবেন যাতে এটি প্রতিটি প্রতিশ্রুতির জন্য তারিখটি পুনরায় লিখন করে।

আপনি যদি চান যে আপনার নতুন ফাইলটি বিদ্যমান কিছু প্রতিশ্রুতিবদ্ধ ("এ") এর পরে কেবল কমিটগুলিতে উপস্থিত হয়, তবে আপনি এটি করতে পারেন:

file_path=path/to/file
before_commit=$(git rev-parse --verify A)
file_blob=$(git hash-object -w "$file_path")
git filter-branch \
  --index-filter '

    if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$before_commit"') &&
       test -n "$x"; then
         git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
    fi

  ' \
  --tag-name-filter cat \
  -- --all
git reset --hard

যদি আপনি চান ফাইলকে একটি নতুন মাধ্যমে যুক্ত করার জন্য যদি কমিট যে আপনার ইতিহাস মাঝখানে সন্নিবেশিত করা হয়, তাহলে আপনি নতুন জেনারেট করতে কমিট করতে হবে ব্যবহার করার পূর্বে Git ফিল্টার-শাখা যোগ --parent-filterকরার Git ফিল্টার-শাখা :

file_path=path/to/file
before_commit=$(git rev-parse --verify A)

git checkout master
git checkout "$before_commit"
git add "$file_path"
git commit --date='whenever'
new_commit=$(git rev-parse --verify HEAD)
file_blob=$(git rev-parse --verify HEAD:"$file_path")
git checkout -

git filter-branch \
  --parent-filter "sed -e s/$before_commit/$new_commit/g" \
  --index-filter '

    if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$new_commit"') &&
       test -n "$x"; then
         git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
    fi

  ' \
  --tag-name-filter cat \
  -- --all
git reset --hard

এছাড়াও আপনি ফাইল প্রথমে একটি নতুন মূল যোগ কমিট করা ব্যবস্থা করতে পারে: থেকে "অনাথ" পদ্ধতির মাধ্যমে কমিট আপনার নতুন রুট তৈরি Git রি-বেসের ফলে অধ্যায় (এটা মধ্যে ক্যাপচার new_commit), নিঃশর্ত ব্যবহার --index-filter, এবং একটি --parent-filterমত "sed -e \"s/^$/-p $new_commit/\""


ব্যবহারের মামলার প্রথম উদাহরণে, "একটি মাল্টি-রেফার ইতিহাসের মধ্যে একটি ফাইল ?োকানো": --index-filterফিরে আসা কমিটগুলিতে প্রয়োগ করার কোনও উপায় আছে কি git rev-list? এই মুহুর্তে আমি দেখছি সূচি ফিল্টারটি রেভ-তালিকার একটি উপ-সেটে প্রয়োগ হয়েছে। যে কোনও অন্তর্দৃষ্টি প্রশংসা করুন।
হেজেহোগ

@ হেজহগ: সমস্ত "বহু-রেফ" উদাহরণগুলি যে -- --allকোনও রেফার থেকে আগত সমস্ত কমিটিকে প্রক্রিয়া করতে ব্যবহার করে। সর্বশেষ উদাহরণটি দেখায় যে কীভাবে কেবলমাত্র কয়েকটি নির্দিষ্ট কমিট পরিবর্তন করতে হয় (কেবল আপনার পছন্দসইটির জন্য GIT_COMMIT পরীক্ষা করুন)। শুধুমাত্র কমিটের একটি নির্দিষ্ট তালিকা পরিবর্তন করতে, আপনি ফিল্টারিংয়ের আগে তালিকাটি সংরক্ষণ করতে পারেন (উদাঃ git rev-list … >/tmp/commits_to_rewrite), তারপরে ফিল্টারের ভিতরে সদস্যতার জন্য পরীক্ষা করুন (উদাহরণস্বরূপ if grep -qF "$GIT_COMMIT" /tmp/commits_to_rewrite; then git update-index …)। ঠিক কি আপনি সাধন করার চেষ্টা করছেন? মন্তব্যগুলিতে ব্যাখ্যা করার পরিমাণ খুব বেশি হলে আপনি একটি নতুন প্রশ্ন শুরু করতে চাইতে পারেন।
ক্রিস জনসন

আমার ক্ষেত্রে, আমার একটি ছোট প্রকল্প রয়েছে যা আমি উত্স নিয়ন্ত্রণে রাখার অর্থ ছিল। (আমি এটি করিনি, কারণ এটি একটি একক প্রকল্প এবং কোন সিস্টেমটি ব্যবহার করব তা আমি স্থির করি নি)। আমার "উত্স নিয়ন্ত্রণ" আমার সম্পূর্ণ প্রকল্প ট্রিটিকে একটি নতুন ডিরেক্টরিতে অনুলিপি করার এবং পূর্ববর্তী সংস্করণ ডিরেক্টরিটির নামকরণ করার বিষয় ছিল। আমি গিতে নতুন (পূর্বে এসসিসিএস, আরসিএস এবং সিভিএসের অনুরূপ কুৎসিত মালিকানাধীন আরসিএস ডেরিভেটিভ ব্যবহার করার পরে) তাই আমার সাথে কথা বলার বিষয়ে চিন্তা করবেন না। আমি এই ধারণাটি পেয়েছি যে উত্তরটিতে "একটি একক রেফের ইতিহাসে একটি ফাইল Inোকানো" বিভাগের একটি ভিন্নতা জড়িত। সঠিক?
স্টিভ 20

1
@ স্টিভ: "একক রেফ" পরিস্থিতি প্রযোজ্য যদি আপনার ইতিহাসটি একক, উন্নয়নের লাইন থেকে থাকে (যেমন সমস্ত স্ন্যাপশটগুলি একক, রৈখিক শাখার ধারাবাহিক পয়েন্ট হিসাবে দেখা হয়) sense যদি আপনার ইতিহাসে একাধিক শাখা থাকে (বা থাকে) তবে "মাল্টি-রেফ" পরিস্থিতি প্রযোজ্য। আপনার ইতিহাস জটিল না হলে ("ক্লকযুক্ত" সংস্করণগুলি বিভিন্ন ক্লায়েন্টদের জন্য, "বগফিক্স" শাখা বজায় রেখেছিল যখন "কাজকর্ম" ইত্যাদি ক্ষেত্রে নতুন কাজ হয়েছে), তবে আপনি সম্ভবত একটি "একক রেফ" পরিস্থিতি দেখছেন। যাইহোক , দেখে মনে হচ্ছে আপনার পরিস্থিতি এই প্রশ্নের চেয়ে আলাদা ...
ক্রিস জনসন

1
@ স্টিভ: যেহেতু আপনার কাছে historicalতিহাসিক ডিরেক্টরি-স্ন্যাপশটগুলির একটি সিরিজ রয়েছে — এবং আপনার কাছে ইতিমধ্যে একটি গিট সংগ্রহস্থল নেই — তবে আপনি সম্ভবত স্ন্যাপশটগুলি থেকে একটি নতুন গিট সংগ্রহশালা তৈরি করতে import-directories.perlগিটের contrib/(বা import-tars.perl, বা import-zips.py...) থেকে ব্যবহার করতে পারেন (এমনকি এর সাথেও) "পুরাতন" টাইমস্ট্যাম্প)। rebase/ filter-branchআমার উত্তর প্রযুক্তির কারণেই শুধুমাত্র প্রয়োজন যদি আপনি একটি ফাইল ছিল একটি বিদ্যমান সংগ্রহস্থলের ইতিহাসের "বাদ" সন্নিবেশ করতে চান করছে।
ক্রিস জনসেন

118

আপনি প্রতিশ্রুতি যথারীতি তৈরি করতে পারেন তবে আপনি যখন প্রতিশ্রুতিবদ্ধ হন তখন পরিবেশের ভেরিয়েবলগুলি GIT_AUTHOR_DATEএবং GIT_COMMITTER_DATEউপযুক্ত তারিখের সময়গুলিতে সেট করুন ।

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

o--o--o--o--o

এবং আপনি চান যে আপনার নতুন প্রতিশ্রুতি ("এক্স" হিসাবে চিহ্নিত) দ্বিতীয় প্রদর্শিত হবে :

o--X--o--o--o--o

সবচেয়ে সহজ উপায় হ'ল প্রথম প্রতিশ্রুতি থেকে শাখা করা, আপনার নতুন প্রতিশ্রুতি যুক্ত করা, এবং নতুন চুক্তির উপরে অন্য সমস্ত প্রতিশ্রুতিগুলি রিবাজ করা। তাই ভালো:

$ git checkout -b new_commit $desired_parent_of_new_commit
$ git add new_file
$ GIT_AUTHOR_DATE='your date' GIT_COMMITTER_DATE='your date' git commit -m 'new (old) files'
$ git checkout master
$ git rebase new_commit
$ git branch -d new_commit

25
আমি সর্বদা এই ভাল উত্তরটি খুঁজে পাই, তবে তারিখের ফর্ম্যাটটি খুঁজে পেতে তাড়াহুড়া করতে হবে, সুতরাং এটি পরবর্তী সময়ের জন্য 'শুক্র জুলাই 19:32:10 2013 -0400'
মেবিগফ্যাটগুই

94
GIT_AUTHOR_DATE='Fri Jul 26 19:32:10 2013 -0400' GIT_COMMITTER_DATE='Fri Jul 26 19:32:10 2013 -0400' git commit
শিওনক্রস

15
আরও অনেক কিছুই রয়েছে, উদাহরণস্বরূপ বরং স্মৃতিভিত্তিক2013-07-26T19:32:10 : kernel.org/pub/software/scm/git/docs/…
মারিয়ান

3
যাইহোক, '-0400' অংশটি টাইমজোন অফসেটটিকে স্পিফিক করে। এটি সঠিকভাবে নির্বাচন করার বিষয়ে সচেতন হোন ... কারণ যদি তা না হয় তবে তার ভিত্তিতে আপনার সময় পরিবর্তন হবে। উদাহরণস্বরূপ, আমার ক্ষেত্রে, যিনি শিকাগোতে থাকেন, আমাকে '-0600' (উত্তর আমেরিকা সিএসটি) বেছে নিতে হয়েছিল। : আপনি এখানে কোড জানতে পারেন timeanddate.com/time/zones
evaldeslacasa

2
যেহেতু তারিখটি পুনরাবৃত্তি করা দরকার, তাই আমি আরও একটি পরিবর্তনশীল তৈরি করা সহজ করে দেখলাম:THE_TIME='2019-03-30T8:20:00 -0500' GIT_AUTHOR_DATE=$THE_TIME GIT_COMMITTER_DATE=$THE_TIME git commit -m 'commit message here'
ফ্রাঙ্ক হেনার্ড

118

আমি জানি এই প্রশ্নটি বেশ পুরানো, তবে এটিই আমার পক্ষে কাজ করেছিল:

git commit --date="10 day ago" -m "Your commit message" 

16
এটি পুরোপুরি কাজ করে। আমি surprized যা --dateমানব-পঠনযোগ্য আপেক্ষিক তারিখ বিন্যাস সমর্থন করে।
ZitRo

@ ZitRo 10 দিন কেন?
Alex78191

10
সতর্কতা: git --dateকেবলমাত্র $ GIT_AUTHOR_DATE সংশোধন করবে ... সুতরাং পরিস্থিতিগুলির উপর নির্ভর করে আপনি কমিটের সাথে সংযুক্ত বর্তমান তারিখটি দেখতে পাবেন ($ GIT_COMMITTER_DATE)
গুইডো ইউ। ড্রিমহাম

3
@ গুডোইউ.ড্রেহাইম যা বলেছে তাতে ট্যাগ করে। আপনি কোনও কমিটের সম্পূর্ণ বিশদ ব্যবহার করে পরীক্ষা করতে পারেন git show <commit-hash> --format=fuller। সেখানে, আপনি যে AuthorDateতারিখটি নির্দিষ্ট করেছেন তা CommitDateহ'ল তবে এটি অঙ্গীকারের আসল তারিখ।
d4nyll

তাহলে কি কমিটিকেট পরিবর্তন করার বা সম্পূর্ণ অতীত তারিখের প্রতিশ্রুতি দেওয়ার কোনও উপায় নেই? @ d4nyll
রাহুল

35

সময়ের সাথে আমার ক্ষেত্রে আমি সংস্করণের একটি গুচ্ছ মুক্তি দিয়েছেন myfile myfile_bak, myfile_old, myfile_2010, ব্যাকআপ / myfile ইত্যাদি আমি তাদের পরিমার্জন তারিখ ব্যবহার Git মধ্যে myfile ইতিহাসে করা চেয়েছিলেন। সুতরাং মাইফিলের প্রাচীনতম নামকরণ করুন git add myfile, তারপরে git commit --date=(modification date from ls -l) myfile, মাইফিলের পরের প্রাচীনতমটির নামকরণ করুন, - gd এর সাথে আরও একটি গিট কমিট পুনরাবৃত্তি করুন ...

এটি কিছুটা স্বয়ংক্রিয় করতে, আপনি ফাইলটির পরিবর্তনের সময় পেতে শেল-ফু ব্যবহার করতে পারেন। আমি দিয়ে শুরু করেছি ls -lএবং cutস্ট্যাট (1) আরও সরাসরি direct

গিট কমিট - ডেট = "` স্ট্যাটাস-সি% ই মাইফাইল `" মাইফাইল


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

Git-scm.com/docs/git-commit থেকে: --date"প্রতিশ্রুতিতে ব্যবহৃত লেখকের তারিখটি ওভাররাইড করুন।" git logতারিখটি লেখকের তারিখ বলে মনে হচ্ছে, এটি লেখক এবং কমিটি তারিখ git log --pretty=fullerউভয়ই দেখায়।
skierpage

16
git commitবিকল্প --dateশুধুমাত্র পরিবর্তন করতে হবে GIT_AUTHOR_DATE, না GIT_COMMITTER_DATEপ্রো গিট বুক যেমন ব্যাখ্যা করে: "লেখক হলেন সেই ব্যক্তি যিনি মূলত রচনাটি লিখেছিলেন, তবে প্রতিশ্রুতিবদ্ধ ব্যক্তি হলেন তিনিই সর্বশেষে কাজটি প্রয়োগ করেছিলেন।" তারিখের প্রসঙ্গে, GIT_AUTHOR_DATEফাইলটি পরিবর্তিত GIT_COMMITTER_DATEহওয়ার তারিখটি হ'ল , যেখানে এটি প্রতিশ্রুতিবদ্ধ হওয়ার তারিখ। এখানে এখানে লক্ষণীয় গুরুত্বপূর্ণ যে ডিফল্টরূপে git logলেখকের তারিখগুলি "তারিখ" হিসাবে প্রদর্শন করে তবে তারপরে কোনও --sinceবিকল্প দেওয়া হলে ফিল্টারিংয়ের জন্য কমিটের তারিখগুলি ব্যবহার করে ।
ক্রিস্টোফার

ওএস এক্স 10.11.1
থিনসোল্ডার

stat -c %yম্যাকোস (এবং অন্যান্য বিএসডি ভেরিয়েন্ট) এর সমতুল্য stat -f %m
বিজয়ী

21

নিম্নলিখিত কি আমি পরিবর্তন কমিট করার সময় ব্যবহার করেন fooকরার N=1অতীতে দিন:

git add foo
git commit -m "Update foo"
git commit --amend --date="$(date -v-1d)"

আপনি যদি একটি এমনকি পুরোনো তারিখ কমিট করতে চান তাহলে, বলে 3 দিন পিছনে, শুধু পরিবর্তন dateযুক্তি: date -v-3d

উদাহরণস্বরূপ, আপনি গতকাল কোনও প্রতিশ্রুতি দিতে ভুলে গেলে এটি সত্যিই কার্যকর।

আপডেট : --dateমত --date "3 days ago"বা এমনকি মত প্রকাশও গ্রহণ করে --date "yesterday"। সুতরাং আমরা এটিকে একটি লাইন কমান্ডে হ্রাস করতে পারি:

git add foo ; git commit --date "yesterday" -m "Update"

6
সতর্কতা: git --dateকেবলমাত্র $ GIT_AUTHOR_DATE সংশোধন করবে ... সুতরাং পরিস্থিতিগুলির উপর নির্ভর করে আপনি কমিটের সাথে সংযুক্ত বর্তমান তারিখটি দেখতে পাবেন ($ GIT_COMMITTER_DATE)
গুইডো ইউ। ড্রিমহাম

2 টি পদ্ধতির একত্রে মিশ্রণ প্রায় নিখুঁত ফিট করে:git commit --amend --date="$(stat -c %y fileToCopyMTimeFrom)"
andrej

অসাধারণ! একটি মানব পাঠযোগ্য তারিখ সহ একই কমান্ডgit commit --amend --date="$(date -R -d '2020-06-15 16:31')"
পিক্সেলব্রেকেট

16

আমার ক্ষেত্রে - - তারিখ বিকল্পটি ব্যবহার করার সময়, আমার গিট প্রক্রিয়াটি ক্র্যাশ হয়ে গেছে। আমি ভয়ানক কিছু করতে পারে। এবং ফলস্বরূপ কিছু সূচি.লক ফাইল উপস্থিত হয়েছিল। সুতরাং আমি সমস্ত পরিবর্তনকৃত ফাইলগুলি পাসের তারিখগুলিতে চালিত হওয়ার জন্য .git ফোল্ডার থেকে। লক ফাইলগুলি ম্যানুয়ালি মুছে ফেলেছিলাম এবং কার্যকর করেছিলাম this সমস্ত উত্তর এখানে থ্যাঙ্কস।

git commit --date="`date --date='2 day ago'`" -am "update"

5
উপরে মন্তব্যgit commit --date দেখুন । এছাড়াও, আপনার উদাহরণ প্রতিশ্রুতি বার্তাগুলি এই @ JstRoRR
ক্রিস্টোফার

4
সতর্কতা: git --dateকেবলমাত্র $ GIT_AUTHOR_DATE সংশোধন করবে ... সুতরাং পরিস্থিতিগুলির উপর নির্ভর করে আপনি কমিটের সাথে সংযুক্ত বর্তমান তারিখটি দেখতে পাবেন ($ GIT_COMMITTER_DATE)
গুইডো ইউ। ড্রিমহাম

9

একটি কমিট যে মনে হচ্ছে অতীতে করা হয়েছিল তোমাদের দুজনকেই সেট করতে করতে GIT_AUTHOR_DATEএবং GIT_COMMITTER_DATE:

GIT_AUTHOR_DATE=$(date -d'...') GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" git commit -m '...'

যেখানে date -d'...'সঠিক তারিখের মতো 2019-01-01 12:00:00বা আপেক্ষিকের মতো হতে পারে 5 months ago 24 days ago

গিট লগ ব্যবহারের উভয় তারিখ দেখতে:

git log --pretty=fuller

এটি মার্জ কমিটের জন্যও কাজ করে:

GIT_AUTHOR_DATE=$(date -d'...') GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" git merge <branchname> --no-ff

2

আপনি সর্বদা আপনার কম্পিউটারে একটি তারিখ পরিবর্তন করতে পারেন, প্রতিশ্রুতিবদ্ধ করতে পারেন, তারপরে তারিখটি পরিবর্তন করে ধাক্কা দিতে পারেন।


1
আমি মনে করি এটি সঠিক অনুশীলন নয়, এটি কিছু অজানা সমস্যা তৈরি করতে পারে
ভিনো

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