আমি কীভাবে মুছে ফেলা রেখাটিকে "গিটকে দোষ দেব"?


506

git blameপরিবর্তিত এবং যুক্ত রেখাগুলির জন্য দুর্দান্ত তবে কীভাবে আমি সন্ধান করতে পারি যখন একটি নির্দিষ্ট পূর্ববর্তী প্রতিশ্রুতিতে বিদ্যমান একটি লাইন শেষ পর্যন্ত মুছে ফেলা হয়। আমি ভাবছিলাম bisect, তবে আমি হ্যান্ডিয়ারের জন্য কিছু আশা করছিলাম।

(আপনি জিজ্ঞাসার আগে: এই ক্ষেত্রে আমি git log -pকোড লাইনের জন্য সবেমাত্র একটি অনুসন্ধান করেছি এবং (ক) কিছু বোকা সবেমাত্র পূর্বের প্রতিশ্রুতিতে গুরুত্বপূর্ণ রেখাটি মুছে ফেলেছিল এবং (খ) আমি সেই বোকা।)


4
মার্জ (বিরোধগুলি) চলাকালীন অপসারণগুলি দেখানোর জন্য একটি বা সেইসাথে অপসারণ দেখাতে চায় এমন একটি জবাবের সাথে একটি ফলোআপ রয়েছেgit log -S<string> /path/to/file-c-cc
সিএফআই

3
এটা হওয়া উচিত -cএবং --cc। @ সেনান: সঠিক, নির্দেশ করার জন্য ধন্যবাদ! বোকা নিরীক্ষণ। আশা করি আমি মন্তব্যটি সম্পাদনা করতে পারতাম। একটি নতুন যুক্ত করা, তারপরে আমার মুছে ফেলা, তারপরে আপনি মুছে ফেলুন আমার মনে হয় খুব জটিল :) :)
সিএফআই

4
আমার ইচ্ছা git blameআছে মুছে ফেলা লাইনগুলি (সম্ভবত স্ট্রাইকথ্রু বা লাল পাঠ্য সহ) মুছে ফেলা সংশোধন করে দেখাতে পারে।
ক্রেগ ম্যাককুইন

লেখা কি কষ্ট হবে? গিট ইন্টারনাল সম্পর্কে আমি বেশি কিছু জানি না।
মালভোলিও

উত্তর:


635

আপনি যদি লাইনটির বিষয়বস্তু জানেন তবে এটি এর জন্য আদর্শ ব্যবহারের ক্ষেত্রে:

git log -S <string> path/to/file

যা আপনাকে কমিট করে দেখায় যা সেই স্ট্রিংয়ের একটি উদাহরণ পরিচয় করিয়ে দেয় বা সরিয়ে দেয়। -G<regex>নিয়মিত প্রকাশের সাথে একই জিনিসটিও করে যা! দেখুন man git-logএবং অনুসন্ধান -Gএবং -Sবিকল্প, অথবা আরও তথ্যের জন্য খনিত্র (এই বৈশিষ্ট্যগুলির জন্য বন্ধুত্বপূর্ণ নাম)।

-Sবিকল্প আসলে শিরোলেখ উল্লেখ করা হয় git-blameখুব র manpage, বিবরণ অধ্যায়, যেখানে এটি ব্যবহার করে একটি উদাহরণ দেয় git log -S...


উজ্জ্বল ... ঠিক এই পোর্টিং
জবটিতে

37
1+ বছরের জন্য গিট ব্যবহার করার পরে, এটি এখনও আমাকে অবাক করে দিয়ে দেখেছে যে আমার কাছে প্রায় কোনও ব্যবহারের দৃশ্যের সমাধান করার জন্য গিটের সর্বদা কোথাও একটি আদেশ / বিকল্প রয়েছে। এই ভাগ করে নেওয়ার জন্য ধন্যবাদ, এটি এখন আমার প্রয়োজন ঠিক!
পাস্কেল বাউরক

22
এই পদ্ধতিটি আমার জন্য আগে কাজ করেছে, তবে এখনই আমি এমন একটি মামলা দেখেছি যেখানে এটি লাইনটি মুছে ফেলা হয়েছে বলে প্রতিশ্রুতি খুঁজে পায়নি। এতে দেখা গেছে যে প্রশ্নটির লাইনটি একীভূত প্রতিশ্রুতিতে মুছে ফেলা হয়েছে - এটি ব্যর্থতার ব্যাখ্যা দেয়? ( git blame --reverseপদ্ধতিটি যদিও এটি সন্ধান করেছে))
এন্টিনোম

9
@ অ্যান্টিনোম মার্জ থেকে কমিটগুলি দেখানোর জন্য -cবিকল্পটি অতিরিক্তভাবে ব্যবহার করুন ।
ইউনজেন

2
আমি ম্যানপেজে "-s" তে একটি ctrl + f করেছি এবং কিছুই পাইনি। পেজে কোথায় দেখছেন ?? আমি গিটটি 1.8.5.2 ব্যবহার করছি
অস্থায়ী_ ব্যবহারকারী_নাম

134

আমার মনে হয় আপনি যা চান তা হ'ল

git blame --reverse START..END filename

ম্যানপেজ থেকে :

পিছনে পিছনে ইতিহাস এগিয়ে যান। কোন রেখাটি প্রদর্শিত হয়েছিল এমন পুনর্বিবেচনাটি প্রদর্শন করার পরিবর্তে এটি সর্বশেষ সংশোধনটি দেখায় যেখানে একটি রেখার অস্তিত্ব রয়েছে। এটির জন্য START..END এর মতো বিভিন্ন সংশোধনী দরকার যেখানে দোষ দেওয়ার পথটি START এ উপস্থিত রয়েছে।

এর সাথে git blame reverse, আপনি শেষ প্রতিশ্রুতিটি লাইনটিতে উপস্থিত খুঁজে পেতে পারেন You

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

git log --reverse --ancestry-path COMMIT^..master

14
যদি শাখা থেকে একাধিক সংশ্লেষ ঘটে যেখানে শাখাটিতে লাইনটি যুক্ত করা হয়েছিল যেখানে লাইনটি অনুপস্থিত রয়েছে (বা অন্য কোনও ক্ষেত্রে যেখানে বংশের মধ্যে START থেকে শেষ পর্যন্ত একাধিক পাথ রয়েছে), git blame --reverseকালক্রমিকভাবে সংযুক্তির আগে সংশোধনটি দেখাবে সর্বশেষে, প্রাথমিক সংশ্লেষের আগে সংশোধন নয় যেখানে লাইন না নেওয়ার সিদ্ধান্ত নেওয়া হয়েছিল। সর্বাধিক সাম্প্রতিক সংস্করণের পরিবর্তে লাইনটি বন্ধ হয়ে গিয়েছিল এমন প্রাথমিক সংস্করণটি খুঁজে পাওয়ার কি কোনও উপায় আছে?
রাকলাইস

2
@ ইরাক্লাইস, এর জন্য আপনি দোষ - রিভার্স - প্রথম-পিতামাতা ব্যবহার করতে পারেন, এটি কিছুটা ভাল।
সর্বোচ্চ 630

17

কেবল ক্যাসাবেলের উত্তরটি সম্পূর্ণ করতে :

git log --full-history -S <string> path/to/file

আমি এখানে উল্লিখিত হিসাবে একই সমস্যা ছিল, কিন্তু এটি প্রমাণিত হয়েছে যে লাইনটি অনুপস্থিত ছিল, কারণ কোনও শাখা থেকে মার্জ করা প্রতিশ্রুতিটি আবার ফিরে গেছে এবং তারপরে এটি আবার একীভূত হয়ে কার্যকরভাবে প্রশ্নটিতে থাকা লাইনটি সরিয়ে দিয়েছে। --full-historyপতাকা প্রতিরোধ ঐ করে কুঁদন।


9

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

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

https://github.com/eantoranz/difflame


0

মার্জ কমিটগুলিতে লুকানো পরিবর্তনের জন্য

মার্জ কমিটসগুলিতে গিট লগ আউটপুট থেকে স্বয়ংক্রিয়ভাবে তাদের পরিবর্তনগুলি লুকানো থাকে। পিকেক্স এবং বিপরীত-দোষ উভয়ই এই পরিবর্তনটি খুঁজে পায়নি। সুতরাং আমি যে লাইনটি চেয়েছিলাম তা যুক্ত করা হয়েছিল এবং পরে অপসারণ করা হয়েছিল এবং আমি মার্জটি খুঁজে পেতে চেয়েছিলাম যা এটি মুছে ফেলে। ফাইল git log -p -- path/fileইতিহাস কেবল এটি যুক্ত করা দেখিয়েছে। এটি সন্ধান করার জন্য এখানে আমি সবচেয়ে ভাল উপায় খুঁজে পেয়েছি:

git log -p -U9999 -- path/file

পরিবর্তনের জন্য অনুসন্ধান করুন, তারপরে "^ কমিট" এর জন্য পিছনের দিকে অনুসন্ধান করুন - প্রথম "^ কমিট" ফাইলটি সর্বশেষ যে লাইনটি রেখেছে সেখানে প্রতিশ্রুতিবদ্ধ। দ্বিতীয় "^ কমিট" এটি অদৃশ্য হওয়ার পরে। দ্বিতীয় প্রতিশ্রুতিবদ্ধতা এটি হতে পারে যে এটি হতে পারে। -U9999অভিমানী আপনার ফাইল সব সর্বোচ্চ 9999 লাইন আছে সম্পূর্ণ ফাইল বিষয়বস্তু (প্রতিটি সময় ফাইল পরিবর্তন করা হয়েছে পরে) দেখানোর জন্য বোঝানো হয়।

ব্রুট ফোর্সের মাধ্যমে সম্পর্কিত কোনও সংযুক্তি খুঁজে বের করে (প্রতিটি সম্ভাব্য মার্জ তার প্রথম পিতামাতার সাথে প্রতিশ্রুতি দেয়, অনেকগুলি কমিটের বিপরীতে চালিত হয়)

git log --merges --pretty=format:"git diff %h^...%h | grep target_text" HEAD ^$(git merge-base A B) | sh -v 2>&1 | less

(আমি পুনর্বিবেচনা ফিল্টারটি আরও সীমাবদ্ধ করার চেষ্টা করেছি, তবে আমি সমস্যার মধ্যে পড়েছিলাম এবং এটির প্রস্তাব দিই না I আমি যে অ্যাড / অপসারণের পরিবর্তনগুলি সন্ধান করছিলাম তা বিভিন্ন শাখায় ছিল যা বিভিন্ন সময়ে মিশে গিয়েছিল এবং এ ... বি অন্তর্ভুক্ত হয়নি) পরিবর্তনগুলি আসলে মূল লাইনে মিশে গেলে))

এই দুটি কমিট (এবং জটিল গিট ইতিহাস অনেকগুলি মুছে ফেলা) সহ একটি গিট ট্রি দেখান :

git log --graph --oneline A B ^$(git merge-base A B) (ক উপরোক্ত প্রথম প্রতিশ্রুতি, বি উপরের দ্বিতীয় প্রতিশ্রুতি)

এ এর ইতিহাস এবং এ এবং বি উভয়ের বি বিয়োগের ইতিহাস দেখান

বিকল্প সংস্করণ (নিয়মিত গিট ইতিহাস গাছের চেয়ে পথটি আরও রৈখিকভাবে দেখায় বলে মনে হচ্ছে - তবে আমি নিয়মিত গিট ইতিহাস গাছ পছন্দ করি):

git log --graph --oneline A...B

তিনটি, দুটি বিন্দু নয় - তিনটি বিন্দুর অর্থ "আর 1 আর 2 - নন্ট $ (গিট একীভূত বেস - সমস্ত আর 1 আর 2) It পাশ), তবে উভয় থেকে নয় " - উত্স: "মানুষ gitrevisions"

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