सवाल मैं लगातार दो निरंतर काम कैसे करूं?


मैं गिट के भीतर पूरी rebasing सुविधा के लिए थोड़ा नया हूँ। मान लें कि मैंने निम्नलिखित काम किया है:

A -> B -> C -> D

बाद में, मुझे एहसास हुआ D इसमें एक फिक्स शामिल है जो इसमें जोड़े गए कुछ नए कोड पर निर्भर करता है A, और यह कि एक साथ काम करता है। मैं कैसे स्क्वैश करूँगा A और D एक साथ और छोड़ो B और C अकेला?


109
2017-10-13 07:52


मूल




जवाब:


तुम दौड़ सकते हो git rebase --interactive और डी से पहले डी और स्क्वैश डी को ए में पुन: व्यवस्थित करें।

गिट एक संपादक खुल जाएगा, और आप इस तरह की एक फाइल देखेंगे:

pick aaaaaaa Commit A
pick bbbbbbb Commit B
pick ccccccc Commit C
pick ddddddd Commit D

# Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

अब आप उस फ़ाइल को बदलते हैं जो ऐसा लगता है:

pick aaaaaaa Commit A
squash ddddddd Commit D
pick bbbbbbb Commit B
pick ccccccc Commit C

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


145
2017-10-13 07:55



प्रारंभ में, मैंने इसे "ए पर रीबेस डी, स्क्वैश डी में ए के रूप में पढ़ा, फिर बी को डीए पर रीबेस करें" के रूप में पढ़ा। यह जवाब से स्पष्ट नहीं है कि यह टेक्स्ट एडिटर में रीडरिंग लाइनों द्वारा किया जा सकता है। - Victor Sergienko
यदि आपकी शाखा स्थानीय है, तो आप पाएंगे There is no tracking information for the current branch रिबेसिंग करते समय त्रुटि। इस मामले में आपको उन कामों की संख्या निर्दिष्ट करने की आवश्यकता है जिन्हें आप काम करना चाहते हैं, जैसे: git rebase -i HEAD~4। देख यह जवाब। - johndodo


नोट: आपको चाहिए धक्का दिया गया है कि काम नहीं बदलते हैं किसी भी तरह से एक और रेपो के लिए जब तक आप नहीं जानते परिणाम

git log --oneline -4

D commit_message_for_D
C commit_message_for_C
B commit_message_for_B
A commit_message_for_A

git rebase --interactive

pick D commit_message_for_D
pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A

प्रकार i (सम्मिलित मोड में वीआईएम रखें)

इस तरह दिखने के लिए सूची बदलें (आपको प्रतिबद्ध संदेश को हटाने या शामिल करने की आवश्यकता नहीं है)। गलत वर्तनी मत करो squash!:

pick C commit_message_for_C
pick B commit_message_for_B
pick A commit_message_for_A
squash D

प्रकार Esc फिर ZZ (वीआईएम सेव करें और बाहर निकलें)

# This is a combination of 2 commits.
# The first commit's message is:

commit_message_for_D

# This is the 2nd commit message:

commit_message_for_A

प्रकार i

उस पाठ को बदलें जिसे आप नए प्रतिबद्ध संदेश को दिखाना चाहते हैं। मैं अनुशंसा करता हूं कि यह प्रतिबद्धता में बदलाव का विवरण हो A तथा D:

new_commit_message_for_A_and_D

प्रकार Esc फिर ZZ

git log --oneline -4

E new_commit_message_for_A_and_D
C commit_message_for_C
B commit_message_for_B

git show E

(You should see a diff showing a combination of changes from A and D)

अब आपने एक नई प्रतिबद्धता बनाई है E। करता है A तथा D अब आपके इतिहास में नहीं हैं लेकिन चले गए नहीं हैं। आप अभी भी इस बिंदु पर और थोड़ी देर के लिए उन्हें पुनर्प्राप्त कर सकते हैं git rebase --hard D (git rebase --hard किसी भी स्थानीय परिवर्तन को नष्ट कर देगा!)।


38
2018-06-21 15:43





उपयोग करने वालों के लिए SourceTree:

सुनिश्चित करें कि आपने पहले से ही काम नहीं किया है।

  1. रिपोजिटरी> इंटरेक्टिव रीबेस ...
  2. खींचें डी (नई प्रतिबद्धता) सीधे ऊपर से ऊपर (पुराने प्रतिबद्धता)
  3. सुनिश्चित करें कि प्रतिबद्ध डी हाइलाइट किया गया है
  4. क्लिक करें Squash with previous

3
2018-04-15 13:34





$ गिट चेकआउट मास्टर

$ गिट लॉग - ऑनलाइन

D
C
B
A

$ git rebase --onto HEAD ^^^ HEAD ^

$ गिट लॉग - ऑनलाइन

D
A

-1
2017-10-13 11:17



मुझे लगता है तुम्हारा मतलब --oneline? और ऐसा लगता है कि आप गिरा चुके हैं C तथा B, जो ओपी का इरादा नहीं था। - bstpierre
मेरे लिए काम नहीं किया यह मेरे सिर दोनों को स्थानांतरित कर दिया और ए को नीचे ले गया, लेकिन डी में ए को विलय नहीं किया (git show A) और डी, सी और बी मेरे रिफ-लॉग में खो गए थे। करना पड़ा git rebase D वापस पाने के लिए। - Nate