গিট ডিফ থেকে তার বিযুক্ত আউটপুটে অন্রে্যাকড ফাইলগুলি অন্তর্ভুক্ত করার জন্য জিজ্ঞাসা করা সম্ভব? বা আমার তৈরি নতুন ফাইল এবং আমি সম্পাদিত বিদ্যমান ফাইলগুলিকে যুক্ত করতে এবং যুক্ত করতে আমার সেরা বাজি
git diff --cached
?
গিট ডিফ থেকে তার বিযুক্ত আউটপুটে অন্রে্যাকড ফাইলগুলি অন্তর্ভুক্ত করার জন্য জিজ্ঞাসা করা সম্ভব? বা আমার তৈরি নতুন ফাইল এবং আমি সম্পাদিত বিদ্যমান ফাইলগুলিকে যুক্ত করতে এবং যুক্ত করতে আমার সেরা বাজি
git diff --cached
?
উত্তর:
সাম্প্রতিক গিট সংস্করণগুলির সাহায্যে আপনি git add -N
ফাইল (বা --intent-to-add
) ফাইল করতে পারেন যা সেই স্থানে সূচকটিতে একটি শূন্য দৈর্ঘ্যের ব্লব যুক্ত করে। আপশটটি হ'ল আপনার "চিহ্নবিহীন" ফাইলটি এখন এই শূন্য দৈর্ঘ্যের ফাইলে সমস্ত সামগ্রী যুক্ত করার জন্য একটি পরিবর্তন হয়ে যায় এবং এটি "গিট ডিফ" আউটপুটে প্রদর্শিত হয়।
git diff
echo "this is a new file" > new.txt
git diff
git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file
দুঃখের বিষয়, যেমন উল্লেখ করা হয়েছে, git stash
আপনার কাছে --intent-to-add
এই ফাইলটি মুলতুবি থাকা অবস্থায় আপনি পারবেন না । যদিও আপনার যদি স্ট্যাশ দরকার হয় তবে আপনি কেবল নতুন ফাইলগুলি যুক্ত করুন এবং তারপরে সেগুলি স্ট্যাশ করুন। অথবা আপনি অনুকরণ কাজটি ব্যবহার করতে পারেন:
git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(এখানে একটি উপনাম স্থাপন করা আপনার বন্ধু)
git add -N .
আমি বিশ্বাস করি যে আপনি কেবল উভয় ফাইলের পথ সরবরাহ করে আপনার সূচী এবং আনক্র্যাকড ফাইলগুলির মধ্যে ফাইলগুলির মধ্যে পার্থক্য করতে পারেন।
git diff --no-index tracked_file untracked_file
git diff --no-index untracked_file_1 untracked_file_2
করতে পারি git diff
... সুন্দর।
/dev/null
পরিবর্তে: git diff --no-index -- /dev/null <untracked_file>
।
cat untracked_file_1
, বা সম্ভবত আপনার printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
যদি সত্যিই সবুজ আউটপুট প্রয়োজন। :) (যদিও আরও গুরুতর নোটের পরেও, দয়া করে নোট করুন যে কমান্ড প্রতিস্থাপনটি আপনার ফাইল থেকে পেছনের নতুন লাইনগুলি সরিয়ে ফেলবে))
আমার ইন্টারেক্টিভ ডে-টু-ডে গিটিংয়ের জন্য (যেখানে আমি সারাক্ষণ হেডের বিপরীতে ওয়ার্কিং ট্রিকে পৃথক করি এবং তার চিহ্ন ছাড়াই থাকা ফাইলগুলি ডিফের মধ্যে অন্তর্ভুক্ত রাখতে চাই) অকার্যকর add -N/--intent-to-add
, কারণ এটি ভেঙে যায় git stash
।
সুতরাং এখানে আমার git diff
প্রতিস্থাপন। এটি কোনও বিশেষ সমাধান নয়, তবে যেহেতু আমি সত্যিই এটি কেবল ইন্টারেক্টিভভাবে ব্যবহার করি, তাই আমি একটি হ্যাকের সাথে ঠিক আছি:
d() {
if test "$#" = 0; then
(
git diff --color
git ls-files --others --exclude-standard |
while read -r i; do git diff --color -- /dev/null "$i"; done
) | `git config --get core.pager`
else
git diff "$@"
fi
}
কেবল টাইপিংয়ের d
মধ্যে পৃথকবিহীন ফাইলগুলি অন্তর্ভুক্ত থাকবে (যা আমি আমার ওয়ার্কফ্লোতে যত্ন করি) এবং নিয়মিতর d args...
মতো আচরণ করবে git diff
।
মন্তব্য:
git diff
যা প্রকৃতপক্ষে কেবল পৃথক পৃথক পৃথকভাবে জড়িত, সুতরাং d
"সত্যিকারের ডিফ" থেকে আউটপুটটি বলা সম্ভব নয় - সমস্ত চিহ্নবিহীন ফাইল শেষভাবে সাজানো হয়েছে তা বাদে।git diff
। কেউ যদি কীভাবে এটি করতে পারে তা নির্ধারণ করে, বা git
ভবিষ্যতে কোনও সময়ে যদি কোনও বৈশিষ্ট্য যুক্ত হয় তবে দয়া করে এখানে একটি নোট রেখে দিন!git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
কৌতুকজনকভাবে , আমি পুরানো গিটগুলির জন্য প্রস্তাবিত আমার কাজের সাথে কাজ করে git stash
, ধরে নিই যে আপনি ইতিমধ্যে আপনার ডিবিতে e69de29bb পেয়েছেন, যেমন add -N
আগে ব্যবহারের চেষ্টা করে । সুতরাং স্পষ্টতই এটি git add -N
কোনও উপায়ে একেবারে সমতুল্য নয় : টিবিএইচ আমি নিশ্চিত না যে কীভাবে not
test
, আপনার কমান্ডের সাথে সংখ্যাগত সমতা পরীক্ষা করার পরিবর্তে স্ট্রিং তুলনা করছেন । কোনও কিছুর উপর প্রভাব ফেলবে না, তবে test "$#" -eq 0
এটির উদ্দেশ্য কী।
less
যাতে আপনার q
প্রতিটি ফাইলের জন্য চাপতে হবে না এবং git diff
প্রতি ফাইলের পৃষ্ঠাগুলি ( -P
) মুছে ফেলার পরে ঠিক এটির মতো অনুভূত হয় , এটি পরে যুক্ত করে ( | less
), রঙ সংরক্ষণ করে ( --color=always
) এবং রঙ ( less -r
বা less -R
) হিসাবে এটি ব্যাখ্যা করে । সুতরাং সামগ্রিকভাবে এটি:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
( if [ -t 1 ]; then color_arg=--color; fi
যা উদাহরণস্বরূপ বা কোনও কিছু) রঙিন বিষয়ে সিদ্ধান্ত নেওয়ার জন্য একটি দরকারী উপায়। এবং xargs
সময় লুপ থেকে মুক্তি পেতে একটি উপায় দিতে পারে। আপনার এখনও -n 1
এটির প্রয়োজন হবে, সুতরাং এটি এখনও বেশ কয়েকগুণ গিট চালু করবে, এবং এখনও সেভাবে জোড়া লাগানো দরকার, তবে ... এটি পরিত্রাণ পায় while
এবং read
সম্ভবত এটি আরও ভাল?!? আমি পাঠকের কাছে রেখেছি।
100% বিন্দুতে নয়, তবে কোনও কারণে যদি আপনি গ্রহণযোগ্য উত্তর দ্বারা প্রস্তাবিত হিসাবে সূচিগুলিতে আপনার ফাইলগুলি যুক্ত করতে না চান তবে এখানে অন্য একটি বিকল্প রয়েছে:
ফাইলগুলি যদি ট্রেড না করা থাকে তবে স্পষ্টতই সম্পূর্ণ ফাইলটি আলাদা হয়, তাই আপনি কেবল এগুলি কম দিয়ে দেখতে পারেন:
less $(git ls-files --others --exclude-standard)
তাদের মধ্যে নেভিগেট :n
এবং :p
পরবর্তী এবং পূর্ববর্তী জন্য ..
মন্তব্যগুলি থেকে আপডেট করুন: আপনার যদি কোনও প্যাচ ফর্ম্যাট প্রয়োজন হয় তবে আপনি এটি এর সাথেও একত্র করতে পারেন git diff
:
git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less
আপনি আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করতে পারেন বা এই ক্ষেত্রে অন্য ডিফ কমান্ডটি ব্যবহার করতে পারেন।
git diff /dev/null <untracked_tile>
কেবল "কেবল" একটি ফাইলের চেয়ে প্যাচ ফর্ম্যাটে প্যাচটি চালাতে এবং পেতে পারেন
git add -A
git diff HEAD
প্রয়োজনে প্যাচ তৈরি করুন এবং তারপরে:
git reset HEAD
git add -p
খুব ঘন ঘন ব্যবহার করে (যা আমি সাধারণত প্রস্তাব করি, তবে) ... এটি মৌলিক কাজটি করার একটি উপায় দেয়, কেবল ... এটি লক্ষ করা উচিত যে এটির অবাঞ্ছিত পক্ষের সম্ভাবনা রয়েছে প্রভাব.
এটি আমার পক্ষে কাজ করে:
git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt
শেষ পদক্ষেপটি isচ্ছিক, এটি ফাইলটি আগের অবস্থায় ছেড়ে দেবে (চিহ্নবিহীন)
দরকারী যদি আপনি খুব প্যাচ তৈরি করে থাকেন:
git diff --cached my_file.txt > my_file-patch.patch
এই কমান্ডটি নিয়ে মঞ্চস্থ ও মঞ্চস্থ না হলে পরিবর্তনগুলি কাজ করে। মঞ্চস্থ হলে নতুন ফাইলগুলি কাজ করে:
$ git diff HEAD
যদি তাদের মঞ্চস্থ না করা হয় তবে আপনি কেবল ফাইলের পার্থক্য দেখতে পাবেন।
git add
প্রতিটি ট্র্যাকড ফাইল থেকে এটির প্রয়োজন
git add
করেন তবে আপনার ব্যবহারের ক্ষেত্রে আপনি কী যুক্ত করেছেন / কী যুক্ত করতে চান তা যাচাই করা যদি আপনার ব্যবহারের
একটি ফাইলের জন্য:
git diff --no-index /dev/null new_file
সমস্ত নতুন ফাইলের জন্য:
for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;
ওরফে হিসাবে:
alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"
সমস্ত কমান্ড হিসাবে সংশোধিত এবং নতুন ফাইলের জন্য:
{ git --no-pager diff; gdnew }
সাধারণত যখন আমি দূরবর্তী অবস্থানের দলগুলির সাথে কাজ করি তবে আমার পক্ষে এটি গুরুত্বপূর্ণ যে আমি আগে থেকেই একই ফাইলের অন্যান্য দলগুলির দ্বারা কী পরিবর্তন ঘটেছিল তা আগেই আমার জানা উচিত, আমি গিট স্টেজগুলি আনট্র্যাক -> স্টেজড -> কমিট করার জন্য প্রতিশ্রুতিবদ্ধ যে আমি একটি বাশ স্ক্রিপ্ট লিখেছিলাম যা আমাকে অপ্রয়োজনীয় সমাধান দূরবর্তী টিমের সাথে সংযুক্ত সংঘাত এড়াতে বা নতুন স্থানীয় শাখা তৈরি করতে এবং মূল শাখায় তুলনা এবং একীভূত করতে সহায়তা করুন
#set -x
branchname=`git branch | grep -F '*' | awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{print $2}" `
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file
git difftool FETCH_HEAD $file ;
done
উপরের স্ক্রিপ্টে আমি দূরবর্তী প্রধান শাখা (তার প্রধান শাখার প্রয়োজন নেই) এড়াতে FETCH_HEAD এগুলি কেবল আমার পরিবর্তিত ফাইলের একটি তালিকা তৈরি করে এবং পরিবর্তিত ফাইলগুলিকে গিট ডিফ্টোওলের সাথে তুলনা করে
এখানে গিট দ্বারা সমর্থিত অনেক ডিফ্টল রয়েছে, আমি ভাল জিইউআই তুলনার জন্য 'মেল্ড ডিফ ভিউয়ার' কনফিগার করি।
ধরে নিই যে আপনার কাছে স্থানীয় কমিটগুলি নেই,
git diff origin/master
git diff
এমন একটি কমান্ডের জন্য জিজ্ঞাসা করে যাতে এতে তালাবিহীন ফাইল অন্তর্ভুক্ত থাকে। এই আদেশ তাদের অন্তর্ভুক্ত করে না। এছাড়াও, স্থানীয় কমিটগুলি উপস্থিত রয়েছে কি না, এই প্রশ্নের সাথে একেবারে কোনও যোগসূত্র নেই।
git merge --squash mybranch
, এবং git diff master
আমাকে তালিকাভুক্ত ফাইলগুলিতে পরিবর্তনগুলি দেখিয়েছি।
git diff
চিহ্নযুক্ত ফাইলগুলিতে পার্থক্য দেখায় না: কারণ তারা সনাক্ত না করে সংজ্ঞা অনুসারে কোনও পার্থক্য দেখা যায় না। গিট কাজ করার উপায় এটি। :)