গিট শাখায় পরিবর্তিত সমস্ত ফাইল পান


208

কোন শাখায় ফাইলগুলি পরিবর্তিত হয়েছে তা দেখার কোনও উপায় আছে কি?



2
তারা আমার কর্মচারী নয় তারা আমার সহকর্মী এবং এটি সাধারণভাবে সাধারণ মানুষের মতো বিশেষত তাদের নয়। তবে হ্যাঁ, এই পোস্টটি পুনরায় পড়ার জন্য এটি কিছুটা কৃষি বলে মনে হচ্ছে। :)
রাইফ

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

উত্তর:


166

@ মার্কো পন্টির উত্তরের বিকল্প, এবং চেকআউট এড়ানো:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

যদি আপনার নির্দিষ্ট শেলটি $ () নির্মাণ বুঝতে না পারে তবে তার পরিবর্তে ব্যাক-টিক ব্যবহার করুন।


1
আহ! এটি বেশ মজাদার, এখন <নটমেনডেভ> আমি যে বর্তমান শাখা চালু করছি তা যদি বলতে চাই তবে কীভাবে হয়। এটি নির্দিষ্ট করতে হবে না?
রাইফ

29
git diff --name-only <some-other-branch>আপনার বর্তমান শাখা এবং এর মধ্যে ফাইলগুলি কী আলাদা তা আপনাকে দেখাবে <some-other-branch>। সুতরাং এটি মূলত একই কমান্ড, তবে দ্রষ্টব্য যে আপনি যে কোনও দুটি শাখার মধ্যে পৃথক পৃথক পৃথক ফাইলগুলি সন্ধানের জন্য এটি ব্যবহার করতে পারেন , এমনকি সেগুলি দূরবর্তীভাবে সম্পর্কিত না হলেও। সেই তুলনাটি কার্যকর কিনা বা তা আপনার শাখাগুলির টপোলজির উপর নির্ভর করে ... এছাড়াও, দ্রষ্টব্য <some-other-branch>সত্যই আদৌ কোনও প্রতিশ্রুতিবদ্ধ হতে পারে, বা যে কোনওটির সমাধান (ট্যাগস ইত্যাদি) হতে পারে।
টওয়ালবার্গ

হুম, ঠিক আছে, আমি অনুমান করি আমার অর্থ হ'ল আমি গিট ডিফ করতে চাই - নাম-কেবল <নট মেনদেভ> $ (গিট মার্জ-বেস <নটমেনডিভ> <MY_CURRENT_CO_BRANCH>) যেখানে MY_CURRENT_CO_BRANCH অবশ্যই আমার বর্তমান পরীক্ষিত শাখা হবে
রাইফ

আপনি এটি করতে পারেন, পাশাপাশি। এটি সেই পয়েন্টটি খুঁজে পাবে যেখানে <notMainDev>এবং <MY_CURRENT_CO_BRANCH>সম্প্রতি একটি সাধারণ পূর্বপুরুষ ছিল এবং <notMainDev>সেই পূর্বপুরুষের সাথে তুলনা করে। আপনাকে আপনার বর্তমান শাখার নাম সরবরাহ করতে হবে, যদিও git merge-baseদুটি আর্গুমেন্টের প্রত্যাশা হিসাবে - কমপক্ষে বর্তমান সংস্করণে একটি শর্টকাট নেই।
টওয়ালবার্গ

1
ঠিক আছে! আমি বুঝতে পেরেছি. সৌজন্যে আমার সহকর্মীর নাম কী তার। গিট একীভূত বেস <নোটমেনডেভ> git branch | grep '\*' | awk '{print $2}' যা <নোটমেনডিভ> এবং আমার বর্তমান শাখার মধ্যে শাখার জন্য প্রতিশ্রুতি পাবে। আমি তখন গিট ডিফ করতে পারি - নাম-কেবলমাত্র <নোটমেনডেভ> $ (গিট মার্জ-বেস <নট মেইনডেভ> git branch | grep '\*' | awk '{print $2}')
রাইফ

147

আপনাকে যা করতে হবে তা হ'ল:

git checkout <notMainDev>
git diff --name-only <mainDev>

এটি আপনাকে কেবলমাত্র দুটি ফাইল শাখার মধ্যে থাকা ফাইলের নামগুলি দেখায়।


বাহ দ্রুত এবং খুব বিন্দু। ধন্যবাদ. বিটিডব্লিউ আমি গিট পছন্দ করি। এটি সর্বদা দ্রুত এবং বিন্দুতে
রাইফ

23
যদিও আমি বিশ্বাস করি যে <mainDev>শাখাগুলি হ'ল, যেহেতু পরিবর্তিত হয়েছে এমন স্টাফগুলিও প্রদর্শন করবে । git diff --name-only <sha-of-branch-point>পরিবর্তে আপনি ব্যবহার করতে চাইতে পারেন , বা আমার পোস্ট করা বিকল্প উত্তর দেখুন যা চেকআউটটি এড়িয়ে চলে।
twalberg

হ্যাঁ, এটি সত্য যে @ ওয়ালবার্গ শাখাগুলি অন্যদিকে সরানো থাকলে এটি সেই পরিবর্তনগুলি দেখায়। আমি notMainDevধরেই নিয়েছিলাম যে মেইনডেভ কমিটস এর সাথে আপ টু ডেট থাকবে ... যদিও সাধারণত এই পার্থক্যগুলি দেখতে আমি দরকারী মনে করি।
মার্কো পন্টি

আপনি কেবল - ডানদিকে পরিবর্তন করা ফাইলগুলি দেখানোর জন্য - ঠিক-কেবল নির্দিষ্ট করতে পারবেন না?
TheZenker

আপনি পেতে <sha-of-branch-point>দিয়েgit rev-parse <branch-name>
fc9.30

69

এখনও অবাক হয়ে বলা হয়নি!

git diff master...branch

সুতরাং পরিবর্তনগুলি কেবলমাত্র দেখুন branch

বর্তমান শাখার ব্যবহার পরীক্ষা করতে

git diff master...

ধন্যবাদ jqr

এটি সংক্ষিপ্ত হাত

git diff $(git merge-base master branch) branch

সুতরাং মার্জ বেস (শাখাগুলির মধ্যে সর্বাধিক সাধারণ প্রতিশ্রুতি) এবং শাখা টিপ

এছাড়াও কেবলমাত্র মাস্টারের পরিবর্তে উত্স / মাস্টার ব্যবহার আপনার স্থানীয় মাস্টারটির তারিখপ্রাপ্ত হওয়ার ক্ষেত্রে সহায়তা করবে


4
এটি কী পরিবর্তিত হয়েছে তা দেখায়, পরিবর্তিত ফাইলগুলির সংক্ষিপ্তসারের চেয়ে এটি সমস্ত পরিবর্তন দেখায় ... যা আমাকে এই পৃষ্ঠায় প্রথম স্থানে নিয়ে যায় :)
ক্রিস রুটলেজ

1
তারপরে এটিতে কেবলমাত্র নাম নামটি যুক্ত করুন। বা
এক্সসাম করুন

2
git diff --name-only master..আপনি যদি কেবল দুটি শাখার মধ্যে পৃথক ফাইলগুলির নাম চান want
আদম

1
আপনি আপনার পাশের শাখা তৈরির পরে যদি আপনার মাস্টার কমিট করে তবে এটি সঠিকভাবে কাজ করবে না।
সহজলিজি

2
@ সিম্প্লিলিজ হ্যাঁ এটি করে। এটি ঠিক কী সমাধান করছে
10

45

আমি বিশ্বাস করতে পারি না এটি করার অনেকগুলি উপায় আছে। আমি কেবল নিম্নলিখিত যুক্তি দিয়ে আগে কেউ পোস্ট করা হিসাবে কী পরিবর্তন হয়েছিল তা ব্যবহার করি:

git whatchanged --name-only --pretty="" origin..HEAD

এটি কেবল ফাইলের নামগুলি এবং বর্তমান শাখায় পরিবর্তিত কেবলমাত্র তালিকাভুক্ত করে।


3
এটি এখানে সবচেয়ে সহজ উত্তর বলে মনে হচ্ছে কারণ এতে কোনও অতিরিক্ত তথ্যের প্রয়োজন নেই। আউটপুটটি সঠিক দেখাচ্ছে এবং এটি গ্রহণযোগ্য উত্তরের চেয়ে মনে রাখা সহজ!
রিকমিশাম

1
ধন্যবাদ, এটি আকর্ষণীয়, আরও কথামূলক। বিপরীত ক্রমে এটি প্রতিটি প্রতিশ্রুতি থেকে আউটপুট সরবরাহ করে। গিট-হোয়াঞ্জঞ্জড - প্রতিটি কমিট পার্থক্য সহ লগগুলি দেখান git-scm.com/docs/git- কি পরিবর্তন
নীলামকবি

থেকে Git ডক্স :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
ডেরেক এস

21

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

git diff --name-only $(git merge-base master HEAD)

1
আপনার সমাধানটি আমার পক্ষে কাজ করে এবং আমি যে ফাইলগুলি দেখি তার তালিকা পাই। আমি একজন গিটার আভিজাত্য এবং git diff master... --name-onlyলক্ষ্য শাখায় চালানোর সময় ব্যবহার করেছি এবং একই ফল পেয়েছি । আপনার উত্তর এবং আমি যে কমান্ড দিয়েছি তার মধ্যে ভাল বনাম খারাপের কোনও প্রতিক্রিয়া জানাতে কি আপনি এত দয়াবান হতে পারেন?
হাঙ্গারস্টার

আপনার কমান্ড হুবহু একইভাবে কাজ করবে, যদি আপনার শাখাটি তৈরি হওয়ার পরে মাস্টারের কোনও নতুন কমিট না হয়। আমি মনে করি যে আমার আদেশটি সমান হবে git diff master.. --name-only(দ্রষ্টব্য 3 এর পরিবর্তে কেবল 2 টি বিন্দু রয়েছে)। বিন্দুগুলির অর্থ বোঝার জন্য, এই উত্তরটি দেখুন
হ্যাঁ_ইপটিস_আর

অসাধারণ! দ্রুত উত্তর এবং অন্তর্দৃষ্টি জন্য ধন্যবাদ। অনেক প্রশংসিত.
হাঙ্গারস্টার

12

git whatchanged একটি ভাল বিকল্প বলে মনে হচ্ছে।


1
আমি ঠিক কি খুঁজছিলাম ছিল।
সিল্ড

থেকে Git ডক্স :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
ডেরেক এস

9
git diff --name-only master...branch-name

যা আমরা তুলনা করতে চান।


কোনও বিদ্যমান উত্তরের আংশিক বলে মনে হচ্ছে, স্ট্যাকওভারফ্লো.
com

এই প্রকরণটি একটি বর্তমান শাখার সাথে মাস্টার হেডের তুলনা করে। গৃহীত উত্তরটি আপনি যে মুহুর্তে লিখেছেন সেই স্থানে মাস্টারের অবস্থার তুলনা করে । আপনি যা জানতে চান তার উপর নির্ভর করে আপনি যে উত্তরটি সন্ধান করছেন তা হয়ত থাকতে পারে।
মার্ক স্টসবার্গ

8

যদি এটি এত সহজ হতে পারে?

git changed

আপনি যদি ধরে নিতে ইচ্ছুক হন যে মূল শাখাটিকে "মাস্টার" বলা হয় এবং আপনি মাস্টার থেকে আপনার অন্যান্য শাখা তৈরি করেন, তবে ~/.gitconfigএটি সহজ করার জন্য আপনি এই ফাইলটিকে নিজের ফাইলটিতে যুক্ত করতে পারেন:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

এই অনুমানগুলি বেশিরভাগ পরিস্থিতিতে বেশিরভাগ মানুষের পক্ষে কাজ করবে তবে আপনি অবশ্যই সে সম্পর্কে সচেতন হন।

এছাড়াও, আপনাকে অবশ্যই একটি শেল ব্যবহার করবে যা সমর্থন করে $()এটি খুব সম্ভবত আপনার শেল এটি সমর্থন করে


3
git show --stat origin/branch_name

এটি আপনাকে এই শাখার অধীনে যুক্ত করা বা সংশোধিত ফাইলগুলির একটি তালিকা দেবে।


2
এটি ভুল, এটি কেবলমাত্র শাখার প্রধান প্রতিশ্রুতিতে পরিবর্তিত ফাইলগুলি দেখায়, পুরো শাখাটি নয়।
ডেভিডটবার্নাল

2

কিছু কারণে কেউ উল্লেখ করেনি git-treeHttps://stackoverflow.com/a/424142/1657819 দেখুন

git-treeএটি পছন্দসই কারণ এটি একটি নদীর গভীরতানির্ণয় আদেশ; প্রোগ্রামেটিক (এবং, সম্ভবত, দ্রুত) বোঝানো হয়েছে

(ধারনা বেস শাখা হয় master)

git diff-tree --no-commit-id --name-only -r master..branch-name

তবে এটি আপনাকে শাখায় প্রভাবিত সমস্ত ফাইল দেখিয়ে দেবে, আপনি যদি কেবল স্পষ্টভাবে পরিবর্তিত ফাইলগুলি দেখতে চান তবে আপনি ব্যবহার করতে পারেন --diff-filter:

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

এছাড়াও ফাইলগুলির স্থিতি ( / / এবং আরও) দেখার --name-statusপরিবর্তে কেউ ব্যবহার করতে পারেন--name-onlyAMD


মুছে ফেলা ফাইলগুলি বাদ দিয়ে পরিবর্তিত ফাইলগুলিকে আবদ্ধ করার জন্য এটিই আমার প্রয়োজন ছিল। rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
হারলেম স্কুইরেল

1

গৃহীত উত্তর - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- খুব নিকটে, তবে আমি লক্ষ্য করেছি যে এটি মুছে ফেলার জন্য স্থিতিটি ভুল পেয়েছে । আমি একটি শাখায় একটি ফাইল যুক্ত করেছি এবং তবুও এই আদেশটি (ব্যবহার করে --name-status) আমি "এ" স্থিতি মুছে ফেলা ফাইলটি দিয়েছি এবং সেই ফাইলটি "ডি" স্থিতি যুক্ত করেছি।

পরিবর্তে আমাকে এই আদেশটি ব্যবহার করতে হয়েছিল:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)

0

@ টলবার্গ এবং @ আইকনোক্লাস্টের যা ছিল তা বাড়িয়ে দেওয়া, যদি আপনি যে কোনও কারণে সিএমডি ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন:

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y

0

নীচের ব্যাচ ফাইলটি টোভলবার্গের উত্তরের উপর ভিত্তি করে তবে উইন্ডোজটিতে কাজ করবে:

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

উপরেরটি ধরে নেওয়া হয়েছে যে মূল শাখাটি উত্স / মাস্টার এবং গিট ইনস্টল করার সময় সেই গিট ব্যাশ অন্তর্ভুক্ত ছিল (এবং এর অবস্থানটি পথের পরিবেশে রয়েছে)। কনফিগার করা ডিফ টুল (kdiff3) ব্যবহার করে আমার প্রকৃত পার্থক্যগুলি দেখানোর দরকার হয়েছিল যাতে উপরের নীচের ব্যাশ কমান্ডটি প্রতিস্থাপন করা হয়:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"

0

আমি ব্যবহার , grep তাই আমি শুধুমাত্র সঙ্গে লাইন পেতে পরিবর্তন --git যা ফাইল পাথ আছেন:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.