এর git diff
মধ্যে অন্য কমিটগুলি বাদ দিয়ে আপনি কেবলমাত্র দুটি কমিটের মধ্যে পার্থক্য দেখান?
এর git diff
মধ্যে অন্য কমিটগুলি বাদ দিয়ে আপনি কেবলমাত্র দুটি কমিটের মধ্যে পার্থক্য দেখান?
উত্তর:
আপনি কেবল গিট ডিফার জন্য 2 টি কমিটগুলি পাস করতে পারেন:
-> 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 'থেকে আসে only অবশ্যই, আপনি বিবাদ এবং অন্যান্য পেতে পারেন, তাই এটি বেশিরভাগ ক্ষেত্রে খুব কার্যকর প্রক্রিয়া নয়।
আপনি যদি নিজেকে কেবল আবদেফের প্রতি আগ্রহী হন তবে আপনি এটি করতে পারেন:
$ git log -u -1 abcdef
এটি অ্যাকডেফকে তার তাত্ক্ষণিক পূর্বপুরুষের সাথে একাকী তুলনা করে এবং সাধারণত আপনি যা চান তা হয়।
এবং অবশ্যই
$ git diff 012345..abcdef
আপনাকে এই দুটি কমিটের মধ্যে সমস্ত পার্থক্য দেয়।
আপনি কী অর্জন করতে চাইছেন সে সম্পর্কে আরও ভাল ধারণা পেতে এটি আপনাকে সহায়তা করবে - যেমনটি আমি উল্লেখ করেছি যে, দুটি চুক্তির মধ্যে পার্থক্য জিজ্ঞাসা করার মধ্যে যা কিছু আছে তা আসলে বোঝা যায় না।
origin/featurebranch#HEAD
করা local/featurebranch#HEAD
আপনাকে দ্বন্দ্ব-সমাধানের সময় কোনও কিছুকে কুঁকড়ে না তা নিশ্চিত করতে সহায়তা করতে পারে।
দুটি গিট কমিট 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 এর মধ্যে পার্থক্য দেখতে চান। নিম্নলিখিত আপনি যা চান তা করা উচিত:
it গিট চেকআউট 012345 it গিট চেরি-পিক-এন অ্যাবসিডিফ it গিট ডিফ - কেচড
এই সম্পর্কে কি:
git diff abcdef 123456 | less
আপনি যদি উড়তে অনেক ভিন্ন ভিন্নতার তুলনা করতে চান তবে কেবল এটি কম পাইপ করা সহজ।
ফাইলগুলিতে আমার 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)