जवाबों:
उदाहरणों पर एक नज़र डालते हैं, जो git इतिहास से अलग है ( कमिट में 1088261f git.git रिपॉजिटरी में ):
diff --git a/builtin-http-fetch.c b/http-fetch.c
similarity index 95%
rename from builtin-http-fetch.c
rename to http-fetch.c
index f3e63d7..e8f44ba 100644
--- a/builtin-http-fetch.c
+++ b/http-fetch.c
@@ -1,8 +1,9 @@
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, const char *prefix)
int get_verbosely = 0;
int get_recover = 0;
+ prefix = setup_git_directory();
+
git_config(git_default_config, NULL);
while (arg < argc && argv[arg][0] == '-') {
इस पैच लाइन का विश्लेषण लाइन द्वारा करें।
पहली पंक्ति
diff --it / a / buildin-http-fetch.cb / http-fetch.cफॉर्म में "git diff" हेडर है
diff --git a/file1 b/file2
। a/
और b/
फ़ाइल नाम एक ही है जब तक कि नाम बदलने / कॉपी (हमारे मामले में) की तरह शामिल है। --git
इसका मतलब यह है कि diff "Git" diff प्रारूप में है।अगला एक या अधिक विस्तारित हेडर लाइन हैं। पहले तीन
समानता सूचकांक 95% बिलिन-http-fetch.c से नाम बदलें http-fetch.c का नाम बदलाहमें बताया है कि फ़ाइल से नाम दिया गया था
builtin-http-fetch.c
करने के लिए http-fetch.c
और उन दो फाइलों 95% समान (जो इस नाम बदलने का पता लगाने के लिए इस्तेमाल किया गया था) हैं। सूचकांक f3e63d7..e8f44ba 100644हमें दी गई फ़ाइल के मोड के बारे में बताएं (
100644
इसका मतलब है कि यह साधारण फ़ाइल है और उदाहरण के लिए सिम्कलिन नहीं है, और यह कि निष्पादन योग्य अनुमति बिट नहीं है), और प्रीमेसेज के लघु हैश के बारे में (दिए गए परिवर्तन से पहले फ़ाइल का संस्करण) और पोस्टिमेज (फ़ॉर्म परिवर्तन के बाद फ़ाइल का संस्करण)। git am --3way
यदि पैच को स्वयं लागू नहीं किया जा सकता है, तो इस लाइन का उपयोग 3-तरफा मर्ज करने का प्रयास करने के लिए किया जाता है।अगला दो-पंक्ति एकीकृत अलग हेडर है
--- ए / बिलिन-http-fetch.c +++ बी / http-fetch.c
diff -U
परिणाम की तुलना में इसमें स्रोत (प्रीमेसेज) और डेस्टिनेशन (पोस्टिमेज) फाइल नामों के बाद फाइल-मॉडिफिकेशन-टाइम नहीं है और न ही फाइल-मॉडिफिकेशन-टाइम है। अगर फ़ाइल स्रोत बनाया गया था /dev/null
; यदि फ़ाइल हटा दी गई थी, तो लक्ष्य है /dev/null
। diff.mnemonicPrefix
के स्थान पर सही करने के लिए विन्यास चर, a/
और b/
इस दो लाइन शीर्षक में उपसर्गों आप के बजाय हो सकता है c/
, i/
, w/
और o/
उपसर्गों क्रमश: तुम क्या तुलना करने के लिए के रूप में; git-config देखें (1)इसके बाद एक या एक से अधिक मतभेदों को देखें; प्रत्येक हंक एक क्षेत्र दिखाता है जहाँ फाइलें भिन्न होती हैं। यूनिफाइड फॉर्मेट हॉक जैसी लाइन के साथ शुरू होता है
@@ -1,8 +1,9 @@या
@@ -18,6 +19,8 @@ int cmd_http_fetch (int argc, const char ** argc, ...यह प्रारूप में है
@@ from-file-range to-file-range @@ [header]
। से-फाइल-रेंज फॉर्म में है -<start line>,<number of lines>
, और फाइल-रेंज के लिए है +<start line>,<number of lines>
। दोनों स्टार्ट-लाइन और नंबर-ऑफ-लाइन क्रमशः प्रीइमेज और पोस्टिमेज में हंक की स्थिति और लंबाई को संदर्भित करते हैं। यदि संख्याओं की संख्या नहीं दिखाई गई तो इसका मतलब है कि यह 0 है।
वैकल्पिक शीर्षलेख सी फ़ंक्शन को दिखाता है जहां प्रत्येक परिवर्तन होता है, अगर यह एक सी फ़ाइल है (जैसे -p
कि जीएनयू में विकल्प भिन्न होता है), या समकक्ष, यदि कोई हो, तो अन्य प्रकार की फाइलों के लिए।
इसके बाद विवरण आता है कि फाइलें कहां भिन्न हैं। दोनों फ़ाइलों के लिए आम लाइनें एक अंतरिक्ष चरित्र के साथ शुरू होती हैं। दो फ़ाइलों के बीच वास्तव में भिन्न होने वाली रेखाओं में बाएं प्रिंट कॉलम में निम्न संकेतक वर्णों में से एक है:
इसलिए, उदाहरण के लिए, पहला हिस्सा
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
इसका मतलब है कि cmd_http_fetch
इसके द्वारा प्रतिस्थापित किया गया था main
, और उस const char *prefix;
लाइन को जोड़ा गया था।
दूसरे शब्दों में, परिवर्तन से पहले, तत्कालीन 'बिलिन-http-fetch.c' फ़ाइल का उपयुक्त टुकड़ा इस तरह दिखता था:
#include "cache.h"
#include "walker.h"
int cmd_http_fetch(int argc, const char **argv, const char *prefix)
{
struct walker *walker;
int commits_on_stdin = 0;
int commits;
परिवर्तन के बाद अब 'http-fetch.c' फ़ाइल का टुकड़ा इस तरह दिखता है:
#include "cache.h"
#include "walker.h"
int main(int argc, const char **argv)
{
const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
वहां हो सकता है
फ़ाइल के अंत में कोई नई पंक्ति नहींमौजूद लाइन (यह उदाहरण में भिन्न नहीं है)।
जैसा कि डोनल फेलो ने कहा कि पढ़ने का अभ्यास करना सबसे अच्छा है, यह वास्तविक जीवन के उदाहरणों पर भिन्न होता है, जहां आप जानते हैं कि आपने क्या बदला है।
संदर्भ:
git blame -C -C
, यही वह काम करता है; यह Git डिजाइन निर्णय है। गिट डिफरेंट फॉर्मेट उपयोगकर्ता के लिए समानता (या असमानता) सूचकांक दिखाता है।
[header]
फ़ंक्शन की शुरुआत के साथ निकटतम पूर्ववर्ती है जो हंक से पहले होता है। ज्यादातर मामलों में इस लाइन में फ़ंक्शन का नाम शामिल होता है जिसमें भिन्न का हिस्सा होता है। यह diff
ड्राइवर को अलग करने के लिए gitattribute सेट के साथ विन्यास योग्य है , और ड्राइवर को xfuncname
कॉन्फ़िगरेशन चर सहित अलग करता है।
@@ -1,2 +3,4 @@
अंतर का हिस्सा
इस हिस्से को समझने में मुझे थोड़ा समय लगा, इसलिए मैंने एक न्यूनतम उदाहरण बनाया है।
प्रारूप मूल रूप से diff -u
एकीकृत रूप में समान है ।
उदाहरण के लिए:
diff -u <(seq 16) <(seq 16 | grep -Ev '^(2|3|14|15)$')
यहां हमने 2, 3, 14 और 15. लाइनों को हटा दिया। आउटपुट:
@@ -1,6 +1,4 @@
1
-2
-3
4
5
6
@@ -11,6 +9,4 @@
11
12
13
-14
-15
16
@@ -1,6 +1,4 @@
माध्यम:
-1,6
इसका अर्थ है कि पहली फ़ाइल का यह टुकड़ा लाइन 1 से शुरू होता है और कुल 6 लाइनों को दिखाता है। इसलिए यह 1 से 6 लाइनों को दर्शाता है।
1
2
3
4
5
6
-
"पुराने" का अर्थ है, जैसा कि हम आमतौर पर इसे लागू करते हैं diff -u old new
।
+1,4
इसका मतलब है कि दूसरी फ़ाइल का यह टुकड़ा लाइन 1 से शुरू होता है और कुल 4 लाइन दिखाता है। इसलिए यह 1 से 4 लाइनों को दर्शाता है।
+
"नया" का अर्थ है।
हमारे पास 6 के बजाय केवल 4 लाइनें हैं क्योंकि 2 लाइनें हटा दी गई थीं! नया हंक बस है:
1
4
5
6
@@ -11,6 +9,4 @@
दूसरे हंक के लिए अनुरूप है:
पुरानी फाइल पर, हमारे पास 6 लाइनें हैं, जो पुरानी फाइल के लाइन 11 से शुरू होती है:
11
12
13
14
15
16
नई फ़ाइल पर, हमारे पास 4 लाइनें हैं, जो नई फ़ाइल की लाइन 9 से शुरू होती है:
11
12
13
16
ध्यान दें कि लाइन 11
नई फ़ाइल की 9 वीं पंक्ति है क्योंकि हमने पहले से ही 2 लाइनों को हटा दिया है: 2 और 3।
हंक हेडर
आपके git संस्करण और कॉन्फ़िगरेशन के आधार पर, आप पंक्ति के आगे एक कोड रेखा भी प्राप्त कर सकते हैं @@
, जैसे func1() {
:
@@ -4,7 +4,6 @@ func1() {
यह भी -p
सादे ध्वज के साथ प्राप्त किया जा सकता है diff
।
उदाहरण: पुरानी फ़ाइल:
func1() {
1;
2;
3;
4;
5;
6;
7;
8;
9;
}
यदि हम लाइन हटाते हैं 6
, तो अंतर दिखाता है:
@@ -4,7 +4,6 @@ func1() {
3;
4;
5;
- 6;
7;
8;
9;
ध्यान दें कि यह के लिए सही लाइन नहीं है func1
: यह लाइनों को छोड़ दिया 1
और 2
।
यह भयानक विशेषता अक्सर यह बताती है कि प्रत्येक हंक किस फंक्शन या क्लास से संबंधित है, जो अंतर की व्याख्या करने के लिए बहुत उपयोगी है।
हेडर का चयन करने के लिए एल्गोरिथ्म कैसे काम करता है, इस पर चर्चा की गई है: गिट अलग-अलग हंक हेडर में अंश कहां से आता है?
@@ -1,6 +1,4 @@
कृपया नहीं पढ़ते -1
के रूप में minus one
या +1
के रूप में plus one
के बजाय के रूप में इस पढ़ा line 1 to 6
में वर्ष (प्रथम) फ़ाइल। यहां ध्यान दें - implies "old"
माइनस नहीं। BTW, स्पष्टीकरण के लिए धन्यवाद ... हैश।
+1,4
यह कहता है कि यह टुकड़ा दूसरी फ़ाइल के लाइन 1 से 4 से मेल खाता है "। ऐसा इसलिए है क्योंकि यह +1,4
गैर-आकस्मिक संदर्भ लाइनों को संदर्भित कर सकता है। बल्कि, क्या " +1,4
" वास्तव में इसका मतलब है कि कि " देखते हैं 4
उस फ़ाइल की 'संस्करण' में लाइनों (यानी संदर्भ लाइनों) "। यह का अर्थ समझने के लिए महत्वपूर्ण है +
, -
और <whitespace>
, उन पंक्तियों की शुरुआत में के रूप में यह जिसे की व्याख्या करने के लिए लागू होता है। एक और अधिक दृश्य उदाहरण: youtube.com/watch?v=1tqMjJeyKpw
यहाँ सरल उदाहरण है।
diff --git a/file b/file
index 10ff2df..84d4fa2 100644
--- a/file
+++ b/file
@@ -1,5 +1,5 @@
line1
line2
-this line will be deleted
line4
line5
+this line is added
यहाँ एक स्पष्टीकरण (विवरण यहाँ देखें )।
--git
एक कमांड नहीं है, इसका मतलब है कि यह अंतर का git संस्करण है (यूनिक्स नहीं)a/ b/
निर्देशिका हैं, वे वास्तविक नहीं हैं। यह केवल एक सुविधा है जब हम एक ही फाइल से निपटते हैं (मेरे मामले में / a इंडेक्स में है और बी / वर्किंग डायरेक्टरी में है)10ff2df..84d4fa2
इन 2 फाइलों की ब्लॉब आईडी हैं100644
"मोड बिट्स" है, यह दर्शाता है कि यह एक नियमित फ़ाइल है (निष्पादन योग्य नहीं है और प्रतीकात्मक लिंक नहीं है)--- a/file +++ b/file
माइनस संकेत एक / संस्करण में लाइनें दिखाते हैं, लेकिन b / संस्करण से गायब होते हैं; और प्लस संकेत एक / लेकिन वर्तमान में b / (मेरे मामले में --- मौजूद हटाई गई रेखाओं और +++ का मतलब है कि b / / और वर्किंग डायरेक्टरी में फाइल को जोड़ा है) में मौजूद लाइनों को दिखाता है।@@ -1,5 +1,5 @@
इसे समझने के लिए एक बड़ी फ़ाइल के साथ काम करना बेहतर है; यदि आपके पास अलग-अलग स्थानों में दो परिवर्तन हैं, तो आपको दो प्रविष्टियाँ मिलेंगी जैसे @@ -1,5 +1,5 @@
; मान लें कि आपके पास फ़ाइल लाइन 1 है ... लाइन 100 और हटाए गए लाइन 10 और नई लाइन 100 जोड़ें - आपको मिलेगा:@@ -7,7 +7,6 @@ line6 line7 line8 line9 -this line10 to be deleted line11 line12 line13 @@ -98,3 +97,4 @@ line97 line98 line99 line100 +this is new line100
644
) को अष्टक (मान: 1, 2, 4 क्रमशः eXecute, लिखें, और पढ़ें अनुमति) में पढ़ा जाना है और उस क्रम में स्वामी (उपयोगकर्ता), फिर समूह, फिर अन्य अनुमतियों से मेल खाता है। तो संक्षेप में 644
मतलब होगा अगर लिखित प्रतीकात्मक u=rw,og=r
, कि सभी के लिए पठनीय है, लेकिन केवल मालिक द्वारा लिखने योग्य है। बाईं ओर के अन्य अंक अन्य जानकारी को सांकेतिक शब्दों में बदलते हैं, जैसे कि अगर यह एक सिमलिंक है, आदि। मान github.com/git/git/blob/… देखा जा सकता है , इस स्थिति में पहले 1 "नियमित फ़ाइल" है।
डिफ़ॉल्ट आउटपुट स्वरूप (जो मूल रूप से एक प्रोग्राम से आता है जैसे diff
कि आप अधिक जानकारी के लिए देखना चाहते हैं) को "एकीकृत अंतर" के रूप में जाना जाता है। इसमें अनिवार्य रूप से 4 विभिन्न प्रकार की लाइनें शामिल हैं:
+
,-
और से शुरू होती हैंमैं सलाह देता हूं कि आप पढ़ने का अभ्यास एक फ़ाइल के दो संस्करणों के बीच करते हैं, जहाँ आप जानते हैं कि आपने क्या बदला है। जैसे आप पहचानेंगे कि आप क्या देख रहे हैं।
मेरे मैक पर:
info diff
फिर चुनें: Output formats
-> Context
-> Unified format
-> Detailed Unified
:
या ऑनलाइन आदमी एक ही अनुभाग के लिए एक ही रास्ते के बाद गन्नू में भिन्न होता है:
फ़ाइल: diff.info, नोड: विस्तृत एकीकृत, अगला: उदाहरण एकीकृत, ऊपर: एकीकृत प्रारूप
एकीकृत प्रारूप का विस्तृत विवरण ......................................
एकीकृत आउटपुट प्रारूप दो-लाइन हेडर के साथ शुरू होता है, जो इस तरह दिखता है:
--- FROM-FILE FROM-FILE-MODIFICATION-TIME +++ TO-FILE TO-FILE-MODIFICATION-TIME
समय की मोहर लगने का समय `2002-02-21 23: 30: 39.942229878 -0800 'है, जो दिनांक, समय, भिन्नात्मक सेकंड और समय क्षेत्र को इंगित करता है।
आप हेडर की सामग्री को `- लैबल = लेबल 'विकल्प के साथ बदल सकते हैं; देखें * नोट वैकल्पिक नाम ::।
इसके बाद एक या एक से अधिक मतभेदों को देखें; प्रत्येक हंक एक क्षेत्र दिखाता है जहाँ फाइलें भिन्न होती हैं। एकीकृत प्रारूप हंक इस तरह दिखते हैं:
@@ FROM-FILE-RANGE TO-FILE-RANGE @@ LINE-FROM-EITHER-FILE LINE-FROM-EITHER-FILE...
दोनों फ़ाइलों के लिए आम लाइनें एक अंतरिक्ष चरित्र के साथ शुरू होती हैं। दो फ़ाइलों के बीच वास्तव में भिन्न होने वाली रेखाओं में बाएं प्रिंट कॉलम में निम्न संकेतक वर्णों में से एक है:
पहली फाइल में यहां '+' एक लाइन जोड़ी गई थी।
`- 'पहली फ़ाइल से यहाँ एक लाइन हटा दी गई थी।
यह आपके प्रश्न से स्पष्ट नहीं है कि आप किस भिन्न भाग को भ्रमित करते हैं: वास्तव में भिन्न, या अतिरिक्त शीर्ष लेख जानकारी गिट प्रिंट। बस के मामले में, यहाँ हेडर का एक त्वरित अवलोकन है।
पहली पंक्ति कुछ इस तरह है diff --git a/path/to/file b/path/to/file
- जाहिर है कि यह आपको बता रहा है कि अंतर के इस खंड के लिए क्या फ़ाइल है। आप बूलियन config चर सेट करते हैं diff.mnemonic prefix
, a
और b
की तरह अधिक वर्णनात्मक पत्र में बदल जायेगा c
और w
(के लिए प्रतिबद्ध है और काम वृक्ष)।
अगला, "मोड लाइनें" हैं - लाइनें आपको किसी भी बदलाव का विवरण देती हैं जिसमें फ़ाइल की सामग्री को बदलना शामिल नहीं है। इसमें नई / हटाई गई फ़ाइलें, नामांकित / प्रतिलिपि की गई फ़ाइलें और अनुमतियाँ परिवर्तन शामिल हैं।
अंत में, वहाँ एक लाइन की तरह है index 789bd4..0afb621 100644
। आप शायद इसके बारे में कभी परवाह नहीं करेंगे, लेकिन उन 6 अंकों की हेक्स संख्या इस फ़ाइल के लिए पुराने और नए ब्लॉब्स का संक्षिप्त SHA1 हैश है (एक बूँद एक git ऑब्जेक्ट है जो फ़ाइल की सामग्री की तरह कच्चे डेटा को संग्रहीत करता है)। और निश्चित रूप से, 100644
फ़ाइल का मोड है - अंतिम तीन अंक स्पष्ट रूप से अनुमतियाँ हैं; पहले तीन अतिरिक्त फ़ाइल मेटाडेटा जानकारी देते हैं ( एसओ पोस्ट जो यह वर्णन करता है )।
उसके बाद, आप मानक एकीकृत अलग आउटपुट (क्लासिक की तरह diff -U
) पर हैं। यह हंक में विभाजित है - एक हंक परिवर्तन और उनके संदर्भ वाली फ़ाइल का एक खंड है। प्रत्येक हंक की एक जोड़ी से पहले होती है ---
और +++
प्रश्न में फ़ाइल को दर्शाने वाली रेखाएं होती हैं, फिर वास्तविक अंतर (डिफ़ॉल्ट रूप से) संदर्भ की तीन रेखाएं होती हैं -
और +
हटाए गए / जोड़े गए लाइनों को दिखाने वाली लाइनें होती हैं।
index
लाइन के लिए। के साथ पुष्टि कीgit hash-object ./file