कैसे git लॉग शो फ़ाइल नाम जैसे svn log -v है


987

SVN के लॉग में एक "-v" मोड है जो प्रत्येक कमिट में बदली गई फाइलों के फाइलनाम को आउटपुट करता है, जैसे:

jes5199 $ svn लॉग -v
-------------------------------------------------- ----------------------
आर 1 | jes5199 | 2007-01-03 14:39:41 -0800 (बुध, 03 जनवरी 2007) | 1 पंक्ति
परिवर्तित पथ:
   A / AUTHORS
   क / नकल
   A / ChangeLog
   ए / ईवोल्यूशन
   A / INSTALL
   A / MacOSX

क्या जीआईटी में प्रत्येक प्रतिबद्ध में परिवर्तित फ़ाइलों की सूची प्राप्त करने का एक त्वरित तरीका है?


15
आश्चर्य है कि इतनी उम्मीद / चाहने जैसे स्विच का git logसमर्थन क्यों नहीं करता है -v? </
पकड़

जवाबों:


1528

परिवर्तित फ़ाइलों के पूर्ण पथ नामों के लिए:

git log --name-only

पूर्ण पथ नामों और परिवर्तित फ़ाइलों की स्थिति के लिए:

git log --name-status

संक्षिप्त पथनामों और परिवर्तित फ़ाइलों के अंतर के लिए:

git log --stat

बहुत अधिक विकल्प हैं, डॉक्स देखें


17
मैं उपयोग करता हूं git log --numstatgit help logअधिक विकल्पों के लिए देखें ।
ma11hew28

29
git log --name-only --onelineबहुत सुंदर है - प्रतिबद्ध के लिए एक रंगीन रेखा, और प्रति पंक्ति एक फ़ाइल। stackoverflow.com/a/14227496/1995714
cp.engr

4
2.7.3 git के साथ, मुझे इसके लिए इसका उपयोग करना पड़ा git log --name-status --find-renamesइसके अलावा + हटाई गई फ़ाइलों के बदले नामांकित फ़ाइलों को दिखाने के लिए।
सुजैन डुपरॉन

1
ध्यान दें कि --statलंबे रास्तों को संक्षिप्त करता है; चौड़ाई विन्यास योग्य है लेकिन लिपटे हिस्टोग्राम को पढ़ना मुश्किल है। अन्य प्रारूप जैसे --numstatहमेशा पूर्ण पथ मुद्रित करते हैं।
बेनी चेर्नियाव्स्की-पास्किन

@ ma11hew28 धन्यवाद --numstat2.22.00 के रूप में उस आदमी पृष्ठ की पंक्ति 946 पर है। यह एक है बहुत अधिक विकल्पों की तुलना में सबसे अधिक लोगों की जरूरत है।
मोनिका को पुनः स्थापित करें - एम। श्रोडर

139

नोट: पदावनत है, इसके बजाय का उपयोग करें git whatchangedgit log

नए उपयोगकर्ताओं को इसके बजाय git-log [1] का उपयोग करने के लिए प्रोत्साहित किया जाता है। whatchangedआदेश अनिवार्य रूप में ही है Git-लॉग [1] कच्चे प्रारूप diff उत्पादन को दिखाने के लिए और मर्ज के छोड़ लेकिन चूक।

कमांड को मुख्य रूप से ऐतिहासिक कारणों से रखा जाता है; git logलिनक्स कर्नेल मेलिंग सूची को पढ़कर बहुत पहले जिन लोगों ने Git सीखा था, उनकी उंगलियों को इसे टाइप करने के लिए प्रशिक्षित किया जाता है।


आप कमांड git whatchanged --statका उपयोग उन फ़ाइलों की एक सूची प्राप्त करने के लिए कर सकते हैं जो प्रत्येक कमिट (कमिट मैसेज के साथ) में बदल गईं।

संदर्भ


50

git show एक बेहतरीन कमांड भी है।

यह पसंद की तरह है svn diff, लेकिन आप इसे एक प्रतिबद्ध मार्गदर्शिका दे सकते हैं और उस अंतर को देख सकते हैं।


46

यदि आप फ़ाइल नाम केवल उस शेष संदेश के बिना प्राप्त करना चाहते हैं जिसका आप उपयोग कर सकते हैं:

git log --name-only --pretty=format: <branch name>

इसके बाद फ़ाइल नाम वाले विभिन्न विकल्पों का उपयोग करने के लिए इसे बढ़ाया जा सकता है:

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

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

git log --name-only --pretty=format: my_local_branch --not origin/master

स्थानीय शाखा पर बदली गई सभी फ़ाइलों को दिखाएगा, लेकिन अभी तक रिमोट पर मास्टर शाखा में विलय नहीं किया गया है।


1
उपरोक्त उदाहरणों में व्हाट्सएप पर ध्यान दें - यह पसंद है git log --stat --pretty="format:" $branchName,। उदाहरण के लिए तो, git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD)। जब मैं उस पर हूँ, यहाँ सटीक git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
उकसावा है जो

41

मैं इसका उपयोग दैनिक आधार पर इतिहास को बदलने वाली फाइलों के साथ दिखाने के लिए करता हूं:

git log --stat --pretty=short --graph

इसे छोटा रखने के लिए, .gitconfigऐसा करके अपने नाम में एक उपनाम जोड़ें :

git config --global alias.ls 'log --stat --pretty=short --graph'

मेरा उस के बहुत करीब है, git log --pretty = oneline --graph --name-status। मुझे यह अधिक संक्षिप्त लगता है, बस उन फ़ाइलों की सूची दिखा रहा है जो बदल गईं।
पीटर सुव्रा

15

मैं इसका उपयोग करता हूं:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

जो केवल और उनके राज्य की फाइलों की सूची तैयार करता है (जोड़ा, संशोधित, हटाया गया):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...

7

git diff --stat HEAD^!अंतिम प्रतिबद्ध ( HEAD) के लिए परिवर्तित फ़ाइलों और जोड़े / हटाए गए लाइन काउंट को दिखाता है ।

यह मुझे लगता है कि केवल फ़ाइलनामों के साथ संक्षिप्त आउटपुट प्राप्त करने के लिए कोई एकल आदेश नहीं है और एक ही बार में कई कमिट्स के लिए जोड़ा और हटाए गए लाइन मायने रखता है, इसलिए मैंने इसके लिए अपनी स्वयं की बैश स्क्रिप्ट बनाई:

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

जैसे कहा जाना। ./changed_files 99से संक्षिप्त रूप में परिवर्तन प्राप्त HEADकरने के लिए HEAD~99। जैसे पाईप किया जा सकता है। को less


क्या आप git diff --stat HEAD..masterHEAD और मास्टर के बीच अंतर दिखाने के लिए ऐसा नहीं कर सकते , या 2012 में अपना जवाब वापस पोस्ट करने पर यह मौजूद नहीं था?
फेरीबिग

1
@Ferrybig ओपी के सवाल यह है कि के बारे में है "प्रत्येक में बदल फ़ाइलों की एक सूची प्राप्त करने के लिए प्रतिबद्ध" , के बारे में नहीं diff के बीच HEADऔर master। वे दो अलग चीजें हैं।
nrz

4

मुझे लगता है कि यह सूची के लिए आदर्श प्रदर्शन निम्नलिखित है कि संक्षिप्त प्रारूप में प्रति फ़ाइलें क्या बदल गई हैं:

git log --pretty=oneline --graph --name-status

3

उदाहरण आउटपुट के साथ उत्तरों का सारांश

यह एक स्थानीय भंडार का उपयोग कर रहा है जिसमें पांच सरल आवागमन हैं।

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <user@email.com>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


@ CB-Bailey @ पीटर-सुवारा @ गौरव @ Omer-Dagan @xsor @Hazok @nrz @ptc


0

एक अन्य उपयोगी कमांड होगा git diff-tree <hash>जहां हैश भी हैश रेंज ( <old>..<new>नोटेशन द्वारा चिह्नित ) हो सकता है। एक आउटपुट उदाहरण:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

खेत हैं:

स्रोत मोड, गंतव्य मोड, स्रोत हैश, गंतव्य हैश, स्थिति, फ़ाइल नाम

सांख्यिकीय वे हैं जो आप अपेक्षा करेंगे: डी (हटाए गए), (जोड़ा), एम (संशोधित) आदि। पूर्ण विवरण के लिए मैन पेज देखें।


0

मैं आमतौर पर लॉग्स प्राप्त करने के लिए इनका उपयोग करता हूं:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"

1
मुझे इन विकल्पों के बारे में नहीं पता था, लेकिन यह पोस्ट अधिक उपयोगी होगी अगर यह समझाया जाए कि यह लॉग को फ़िल्टर करता है। वहां एक पल के लिए, मुझे लगा कि यह लेखकों के आउटपुट में सूचीबद्ध तरीके को बदलने का एक तरीका है।
स्टीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.