विंडोज पर गेट: आप मेरिजूल कैसे सेट करते हैं?


347

मैंने Cygwin पर msysGit और Git की कोशिश की है। दोनों अपने आप में ठीक काम करते हैं और दोनों पूरी तरह से गिट और गिट-गुई चलाते हैं।

अब मैं एक मर्ज को कैसे कॉन्फ़िगर करूं? (Vimdiff Cygwin पर काम करता है, लेकिन अधिमानतः मैं हमारे कुछ विंडोज-प्यार करने वाले सहकर्मियों के लिए कुछ अधिक उपयोगकर्ता-अनुकूल चाहूंगा।)



4
Git एक्सटेंशन में एक git UI है जिसमें एक बहुत अच्छा है, और विंडोज़ उपयोगकर्ता के अनुकूल, विलय उपकरण है।
कालड्रेक्स

लगता है कि आपको कछुआ की जरूरत है?
सर्गेई

जवाबों:


305

चार्ल्स बेली के जवाब पर फॉलो-अप करने के लिए, यहाँ मेरा git सेटअप है जो p4merge (फ्री क्रॉस-प्लेटफॉर्म 3way मर्ज टूल) का उपयोग कर रहा है; एमएसआईएस गिट पर परीक्षण (विंडोज) स्थापित करें:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

या, एक विंडो cmd.exe शेल से, दूसरी पंक्ति बन जाती है:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

परिवर्तन (चार्ल्स बेली के सापेक्ष):

  • वैश्विक git config में जोड़ा गया है, यानी सभी git परियोजनाओं के लिए मान्य है, न कि केवल वर्तमान
  • कस्टम टूल कॉन्फिगर वैल्यू "मेरिजेट [[टूल] .cmd" में रहता है, न कि "मर्ज। [टूल] .cmd" के लिए (मूर्खतापूर्ण तरीके से, एक घंटे की समस्या निवारण के लिए क्यों git नॉन-मौजूदा टूल के बारे में शिकायत करता रहा।
  • सभी फ़ाइल नामों के लिए दोहरे उद्धरण जोड़े गए ताकि रिक्त स्थान वाली फ़ाइलें अभी भी मर्ज टूल द्वारा मिल सकें (मैंने इसे Powershell से msys Git में परीक्षण किया है)
  • ध्यान दें कि डिफ़ॉल्ट रूप से पेरफोर्स अपनी स्थापना को PATH में जोड़ देगा, इस प्रकार कमांड में p4merge के लिए पूर्ण पथ निर्दिष्ट करने की आवश्यकता नहीं है

डाउनलोड करें: http://www.perforce.com/product/compenders/perforce-visual-merge-and-diff-tools


EDIT (फरवरी 2014)

जैसा कि @Gregory Pakosz द्वारा बताया गया है , नवीनतम msys अब "मूल रूप से" p4merge ( 1.8.5.2.msysgit.0 पर परीक्षण ) का समर्थन करता है ।

आप चलकर समर्थित उपकरणों की सूची प्रदर्शित कर सकते हैं:

git mergetool --tool-help

आपको उपलब्ध या मान्य सूची में p4merge देखना चाहिए । यदि नहीं, तो कृपया अपना गिट अपडेट करें।

यदि p4merge उपलब्ध के रूप में सूचीबद्ध किया गया था , तो यह आपके PATH में है और आपको केवल merge.tool सेट करना है :

git config --global merge.tool p4merge

यदि यह के रूप में सूचीबद्ध किया गया मान्य है, तो आप को परिभाषित करने के लिए है mergetool.p4merge.path के अलावा merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • ऊपर एक उदाहरण पथ है जब p4merge को मौजूदा उपयोगकर्ता के लिए स्थापित किया गया था, न कि सिस्टम-वाइड (जिसके लिए व्यवस्थापक अधिकारों या UAC उन्नयन की आवश्यकता नहीं है)
  • यद्यपि ~वर्तमान उपयोगकर्ता की होम निर्देशिका में विस्तार होना चाहिए (इसलिए सिद्धांत रूप में पथ होना चाहिए ~/AppData/Local/Perforce/p4merge.exe), यह मेरे लिए काम नहीं करता था
  • पर्यावरण चर (जैसे $LOCALAPPDATA/Perforce/p4merge.exe) का लाभ उठाने के लिए भी बेहतर होगा , git पथों के लिए पर्यावरण चर का विस्तार नहीं करता प्रतीत होता है (यदि आप जानते हैं कि यह काम कैसे करना है, तो कृपया मुझे इसका उत्तर बताएं या अपडेट करें)

हम्म - यह कोशिश कर रहा है - पहला कॉन्फिग ठीक काम करता है, अगला सिर्फ गिट कॉन्फिग के लिए हेल्प टेक्स्ट प्रदर्शित करता है। यकीन नहीं है कि क्यों।
डैनी स्टेपल

1
समझ गया - वे एकल उद्धरण मुझे संदेहास्पद लग रहे हैं। बस इसे दोगुना करें और वे काम करें।
डैनी स्टैपल

13
सेटिंग mergetool.p4merge.cmdअब काम नहीं करेगी क्योंकि Git ने p4merge का समर्थन करने की कोशिश शुरू कर दी है, देखें libexec/git-core/git-mergetool--lib। इसके बजाय यह सीधे उपयोग करता हैmergetool.p4merge.path
ग्रेगरी पॉक्सोज़

5
पूरा रास्ता cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
लगाना

21
यह मेरे लिए किया: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'विंडोज 7 मशीन पर
दान पी।

88

mergetool.p4merge.cmd सेट करने से काम नहीं चलेगा क्योंकि Git ने p4merge का समर्थन करने की कोशिश शुरू कर दी है, libexec / git-core / git-mergetool--lib.so देखें, हमें git के लिए mergetool पथ निर्दिष्ट करने की आवश्यकता है, उदाहरण के लिए p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

तब यह काम करेगा।


1
बियॉन्ड तुलना 3 के साथ भी काम करता है। इसके बजाय BComp.exe के लिए पथ का उपयोग करें। धन्यवाद!
रिचर्ड एंथनी हेन

4
मुझे लगता है कि यह एक पुराना धागा है, लेकिन मुझे काम करने के लिए वह रास्ता नहीं मिल सकता है। मैं थोड़ा उलझन में हूँ कि कैसे cmd / msys के इंटरप्ले को देखते हुए मार्ग को बचाना चाहिए या नहीं ... EDIT स्विचिंग ने इसे दोहरे उद्धरण चिह्नों में बदल दिया है!
रुस्तवोर

धन्यवाद गितिनजा! ध्यान दें कि आप इसे Git Bash में टाइप कर सकते हैं, लेकिन यदि आप कमांड प्रॉम्प्ट का उपयोग करते हैं, तो आपको सिंगल को डबल कोट में बदलना होगा
Hongi Phong

61

मैं WinXP पर पोर्टेबल गिट का उपयोग कर रहा हूं (एक उपचार काम करता है!), और एक संघर्ष को हल करने के लिए आवश्यक था जो ब्रांचिंग में आया था। सभी gui की मैंने जांच की, KDiff3 उपयोग करने के लिए सबसे पारदर्शी साबित हुआ।

लेकिन मुझे इस ब्लॉग पोस्ट में विंडोज में काम करने के लिए आवश्यक निर्देश मिले , निर्देश जो यहां सूचीबद्ध अन्य दृष्टिकोणों से थोड़ा भिन्न हैं। यह मूल रूप से मेरी .gitconfigफ़ाइल में इन पंक्तियों को जोड़ने के लिए है :

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

अब अच्छी तरह से काम करना!


13
मेरे Win7 पीसी पर, मुझे path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(डबल बैक स्लैश पर ध्यान दें) इस्तेमाल करना था
कोई कहीं

मुझे इस तरह से एक त्रुटि मिली "यह अलग उपकरण मेल्ड 'D: \ software \ melddiff \ Meld.exe' के रूप में उपलब्ध नहीं है
एलन Vork

क्या आप जानते हैं कि प्रत्येक खंड को जोड़ने के क्रम में अंतर है या नहीं। मेरा मतलब है, अगर [मर्ज] [मेरिजटूल] के बाद होगा?
शमूएल

20

साइगविन के तहत, मेरे लिए काम करने वाली एकमात्र चीज निम्नलिखित है:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

इसके अलावा, मैं difftool के लिए शीघ्र संदेश बंद करना पसंद करता हूं:

git config --global difftool.prompt false

16

git mergetool पूरी तरह से विन्यास योग्य है ताकि आप अपने पसंदीदा उपकरण को चुन सकें।

पूरा प्रलेखन यहाँ है: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

संक्षेप में, आप उपयोगकर्ता कॉन्फ़िगरेशन चर सेट करके एक डिफ़ॉल्ट मेरिजेट सेट कर सकते हैं merge.tool

यदि मर्ज टूल मूल रूप से इसके द्वारा समर्थित लोगों में से एक है, तो आपको mergetool.<tool>.pathउपकरण के लिए पूर्ण पथ पर सेट करना होगा ( <tool>आपके द्वारा कॉन्फ़िगर किए merge.toolगए द्वारा प्रतिस्थापित किया गया है।

अन्यथा, आप उचित फ़ाइलों के लिए सेट किए गए mergetool.<tool>.cmdशेल चर के साथ रनटाइम पर खाली होने के लिए थोड़ा खोल $BASE, $LOCAL, $REMOTE, $MERGEDसेट कर सकते हैं। आपको बचने के साथ थोड़ा सावधान रहना होगा कि क्या आप सीधे एक कॉन्फ़िगर फ़ाइल को संपादित करते हैं या git configकमांड के साथ चर सेट करते हैं ।

कुछ इस तरह का स्वाद देना चाहिए कि आप क्या कर सकते हैं ('mymerge' एक काल्पनिक उपकरण है)।

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

एक बार जब आप अपने पसंदीदा मर्ज टूल को सेट कर लेते हैं, तो git mergetoolजब भी आपको हल करने के लिए संघर्ष करना पड़ता है, तो यह बस चलने की बात है ।

Perforce से p4merge टूल एक बहुत अच्छा स्टैंडअलोन मर्ज टूल है।


8

विंडोज 7 पर तुलना करने के लिए

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"

2
मैंने इन कमांड्स का इस्तेमाल किया लेकिन मैं बियॉन्ड तुलना के बजाय विनमर्ज का इस्तेमाल कर रहा हूं।
ब्रेंट केलर

6

ऐसा लगता है कि नए git संस्करण सीधे p4merge का समर्थन करते हैं, इसलिए

git config --global merge.tool p4merge

यदि आपके लिए p4merge.exe आपके रास्ते पर है, तो आपको इसकी आवश्यकता है। Cmd या पथ सेट करने की आवश्यकता नहीं है।


यह कुंजी है। P4merge को स्थापित करने और mergetool.p4merge.path को सटीक स्थान पर सेट करने के बाद भी यह काम नहीं किया। स्थापना फ़ोल्डर को पथ में जोड़ने से काम हुआ।
रिचर्डएम


4

मुझे विंडोज़ 7 पर msysGit का उपयोग करते हुए अतिरिक्त उद्धरण छोड़ना पड़ा, निश्चित नहीं कि क्यों।

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'

3

यदि आप साइबरविन के माध्यम से ऐसा कर रहे हैं, तो आपको साइबरपैथ का उपयोग करने की आवश्यकता हो सकती है:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'

3

बाह, यह अंत में मेरे लिए काम किया (विंडोज 7 + साइगविन + कछुआमर्ग):

.It / config में:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

साइबरपैथ का उपयोग करने के लिए पिछले पोस्टर के लिए धन्यवाद!


3

मैं उनके मैनुअल से WinMerge ( http://winmerge.org/ ) नामक एक ऐप का उपयोग करता हूं ( http://manual.winmerge.org/CommandLine.html )

यह बैश स्क्रिप्ट है जिसका मैं mergetoolनिर्देशन के माध्यम से उपयोग करता हूं.gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

मूल रूप से बैश तब होता है जब रिक्त फ़ाइल में अंतर का परिणाम होता है और सही स्थान पर एक नई अस्थायी फ़ाइल बनाता है।


3

मुझे " सोर्सगियर डिफमेगर " को गीथब विंडोज में मल्टिफ्टफुल और मेरिजेट के रूप में कॉन्फ़िगर करने के दो तरीके मिले ।

कमांड प्रॉम्प्ट विंडो में निम्नलिखित कमांड GIT का उपयोग करने के लिए आपके .itconfig को अपडेट करेगी। IFMerge का उपयोग करें:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[ या ]

निम्नलिखित पंक्तियों को अपने .gitconfig में जोड़ें। यह फ़ाइल आपके घर निर्देशिका C: \ Users \ UserName में होनी चाहिए:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"

1

आप इन विकल्पों को भी जोड़ना चाह सकते हैं:

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

इसके अलावा, मुझे नहीं पता कि मिलन गार्डियन के जवाब से उद्धृत और स्लेश ने मेरे लिए चीजों को खराब कर दिया।


1

यदि कोई TortoiseGit पर अपने अलग उपकरण के रूप में gvim का उपयोग करना चाहता है, तो यह वह है जो आपको बाहरी अंतर उपकरण के पथ के लिए पाठ इनपुट में दर्ज करने की आवश्यकता है:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"

1

इंटेलीजे आईडिया (सामुदायिक संस्करण) के लिए विंडोज वातावरण में 3-तरफा गिट मेरजेट कॉन्फ़िगरेशन ( ~/.gitconfig)

Cygwin

[mergetool "ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

Msys

[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

~ / Winpath.sh को एमएसआई पर विंडोज में पथ परिवर्तित करना है और स्टिकओवरफ़्लो पर एमएसवाई पथ रूपांतरण प्रश्न से लिया गया है।

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "$1" ]; then                                             
            local dir=$(dirname "$1")                                    
            local fn=$(basename "$1")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                             
            if [ -d "$1" ]; then                                         
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                         
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 

0

P4merge को सेटअप करने के लिए, दोनों मर्ज और फ़र्क के लिए खिड़कियों पर चॉकलेट का उपयोग करके स्थापित किया गया है, यहाँ देखें: https://gist.github.com/CamW/88e95ea8d9f0786d746a


0

अगर आपको SourceTree से p4merge खोलने में समस्या आ रही है तो आप MyRepo.git के तहत स्थानीय कॉन्फ़िगरेशन फ़ाइल नाम विन्यास देखें और किसी भी विलय कॉन्फ़िगरेशन को हटा दें। मेरे मामले में यह मेलड को खोलने की कोशिश कर रहा था जिसे मैंने अभी अनइंस्टॉल किया है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.