माता-पिता में से किसी एक के साथ हर परिवर्तित फ़ाइल सहमत होने पर भी संयुक्त अंतर आउटपुट के साथ एक मर्ज कमिट कैसे करें?


185

एक "सरल" मर्ज (संघर्ष के बिना एक) करने के बाद, git showआमतौर पर केवल कुछ ऐसा ही दिखाता है

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

ऐसा इसलिए है, क्योंकि मर्ज के लिए, git showसंयुक्त अंतर प्रारूप का उपयोग करता है जो उन फ़ाइलों को छोड़ देता है जो किसी भी माता-पिता संस्करणों से सहमत हैं।

क्या संयुक्त अंतर मोड में अभी भी सभी अंतर दिखाने के लिए गिट को मजबूर करने का एक तरीका है?

डूइंग git show -mअंतर दिखाएगा (क्रमशः नए और सभी अभिभावकों के संस्करणों के बीच युग्मक का उपयोग करके) लेकिन मैं इस बात को प्राथमिकता दूंगा कि संबंधित मोड में जैसे कि संबंधित कॉलम में +/- द्वारा चिह्नित।


1
@ तिलमन वोगेल: कृपया स्वीकृत उत्तर की समीक्षा करें - लगता है कि बेहतर उत्तर हैं
जयन

1
@ जयन जबकि अन्य उत्तर अधिक लोकप्रिय हैं क्योंकि उनमें उपयोगी संकेत हैं, वे वास्तव में मेरी समस्या के करीब नहीं आते हैं क्योंकि सिर्फ दो-तरफा अंतर करते हैं। मैं एक तीन तरह के अंतर की तलाश में था।
तिलमन वोगेल

जवाबों:


-3

नहीं, ऐसा करने का कोई तरीका नहीं है git show। लेकिन यह निश्चित रूप से कभी-कभी अच्छा होगा, और यह शायद गिट स्रोत कोड को लागू करने में अपेक्षाकृत आसान होगा (आखिरकार, आपको बस यह बताने की ज़रूरत नहीं है कि यह बाहरी उत्पादन क्या है, इसे ट्रिम न करें ), इसलिए ऐसा करने के लिए पैच। शायद गिट अनुचर द्वारा स्वीकार किया जाएगा।

सावधान रहें कि आप क्या चाहते हैं, हालांकि; तीन महीने पहले एक-लाइन परिवर्तन के साथ एक शाखा को विलय करना, अभी भी मुख्य बनाम बनाम एक विशाल अंतर होगा , और इसलिए ऐसा पूर्ण अंतर लगभग पूरी तरह से अनपेक्षित होगा। इसलिए git इसे नहीं दिखाता है।


12
कृपया ऐसा न करें "ऐसा करने का कोई तरीका नहीं" स्पष्ट रूप से यह संभव है - अन्य उत्तर देखें। यह कहना बहुत भ्रामक है।
किलोडे

1
git show HEAD ^ ... HEAD; # प्रति @ hesham_EE का समाधान।
माइकल डिमिट

git show HEAD ~ 1 ... HEAD ~ 0 --name-only; # बेहतर वाक्य रचना। पीआर के पुनरावृति के लिए।
माइकल डिमिट 18

255

प्रतिबद्ध संदेश देखें:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

सूचना रेखा:

Merge: fc17405 ee2de56

उन दो प्रतिबद्ध आईडी को लें और उन्हें उल्टा कर दें। ताकि आप चाहते हैं कि आप प्राप्त करना चाहते हैं:

git diff ee2de56..fc17405

केवल परिवर्तित फ़ाइलों के नाम दिखाने के लिए:

git diff --name-only ee2de56..fc17405

और उन्हें निकालने के लिए, आप इसे अपने gitconfig में जोड़ सकते हैं:

exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'

फिर इसका उपयोग करके करें:

git exportfiles ee2de56..fc17405 /c/temp/myproject

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

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

45
एक बेहतर समाधान है git diff fc17405...ee2de56- यह ee2de56 पर सभी परिवर्तनों को दिखाएगा जो कि fc17405 पर आने वाले से उपलब्ध हैं, जो मुझे विश्वास है कि आप क्या चाहते हैं। दो के बजाय 3 डॉट्स पर ध्यान दें।
क्रिश न्यूटीकॉम्बे

1
@KrisNuttycombe 3 डॉट्स और ऑर्डर। और आपकी टिप्पणी वह है जो मैं खोज रहा था, जो मुझे लगता है कि ओपी को जो चाहिए था वह अधिक पसंद है।
इजाकाता

@KrisNuttycombe यह किसी भी तरह से काम नहीं करता है git log, जो अभी भी ..संस्करण की तरह सभी कमिट दिखाता है । ..और के ...लिए एक ही है log, लेकिन diffवे अलग हैं !? मुझे उन कमिट की सूची कैसे मिलेगी, जिन्हें इस शाखा में मिला दिया गया था?
रुडी

77

एक बेहतर समाधान (@KrisNuttycombe द्वारा उल्लिखित):

git diff fc17405...ee2de56

मर्ज कमिट के लिए:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

उन सभी परिवर्तनों को दिखाने के लिए, ee2de56जो कमिट पर उपलब्ध हैं fc17405। प्रतिबद्ध हैश के आदेश पर ध्यान दें - यह वैसा ही है जैसा मर्ज जानकारी में दिखाया गया है:Merge: fc17405 ee2de56

...दो के बजाय 3 डॉट्स पर भी ध्यान दें !

परिवर्तित फ़ाइलों की सूची के लिए, आप इसका उपयोग कर सकते हैं:

git diff fc17405...ee2de56 --name-only

यह वही है जो मैं +1 के बाद था।
गीदडबल्या

यह वास्तव में एक मर्ज संघर्ष का परिणाम दिखाता है, जबकि अन्य उत्तर नहीं देता है।
पॉड

12

आप मर्ज करने से पहले एक प्रतिबद्ध करने के लिए HEAD के साथ शाखा बना सकते हैं। फिर, आप कर सकते हैं:

git merge --squash testing

यह विलय होगा, लेकिन प्रतिबद्ध नहीं। फिर:

git diff

5

यहाँ दिए गए उत्तर की तरह लगता है: https://public-inbox.org/git/7vd392ezhx.fsf@alter.siamese.dyndns.org/

तो इसी तरह से, चल रहा है

$ git diff --cc $ M $ M ^ 1 $ M ^ 2 $ (git मर्ज-बेस $ M ^ 1 $ ^ ^)

एक संयुक्त पैच दिखाना चाहिए जो अपने माता-पिता और मर्ज बेस में दर्ज किए गए राज्यों के सापेक्ष $ M पर राज्य की व्याख्या करता है।


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

@ मोम नहीं मुझे डर है कि मैं नहीं। Googling "n-way visual diff" कुछ लिंक प्रदान करता है, इसलिए मैंने उन पर कोशिश की।
अधिकतम 6

4

मुझे लगता है कि आपको 'git show -c $ ref' की जरूरत है। A8e4a59 पर git रिपॉजिटरी पर यह कोशिश करना एक संयुक्त अंतर दिखाता है (2 कॉलम में से एक में प्लस / माइनस चार्ट)। जैसा कि git-show मैन्युअल में उल्लेख किया गया है, यह बहुत अधिक 'git diff-tree' को दर्शाता है, इसलिए वे विकल्प उपयोगी लगते हैं।


3
नहीं, "सरल" मर्ज के लिए, git show -c $refवही आउटपुट दिखाता है जैसा कि मैंने उद्धृत किया है, अर्थात कोई अंतर नहीं है। -cविलय के लिए डिफ़ॉल्ट मोड के समान एक संयुक्त भिन्न मोड का चयन करता है जो '--cc' है, देखें git help showऔर git help diff-tree। दोनों पूरी तरह से फ़ाइलों को छोड़ देते हैं जो उस फ़ाइल के मूल संस्करणों में से किसी एक से सहमत होते हैं।
तिलमन वोगेल

a8e4a59वास्तव में मर्ज की श्रेणी में नहीं आता है, मेरा मतलब है। इस मर्ज कमिट में वास्तव में एक फाइल होती है जो इसके मूल संस्करण दोनों से भिन्न होती है। Documentation/git-fast-import.txtकुछ चीजें एक माता-पिता से और कुछ दूसरे से जोड़ी जाती हैं। इससे गैर-रिक्त आउटपुट प्राप्त होता है git diff-tree --cc। हालांकि, इस "परस्पर विरोधी" मामले में केवल परिवर्तन दिखाए गए हैं। सभी "साफ" मर्ज परिणाम, देखो git show -m a8e4a59, बिल्कुल नहीं दिखाए जाते हैं।
तिलमन वोगेल

1
@TilmanVogel: यह इंगित करने के लिए धन्यवाद कि "निर्बाध" फ़ाइल मर्ज git show -cआउटपुट से बाहर रह गए हैं । ( man git-diff-treeकहते हैं "इसके अलावा, यह केवल उन फाइलों को सूचीबद्ध करता है, जो सभी माता-पिता से संशोधित किए गए थे।" लेकिन मैं एक के लिए निश्चित रूप से देखा नहीं था।)
पॉल व्हिटकेकर

3

आपके मामले में आपको बस जरूरत है

git diff HEAD^ HEAD^2

या सिर्फ आपके लिए हैश:

git diff 0e1329e55^ 0e1329e55^2

4
नहीं, यह सिर्फ दो माता-पिता के बीच एक स्पष्ट दो-तरफ़ा है। क्या मैं के लिए पूछ रहा था एक विधा है कि एक साथ के बीच अंतर पता चलता था git merge-base HEAD^ HEAD^2और HEAD^और HEAD^2एक ही शैली के रूप में फाइल कि संघर्षों के साथ विलय कर दिया गया के लिए किया जाता है।
तिलमैन वोगेल

3

यदि आपका मर्ज कमिट 0e1329e5 है, तो ऊपर बताए अनुसार, आप इस मर्ज में शामिल किए गए फॉर्म को प्राप्त कर सकते हैं:

git diff 0e1329e5^..0e1329e5

आशा है कि ये आपकी मदद करेगा!


3

यदि आप मर्ज कमेटी में बैठे हैं तो यह अंतर दिखाता है:

git diff HEAD~1..HEAD

यदि आप मर्ज कमेटी में नहीं हैं, तो बस हेज को मर्ज कमेट से बदलें। यह विधि सबसे सरल और सबसे सहज लगती है।


1
यह "संयुक्त भिन्न" आउटपुट नहीं है। माता-पिता और HEAD की प्रत्येक जोड़ी के बीच अंतर प्राप्त करना यहां कोई समस्या नहीं है।
तिलमन वोगल

2

आप -c ध्वज के साथ अंतर-ट्री कमांड का उपयोग कर सकते हैं। यह कमांड आपको दिखाता है कि मर्ज कमिट में कौन सी फाइलें बदल गई हैं।

git diff-tree -c {merged_commit_sha}

मुझे Git-Scm से -c फ्लैग का विवरण मिला :

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


2
इस विषय पर एक अच्छा लेख लगता है: haacked.com/archive/2014/02/21/reviewing-merge-commits और शायद यह भी: longair.net/blog/2009/04/16/git-fetch-and-merge
डेविन जी रोड

1

मैंने मर्ज के कमिट पर विभिन्न ऑपरेशन करने के लिए एक सामान्य-उद्देश्य दृष्टिकोण का निर्माण किया।

चरण एक : संपादन द्वारा गिट में एक उपनाम जोड़ें ~/.gitconfig:

[alias]
  range = "!. ~/.githelpers && run_on_merge_range"

चरण दो : ~/.githelpersएक बाश फ़ंक्शन को परिभाषित करें:

run_on_merge_range() {
  cmd=$1; shift
  commit=$1; shift
  range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
  echo "git $cmd $range $@"
  if [ -z $range ]; then
    echo "No merge detected"
    exit 1
  fi
  git $cmd $range $@
}

चरण तीन : लाभ!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

यहाँ सुधार के लिए शायद बहुत सारे कमरे हैं, मैंने एक कष्टप्रद स्थिति को प्राप्त करने के लिए बस एक साथ इसे मार दिया था। मेरे बैश वाक्य-विन्यास और / या तर्क का मजाक उड़ाने के लिए स्वतंत्र महसूस करें।


ध्यान दें कि आप "awk" बिट में "..." से ".." को बदलना चाहते हैं, इस पर निर्भर करता है कि आपको क्या चाहिए और आप क्या आदेश चला रहे हैं: stackoverflow.com/questions/462974/…
Nerdmaster
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.