ऑटो कमिट के बिना Git मर्ज


402

क्या ऐसा करना संभव है git merge, लेकिन बिना कमिटमेंट के।

"मैन गेट मर्ज" यह कहता है:

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

लेकिन जब मैं इसके git mergeसाथ उपयोग करने की कोशिश करता हूं तब --no-commitभी ऑटो-कमिट करता है। यहाँ मैंने क्या किया है:

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

बाद git logमें v1.0 शाखा से मास्टर में विलय किए गए सभी कमानों का पता चलता है।

जवाबों:


616

मर्ज करते समय आउटपुट पर ध्यान दें - यह कह रहा है Fast Forward

ऐसी स्थितियों में, आप करना चाहते हैं:

git merge v1.0 --no-commit --no-ff

7
क्या होगा अगर कोई गड़बड़ है।
जुरगेन पॉल

20
@PineappleUndertheSea फास्ट फॉरवर्ड कभी भी संघर्ष का कारण नहीं बनता है। "असली" के मामले में तेजी से आगे के बिना मर्ज करना --no-commitतभी प्रभावी होता है जब कोई संघर्ष नहीं होता है, अगर संघर्ष के मामले में ऑटो-कमिट कभी नहीं होगा।
ग्रोनोस्तज

38
FYI करें: यदि आप बदलावों को मर्ज करना चाहते हैं और फिर इस तरह से प्रतिबद्ध हैं जैसे कि आपने अपने द्वारा मर्ज किए गए सभी परिवर्तनों को मैन्युअल रूप से टाइप कर दिया है (जैसा कि एक पारंपरिक मर्ज के विपरीत) तो आपको rm .git/MERGE_HEADबाद में चलाने की आवश्यकता होगी, जो इस बात को भूलने के लिए मजबूर कर देगा कि मर्ज हुआ।
जोन

7
FYI करें: यहाँ एक सफल मर्ज के लिए नमूना आउटपुट है:Automatic merge went well; stopped before committing as requested
kevinarpe

6
जाहिरा तौर पर git merge BRANCHENAME --no-commit --no-ffमेरे कार्यक्षेत्र को "genging" स्थिति में छोड़ दिया। बिल्कुल निश्चित नहीं है कि यह वास्तव में क्या करता है, लेकिन एक साधारण git stash saveऔर git stash popचक्र सब कुछ सामान्य करने के लिए वापस आ रहा था; लक्षित शाखा से केवल संशोधित फ़ाइलों के साथ ही इच्छित, और अब MERGING स्थिति नहीं है।
मूनलाइट

49

आप यहाँ मर्ज के अर्थ को गलत समझ रहे हैं।

--no-commitरोकता है मर्ज घटित करने के लिए प्रतिबद्ध है, और है कि केवल होता है जब आप दो अलग-अलग शाखा के इतिहास को विलय; आपके उदाहरण में ऐसा नहीं है क्योंकि Git इंगित करता है कि यह "फास्ट-फॉरवर्ड" मर्ज था और फिर Git केवल शाखा पर पहले से मौजूद कमिट को क्रमिक रूप से लागू करता है।


12
यह (imo) जरूरी भ्रम को स्पष्ट नहीं करेगा; मुझे लगता है कि यह एक (अपेक्षाकृत दुर्लभ) समय है जब डॉक्स वास्तव में स्पष्ट होते हैं: git help merge=> " --no-commitमर्ज का प्रदर्शन करें लेकिन मर्ज का नाटक करें और ऑटोकॉमिट न करें, उपयोगकर्ता को निरीक्षण करने और आगे बढ़ने के लिए मर्ज के परिणाम को आगे बढ़ाने का मौका देने के लिए। " बेशक की कुंजी के साथ संयोजन के रूप में उपयोग कर रहा है--no-ff
माइकल

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

4
यह परियोजना की नीतियों के सापेक्ष है, कुछ मामलों में यह उपयोगी है कि उन अतिरिक्त "मर्ज कमिट्स" को बल दिया जाए, भले ही यह एक एफएफ है क्योंकि आपको मुख्य शाखा में सुविधा को शामिल करने की आवश्यकता है।
समस_

7
...क्या। सब ठीक है, मुझे लगता है कि git बहुत अधिक अस्थिर है। विशेष रूप से इस जवाब ने मुझे मर्क्यूरियल की कोशिश करने के लिए आश्वस्त किया है।
ब्रायन गॉर्डन

24

यदि आप केवल एक ही तरह से सभी बदलाव करना चाहते हैं, जैसे कि आपने खुद को टाइप किया है, तो आप भी करेंगे

$ git merge --squash v1.0
$ git commit

1
इस के रूप में एक ही प्रभाव हैgit merge v1.0 --no-commit --no-ff
jpierson

2
नहीं, अलग प्रभाव। स्क्वैश एक नई हैश के साथ एक नई प्रतिबद्धता बनाता है। यह मर्ज के लिए एक शाखा में सभी कमिटों को जोड़ती है।
कवि साइगल

23

मैं इस तरह से पसंद करता हूं इसलिए मुझे किसी दुर्लभ पैरामीटर को याद रखने की आवश्यकता नहीं है।

git merge branch_name

यह तब कहेगा कि आपकी शाखा आगे है "# " हिट के , अब आप इन कमियों को पॉप कर सकते हैं और उन्हें निम्नलिखित के साथ काम करने वाले परिवर्तनों में डाल सकते हैं:

git reset @~#

उदाहरण के लिए यदि मर्ज के बाद यह 1 प्रतिबद्ध है, तो उपयोग करें:

git reset @~1

नोट: विंडोज पर, उद्धरणों की आवश्यकता है। (जैसा कि जोश ने टिप्पणियों में उल्लेख किया है) उदा:

git reset "@~1"

4
खिड़कियों पर, उद्धरणों की आवश्यकता है:git reset "@~1"
जोश

1

जब शाखा में केवल एक प्रतिबद्ध होता है, तो मैं आमतौर पर करता हूं

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