আমি কি তালাবিহীন ফাইলগুলিতে গিট ডিফ ব্যবহার করতে পারি?


270

গিট ডিফ থেকে তার বিযুক্ত আউটপুটে অন্রে্যাকড ফাইলগুলি অন্তর্ভুক্ত করার জন্য জিজ্ঞাসা করা সম্ভব? বা আমার তৈরি নতুন ফাইল এবং আমি সম্পাদিত বিদ্যমান ফাইলগুলিকে যুক্ত করতে এবং যুক্ত করতে আমার সেরা বাজি

git diff --cached

?

উত্তর:


267

সাম্প্রতিক গিট সংস্করণগুলির সাহায্যে আপনি 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

(এখানে একটি উপনাম স্থাপন করা আপনার বন্ধু)


দেখা যাচ্ছে যে আমার গিতের অনুলিপিটি অ্যাড-এন যুক্ত করার পক্ষে সাম্প্রতিক নয়, তবে এটি আমার প্রশ্নের উত্তর দেয়।
অ্যান্ড্রু গ্রিম

1
আপনি "গিট অ্যাড-এন new.txt" "গিট আপডেট-ইনডেক্স - এডিডি - কেচেইনফো 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt" দিয়ে অনুকরণ করতে পারেন "(আমি কীভাবে ভুল উত্তরের জন্য এটি পরিচালনা করতে পারি?)
আরাকনিড

বৈশিষ্ট্যটি 1.6.1 এ যুক্ত হয়েছে: github.com/git/git/blob/master/Docamentation/RelNotes/1.6.1.txt
এইচ

1
আপনার যদি অনেক নতুন ফাইল থাকে তবে সেগুলি যুক্ত করার এবং তারপরে পৃথক করার কোনও সহজ উপায় আছে কি?
ভিক

1
@ ভিকgit add -N .
নাথান

92

আমি বিশ্বাস করি যে আপনি কেবল উভয় ফাইলের পথ সরবরাহ করে আপনার সূচী এবং আনক্র্যাকড ফাইলগুলির মধ্যে ফাইলগুলির মধ্যে পার্থক্য করতে পারেন।

git diff --no-index tracked_file untracked_file

3
আপনি যদি প্রতিশ্রুতিবদ্ধ হওয়ার পরে তৈরি করেছেন এমন একাধিক অবিরত ফাইল থাকতে পারে তবে তা কি কাজ করবে?
অ্যান্ড্রু গ্রিম

12
হ্যাঁ, নিখুঁত উত্তর! আমি তারপরে বিভিন্ন সংশ্লেষে সুন্দর বাক্য গঠন ইত্যাদি ব্যবহার git diff --no-index untracked_file_1 untracked_file_2করতে পারি git diff... সুন্দর।
কলিন ডি বেনেট

40
আপনি কেন একটি সম্পর্কযুক্ত আন- ট্র্যাক করা ফাইলের সাথে একটি ট্র্যাক করা ফাইলের তুলনা করছেন তা আমি বুঝতে পারি না আপনি শুধু untracked ফাইলের জন্য পরিবর্তন আউটপুট পেতে চেয়েছিলেন, তাহলে ব্যবহার করতে পারেন /dev/nullপরিবর্তে: git diff --no-index -- /dev/null <untracked_file>

4
অথবা ন্যায়সঙ্গত cat untracked_file_1, বা সম্ভবত আপনার printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"যদি সত্যিই সবুজ আউটপুট প্রয়োজন। :) (যদিও আরও গুরুতর নোটের পরেও, দয়া করে নোট করুন যে কমান্ড প্রতিস্থাপনটি আপনার ফাইল থেকে পেছনের নতুন লাইনগুলি সরিয়ে ফেলবে))
ওয়াইল্ডকার্ড

8
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত - এর জন্য গিটের সূচক পরিবর্তনের প্রয়োজন হয় না; যা মূল লেখক বলেছেন, এর খারাপ দিক রয়েছে
DIMMSum

38

আমার ইন্টারেক্টিভ ডে-টু-ডে গিটিংয়ের জন্য (যেখানে আমি সারাক্ষণ হেডের বিপরীতে ওয়ার্কিং ট্রিকে পৃথক করি এবং তার চিহ্ন ছাড়াই থাকা ফাইলগুলি ডিফের মধ্যে অন্তর্ভুক্ত রাখতে চাই) অকার্যকর 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ভবিষ্যতে কোনও সময়ে যদি কোনও বৈশিষ্ট্য যুক্ত হয় তবে দয়া করে এখানে একটি নোট রেখে দিন!

4
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txtকৌতুকজনকভাবে , আমি পুরানো গিটগুলির জন্য প্রস্তাবিত আমার কাজের সাথে কাজ করে git stash, ধরে নিই যে আপনি ইতিমধ্যে আপনার ডিবিতে e69de29bb পেয়েছেন, যেমন add -Nআগে ব্যবহারের চেষ্টা করে । সুতরাং স্পষ্টতই এটি git add -Nকোনও উপায়ে একেবারে সমতুল্য নয় : টিবিএইচ আমি নিশ্চিত না যে কীভাবে not
আরাকনিড

2
আপনি যাইহোক test, আপনার কমান্ডের সাথে সংখ্যাগত সমতা পরীক্ষা করার পরিবর্তে স্ট্রিং তুলনা করছেন । কোনও কিছুর উপর প্রভাব ফেলবে না, তবে test "$#" -eq 0এটির উদ্দেশ্য কী।
ওয়াইল্ডকার্ড

1
হ্যাঁ, এটি এখনও আপনার জোড়া লাগার মতো দেখে মনে হচ্ছে ... তবে এটি একটি জাল করে তুলতে পারে 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সম্ভবত এটি আরও ভাল?!? আমি পাঠকের কাছে রেখেছি।
লিন্ডেস

28

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

আপনি আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করতে পারেন বা এই ক্ষেত্রে অন্য ডিফ কমান্ডটি ব্যবহার করতে পারেন।


6
আপনি git diff /dev/null <untracked_tile>কেবল "কেবল" একটি ফাইলের চেয়ে প্যাচ ফর্ম্যাটে প্যাচটি চালাতে এবং পেতে পারেন
সিমসিমওয়াই

2
গিট ডিফের সাথে মিলিত এই উত্তরটি নিখুঁত সমাধান।
iwind

22
git add -A
git diff HEAD

প্রয়োজনে প্যাচ তৈরি করুন এবং তারপরে:

git reset HEAD

এতে সমস্ত কিছু যুক্ত করে পূর্ব (প্রাক) কাজ হারাতে পারে। বিশেষত ক্ষেত্রে যদি কেউ git add -pখুব ঘন ঘন ব্যবহার করে (যা আমি সাধারণত প্রস্তাব করি, তবে) ... এটি মৌলিক কাজটি করার একটি উপায় দেয়, কেবল ... এটি লক্ষ করা উচিত যে এটির অবাঞ্ছিত পক্ষের সম্ভাবনা রয়েছে প্রভাব.
লিন্ডেস

13

এটি আমার পক্ষে কাজ করে:

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

এই অ্যাড / রিসেট পেয়ারের বৈশিষ্ট্যটি স্ট্যাকওভারফ্লো . com /a/ 50486906 / 313756 এর শটগান পদ্ধতির একটি দুর্দান্ত বিপরীতে ... এর জন্য ধন্যবাদ।
লিন্ডেস

9

এই কমান্ডটি নিয়ে মঞ্চস্থ ও মঞ্চস্থ না হলে পরিবর্তনগুলি কাজ করে। মঞ্চস্থ হলে নতুন ফাইলগুলি কাজ করে:

$ git diff HEAD

যদি তাদের মঞ্চস্থ না করা হয় তবে আপনি কেবল ফাইলের পার্থক্য দেখতে পাবেন।


26
HEADহয় ডিফল্ট মান তাই এই একই হিসাবে, git diffযা সমস্যা সমাধানের নেই।
Iulian Onofrei

4
git addপ্রতিটি ট্র্যাকড ফাইল থেকে এটির প্রয়োজন
সিলভিওকিউ

আপনি যদি এই উত্তরটি অন্তর্ভুক্ত করার জন্য সম্পাদনা git addকরেন তবে আপনার ব্যবহারের ক্ষেত্রে আপনি কী যুক্ত করেছেন / কী যুক্ত করতে চান তা যাচাই করা যদি আপনার ব্যবহারের
কেসটি সহজ হয়

8

একটি ফাইলের জন্য:

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 }

2

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

#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 এগুলি কেবল আমার পরিবর্তিত ফাইলের একটি তালিকা তৈরি করে এবং পরিবর্তিত ফাইলগুলিকে গিট ডিফ্টোওলের সাথে তুলনা করে

এখানে গিট দ্বারা সমর্থিত অনেক ডিফ্টল রয়েছে, আমি ভাল জিইউআই তুলনার জন্য 'মেল্ড ডিফ ভিউয়ার' কনফিগার করি।


-9

ধরে নিই যে আপনার কাছে স্থানীয় কমিটগুলি নেই,

git diff origin/master

8
প্রশ্নটি git diffএমন একটি কমান্ডের জন্য জিজ্ঞাসা করে যাতে এতে তালাবিহীন ফাইল অন্তর্ভুক্ত থাকে। এই আদেশ তাদের অন্তর্ভুক্ত করে না। এছাড়াও, স্থানীয় কমিটগুলি উপস্থিত রয়েছে কি না, এই প্রশ্নের সাথে একেবারে কোনও যোগসূত্র নেই।
toon81

জেএফটিআর, আমি git merge --squash mybranch, এবং git diff masterআমাকে তালিকাভুক্ত ফাইলগুলিতে পরিবর্তনগুলি দেখিয়েছি।
muammar

2
সেটা অসম্ভব. "আনট্র্যাকড" অর্থ কী তা সম্পর্কে আপনি বিভ্রান্ত বলে মনে হচ্ছে। আনট্রাকডের অর্থ এই নয় যে কোনও ফাইল একটি শাখায় ট্র্যাক করা হয়েছে এবং অন্য নয়, এর অর্থ এটি কোনও উপায়ে কোথাও "গিট" নয়। আপনি স্কোয়াশ বা না কোনও পার্থক্য নেই। git diffচিহ্নযুক্ত ফাইলগুলিতে পার্থক্য দেখায় না: কারণ তারা সনাক্ত না করে সংজ্ঞা অনুসারে কোনও পার্থক্য দেখা যায় না। গিট কাজ করার উপায় এটি। :)
toon81
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.