आप git diff
केवल दो कमिट के बीच का अंतर कैसे दिखाते हैं, दूसरे कमिट को बीच में छोड़कर?
आप git diff
केवल दो कमिट के बीच का अंतर कैसे दिखाते हैं, दूसरे कमिट को बीच में छोड़कर?
जवाबों:
आप बस 2 कमिट्स को पास कर सकते हैं जैसे git diff:
-> git diff 0da94be 59ff30c > my.patch
-> git apply my.patch
my.patch
दूसरी शाखा में कैसे आवेदन कर सकता हूं ?
अंतर के बीच में / दो / कमिट्स के बीच में कमिट्स को शामिल किए बिना पूछना थोड़ा समझ में आता है। कमेटी रिपॉजिटरी की सामग्री के केवल स्नैपशॉट हैं; दो के बीच अंतर के लिए पूछना जरूरी उन्हें शामिल करता है। तो फिर सवाल यह है कि आप वास्तव में क्या देख रहे हैं?
जैसा कि विलियम ने सुझाव दिया था, चेरी-पिकिंग आपको दूसरे के ऊपर एक एकल प्रतिबद्ध छूट का डेल्टा दे सकती है। अर्थात्:
$ git checkout 012345
$ git cherry-pick -n abcdef
$ git diff --cached
यह 'एब्सडेफ' लेता है, इसकी तुलना उसके पूर्वज से करता है, फिर उस अंतर को लागू करता है '012345' के शीर्ष पर को । यह नया अंतर तब दिखाया गया है - केवल परिवर्तन '012345' से आता है न कि 'एब्सीडफ के तत्काल पूर्वज से। बेशक, आप संघर्ष और आदि प्राप्त कर सकते हैं, इसलिए यह ज्यादातर मामलों में बहुत उपयोगी प्रक्रिया नहीं है।
यदि आप केवल abcdef में ही रुचि रखते हैं, तो आप कर सकते हैं:
$ git log -u -1 abcdef
यह abcdef की तुलना उसके तत्काल पूर्वज, अकेले और आमतौर पर वही करता है जो आप चाहते हैं।
और निश्चित रूप से
$ git diff 012345..abcdef
आपको उन दो आवागमन के बीच सभी अंतर देता है।
यह एक बेहतर विचार प्राप्त करने में मदद करेगा कि आप क्या हासिल करने की कोशिश कर रहे हैं - जैसा कि मैंने उल्लेख किया है, दो कमिट्स के बीच के अंतर के बिना यह पूछना कि वास्तव में क्या मतलब नहीं है।
origin/featurebranch#HEAD
करने local/featurebranch#HEAD
से आपको यह सुनिश्चित करने में मदद मिल सकती है कि आपने संघर्ष-समाधान के दौरान कुछ भी नहीं किया है।
दो git की तुलना 12345 और abcdef से करता है जैसे पैच एक के रूप में अलग कमांड का उपयोग कर सकता है
diff <(git show 123456) <(git show abcdef)
git diff <(git show 123456) <(git show abcdef)
काम नहीं करता है; diff <(...) <(...)
कर देता है। (मैंने अभी कोशिश की)।
git diff 123456 abcdef
।
diff
diff
diff
diff
git diff
पूर्ण परिवर्तनों की जाँच के लिए:
git diff <commit_Id_1> <commit_Id_2>
केवल परिवर्तित / जोड़े / हटाए गए फ़ाइलों की जाँच के लिए:
git diff <commit_Id_1> <commit_Id_2> --name-only
नोट : जाँच के लिए बीच में कमिट के बिना, आपको कमिट आईडी डालने की आवश्यकता नहीं है।
मान लीजिए कि आपके पास यह है
A
|
B A0
| |
C D
\ /
|
...
और आप यह सुनिश्चित करना चाहते हैं कि A
जैसा है वैसा ही हो A0
।
यह चाल चलेगा:
$ git diff B A > B-A.diff
$ git diff D A0 > D-A0.diff
$ diff B-A.diff D-A0.diff
मान लीजिए आप 012345 और abcdef के बीच अंतर देखना चाहते हैं। निम्नलिखित को वह करना चाहिए जो आप चाहते हैं:
$ git चेकआउट 012345 $ git चेरी-पिक-एन abcdef $ गिट अंतर - कैश किया गया
इस बारे में क्या:
git diff abcdef 123456 | less
यदि आप मक्खी पर कई अलग-अलग रूपों की तुलना करना चाहते हैं तो इसे कम से कम पाइप करना आसान है।
Git 2.19 के बाद से, आप बस उपयोग कर सकते हैं:
git range-diff rev1...rev2
- दो प्रतिबद्ध पेड़ों की तुलना करें, उनके सामान्य पूर्वज द्वारा शुरू
या
git range-diff rev1~..rev1 rev2~..rev2
- दिए गए परिवर्तनों की तुलना 2 दिए गए कमिट द्वारा की जाती है
फ़ाइल alias
में मेरी सेटिंग :~/.bashrc
git diff
alias gdca='git diff --cached' # diff between your staged file and the last commit
alias gdcc='git diff HEAD{,^}' # diff between your latest two commits
मैंने एक स्क्रिप्ट लिखी जो दो कमिट के बीच प्रदर्शित होती है, उबंटू पर अच्छी तरह से काम करती है।
https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc
#!/usr/bin/env python
import sys, subprocess, os
TOOLS = ['bcompare', 'meld']
def getTool():
for tool in TOOLS:
try:
out = subprocess.check_output(['which', tool]).strip()
if tool in out:
return tool
except subprocess.CalledProcessError:
pass
return None
def printUsageAndExit():
print 'Usage: python bdiff.py <project> <commit_one> <commit_two>'
print 'Example: python bdiff.py <project> 0 1'
print 'Example: python bdiff.py <project> fhejk7fe d78ewg9we'
print 'Example: python bdiff.py <project> 0 d78ewg9we'
sys.exit(0)
def getCommitIds(name, first, second):
commit1 = None
commit2 = None
try:
first_index = int(first) - 1
second_index = int(second) - 1
if int(first) < 0 or int(second) < 0:
print "Cannot handle negative values: "
sys.exit(0)
logs = subprocess.check_output(['git', '-C', name, 'log', '--oneline', '--reverse']).split('\n')
if first_index >= 0:
commit1 = logs[first_index].split(' ')[0]
if second_index >= 0:
commit2 = logs[second_index].split(' ')[0]
except ValueError:
if first != '0':
commit1 = first
if second != '0':
commit2 = second
return commit1, commit2
def validateCommitIds(name, commit1, commit2):
if commit1 == None and commit2 == None:
print "Nothing to do, exit!"
return False
try:
if commit1 != None:
subprocess.check_output(['git', '-C', name, 'cat-file', '-t', commit1]).strip()
if commit2 != None:
subprocess.check_output(['git', '-C', name, 'cat-file', '-t', commit2]).strip()
except subprocess.CalledProcessError:
return False
return True
def cleanup(commit1, commit2):
subprocess.check_output(['rm', '-rf', '/tmp/'+(commit1 if commit1 != None else '0'), '/tmp/'+(commit2 if commit2 != None else '0')])
def checkoutCommit(name, commit):
if commit != None:
subprocess.check_output(['git', 'clone', name, '/tmp/'+commit])
subprocess.check_output(['git', '-C', '/tmp/'+commit, 'checkout', commit])
else:
subprocess.check_output(['mkdir', '/tmp/0'])
def compare(tool, commit1, commit2):
subprocess.check_output([tool, '/tmp/'+(commit1 if commit1 != None else '0'), '/tmp/'+(commit2 if commit2 != None else '0')])
if __name__=='__main__':
tool = getTool()
if tool == None:
print "No GUI diff tools"
sys.exit(0)
if len(sys.argv) != 4:
printUsageAndExit()
name, first, second = None, 0, 0
try:
name, first, second = sys.argv[1], sys.argv[2], sys.argv[3]
except IndexError:
printUsageAndExit()
commit1, commit2 = getCommitIds(name, first, second)
if not validateCommitIds(name, commit1, commit2):
sys.exit(0)
cleanup(commit1, commit2)
checkoutCommit(name, commit1)
checkoutCommit(name, commit2)
try:
compare(tool, commit1, commit2)
except KeyboardInterrupt:
pass
finally:
cleanup(commit1, commit2)
sys.exit(0)