उन सभी फ़ाइलों को प्राप्त करें जिन्हें गिट शाखा में संशोधित किया गया है


209

क्या यह देखने का कोई तरीका है कि किसी शाखा में क्या फाइलें बदल गई हैं?



2
वे मेरे कर्मचारी नहीं हैं वे मेरे सहकर्मी हैं और यह उन्हें विशेष रूप से इतना नहीं है जितना सामान्य रूप से लोग। लेकिन हाँ, इस पोस्ट को फिर से पढ़ना यह थोड़ा कृषि लगता है। :)
रायफ़

3
क्या आप जीथब या बिटबकेट, गिटलैब का उपयोग कर सकते हैं? इस स्थिति को ठीक से प्रबंधित करने के लिए उपकरण हैं। डेवलपर एक पुल अनुरोध करता है। आपको अनुरोध मिलता है और आपके पास बहुत अच्छे इंटरफ़ेस तक पहुंच होगी जो आपको प्रत्येक फ़ाइल में किए गए सभी परिवर्तनों का एक हिस्सा दिखाएगा। आप टिप्पणी, परिवर्तन के लिए पूछ सकते हैं आदि जब परिवर्तन अच्छे होते हैं तो आप उस अनुरोध को स्वीकार कर सकते हैं जो परिवर्तनों को अनुरोधित शाखा (आमतौर पर) में विलय कर देगा। इस स्थिति को संभालने का सबसे अच्छा अभ्यास तरीका है।
स्कॉट राइट

जवाबों:


167

@Marco Ponti द्वारा उत्तर के लिए एक विकल्प, और चेकआउट से परहेज:

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

यदि आपका विशेष शेल $ () निर्माण को नहीं समझता है, तो इसके बजाय बैक-टिक का उपयोग करें।


1
आह! यह अच्छा है, अब मैं कैसे कहूं कि मैं चाहता हूं कि <NotMainDev> मैं वर्तमान शाखा हूं। यह निर्दिष्ट करने के लिए नहीं है?
Raif

29
git diff --name-only <some-other-branch>आपको बताएंगे कि क्या फ़ाइलें अपने वर्तमान शाखा और के बीच अलग-अलग हैं <some-other-branch>। तो यह अनिवार्य रूप से एक ही कमांड है, लेकिन ध्यान दें कि आप इसका उपयोग उन फ़ाइलों को खोजने के लिए कर सकते हैं जो किसी भी दो शाखाओं के बीच भिन्न हैं , भले ही वे दूरस्थ रूप से संबंधित न हों। वह तुलना उपयोगी है या नहीं, यह आपकी शाखाओं की टोपोलॉजी पर निर्भर करता है ... इसके अलावा, ध्यान दें कि <some-other-branch>वास्तव में कोई भी कमिटमेंट हो सकता है, या कुछ भी जो किसी एक (टैग्स, आदि) को हल करता है।
ट्वालबर्ग

हम्म, ठीक है, मुझे लगता है कि मेरा क्या मतलब है कि मैं git diff-name-only <notMainDev> $ (git मर्ज-बेस <notMainDev> <MY_CURRENT_CO_BRANCH>) जहां MY_CURRENT_CO_BRANCH निश्चित रूप से मेरी वर्तमान जांच की गई शाखा होगी
Raif

आप ऐसा कर सकते हैं, साथ ही। यह उस बिंदु को खोजेगा जहां <notMainDev>और <MY_CURRENT_CO_BRANCH>हाल ही में एक सामान्य पूर्वज था, और <notMainDev>उस पूर्वज की तुलना करता है। आपको अपना वर्तमान शाखा नाम प्रदान करना होगा, हालांकि, git merge-baseदो तर्कों की अपेक्षा है - कम से कम वर्तमान संस्करण में कोई शॉर्टकट नहीं है।
ट्वालबर्ग

1
ठीक है! मैं समझ गया। मेरे सहकर्मी के सौजन्य से उसका नाम क्या है git मर्ज-बेस <notMainDev> git branch | grep '\*' | awk '{print $2}' जो <notMainDev> और मेरी वर्तमान शाखा के बीच शाखा के लिए प्रतिबद्ध होगा। फिर मैं git diff --name-only <notMainDev> $ (git मर्ज-बेस <notMainDev> git branch | grep '\*' | awk '{print $2}') कर सकता हूं
Raif

147

आपको बस इतना करना है:

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

यह आपको केवल फ़ाइल नाम दिखाएगा जो दोनों शाखाओं के बीच भिन्न हैं।


वाह जल्दी और बात भी। धन्यवाद। btw मुझे गिट पसंद है। यह हमेशा जल्दी हो जाता है और बात करने के लिए
Raif

23
मेरा मानना ​​है कि उन सामानों को भी दिखाया जाएगा <mainDev>, जो शाखाओं में बदल जाने के बाद से बदल गए हैं। आप git diff --name-only <sha-of-branch-point>इसके बजाय उपयोग करना चाहते हैं , या वैकल्पिक उत्तर देख सकते हैं जो मैंने पोस्ट किया था जो चेकआउट से बचता है।

हाँ, यह सच है @twalberg यह उन बदलावों को दिखाएगा यदि शाखाओं को मोड़ दिया जाता है। मैं मान रहा था कि notMainDevमेनडेव कमिट के साथ डेट तक रखी जाएगी ... मैं आमतौर पर उन मतभेदों को देखने के लिए उपयोगी होता हूं।
मार्को पोंटी

क्या आप केवल निर्दिष्ट नहीं कर सकते - केवल-केवल उन फ़ाइलों को दिखाने के लिए जो दाईं ओर बदली गई थीं?
द ज़ेनकर

आपको मिल <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
फिर इसमें केवल -नाम-ध्वज जोड़ें। or --short-stat
एक्ससुम

2
git diff --name-only master..यदि आप केवल उन फ़ाइलों के नाम चाहते हैं जो दो शाखाओं के बीच भिन्न हैं।
एडम

1
यदि आपने अपना साइड-ब्रांच बनाया है तो यह ठीक से काम नहीं करेगा।
बस

2
@simplylizz हाँ यह करता है। thats बिल्कुल क्या इस सुलझाने है
exussum

45

मुझे विश्वास नहीं होता कि ऐसा करने के बहुत सारे तरीके हैं। मैं व्हाट्सएप का उपयोग किसी के रूप में पोस्ट करने से पहले करता हूं, बस निम्नलिखित तर्कों के साथ:

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

यह केवल फ़ाइल नाम, और केवल उन लोगों को सूचीबद्ध करता है जो वर्तमान शाखा में बदल गए हैं।


3
यह यहाँ सबसे आसान उत्तर प्रतीत होता है क्योंकि इसमें किसी अतिरिक्त जानकारी की आवश्यकता नहीं होती है। आउटपुट सही दिखता है और स्वीकृत उत्तर की तुलना में इसे याद रखना आसान होता है!
रिकमेशम

1
धन्यवाद, यह दिलचस्प है, अधिक चिंताजनक है। यह रिवर्स ऑर्डर में आउटपुट फ्रॉम प्रत्येक कमिट प्रदान करता है। git-whatchanged - प्रत्येक प्रतिबद्ध के अंतर के साथ लॉग दिखाएं git-scm.com/docs/git-whatchanged
nealmcb

से 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 डॉट्स हैं)। यह समझने के लिए कि डॉट्स का क्या अर्थ है, इस उत्तर को
Yep_It's_Me

बहुत बढ़िया! त्वरित उत्तर और अंतर्दृष्टि के लिए धन्यवाद। बहुत सराहना की।
भूख 19

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

जिस से हम तुलना करना चाहते हैं।


एक मौजूदा जवाब के एक हिस्से की तरह लगता है, stackoverflow.com/a/41486181/11912
जेम्स स्कीप

यह भिन्नता गुरु के HEAD की तुलना एक वर्तमान शाखा से करती है। स्वीकृत उत्तर आपके द्वारा बताए गए बिंदु पर मास्टर की स्थिति की तुलना करता है । या तो आपके पास वह उत्तर हो सकता है, जिसे आप जानना चाहते हैं, जो आप जानना चाहते हैं।
मार्क स्टोसबर्ग

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

@Twalberg और @iconoclast ने जो किया, उसका विस्तार करते हुए, यदि आप किसी भी कारण से cmd का उपयोग कर रहे हैं, तो आप इसका उपयोग कर सकते हैं:

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

निम्न बैच फ़ाइल Twalberg के उत्तर पर आधारित है, लेकिन विंडोज में काम करेगी:

@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 का उपयोग करता हूं इसलिए मुझे केवल diff --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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.