2012-11-07 9 views
21

तो, मेरे पास एक बहुत ही सरल उपयोग केस है; मैं उन सभी कामों को स्क्वैश करना चाहता हूं जिन्हें मेरी 'आज की कामकाजी' शाखा से मास्टर में वापस जाने की जरूरत है।मैं गिट में प्रतिबद्धता तिथि के साथ कैसे स्क्वैश करता हूं जो अतीत में नहीं है?

अब तक मैं git rebase -i का उपयोग कर रहा हूं, लेकिन यह काफी सही काम नहीं करता है; अंतिम प्रतिबद्धता पर टाइमस्टैम्प सही नहीं है।

यहाँ ऐसा करने का एक उदाहरण है:

[work1] git checkout master 
Switched to branch 'master' 

[work1] git rebase today 
First, rewinding head to replay your work on top of it... 
Fast-forwarded master to today. 

[work1] git log --pretty=format:"%h%x09%an%x09%ad%x09%s" 
5ad95ff Doug Wed Nov 7 10:12:42 2012 +0800 Updated TODO again 
abb891c Doug Wed Nov 7 10:12:24 2012 +0800 Added more work 
c5fd35c Doug Wed Nov 7 10:11:50 2012 +0800 Added more work 
a98facd Doug Wed Nov 7 10:11:22 2012 +0800 Add work 
b4465be Doug Tue Nov 6 21:38:53 2012 -0800 Updated TODO 
403cea9 Doug Fri Jan 2 21:38:53 2009 -0800 Added todo 

ठीक है, अब मैं इन पिछले चार प्रतिबद्ध में एक प्रतिबद्ध छुटकारा पाने के लिए चाहते हैं।

[work2] date 
Wed 7 Nov 2012 10:39:39 WST 

[work2] git rebase -i b4465be 

pick a98facd Add work 
squash c5fd35c Added more work 
squash abb891c Added more work 
squash 5ad95ff Updated TODO to reflect todays work 

और परिणाम:

[work2] git log 
commit 3f7f1d2eb4ef23c73dce95f718152c7d5683a926 
Author: Doug <[email protected]> 
Date: Wed Nov 7 10:11:22 2012 +0800 

    Add work 
    Added more work 
    Added more work 
    Updated TODO to reflect todays work 

commit b4465bee5b278214704edcfef3f6e222b5b52964 
Author: Doug <[email protected]> 
Date: Tue Nov 6 21:38:53 2012 -0800 

    Updated TODO 

Dammit नहीं! यह जो मैं चाहता था। परिणामस्वरूप प्रतिबद्धता का टाइमस्टैम्प उस प्रतिबद्धता का टाइमस्टैम्प है जिसे हमने स्क्वैश किया है; जो मैं चाहता था वह वर्तमान समय होने की नई प्रतिबद्धता तिथि थी।

बस वास्तव में दिखाने के लिए मैं क्या बात कर रहा हूँ:

[work2] date 
Wed 7 Nov 2012 10:39:39 WST 

Author: Doug <[email protected]> 
Date: Wed Nov 7 10:11:22 2012 +0800 

मैं चाहता हूँ जिसके परिणामस्वरूप, मर्ज समय से तारीख होने के लिए यानी प्रतिबद्ध। अब, प्रतिबद्धता का समय नहीं।

जहां तक ​​मुझे पता है कि आप केवल पिछली प्रतिबद्धता में स्क्वैश कर सकते हैं, ऊपर की ओर एक नई प्रतिबद्धता में नहीं, लेकिन क्या ऐसा करने का कोई तरीका है?

सही समाधान प्रतीत होता है 1) मर्ज संदेश और सही प्रतिबद्ध दिनांक दिनांक के साथ एक नई प्रतिबद्धता बनाएं, 2) ??? < --- किसी भी तरह से स्क्वैश पिछले में काम करता है।

मैं यह कैसे कर सकता हूं?

+0

यह कई कारणों में से एक है कि मैं स्क्वैशिंग का प्रशंसक नहीं हूं। एक –

+0

भी। कमेंट तिथि और लेखक की तारीख के बीच एक अंतर है। आप जो कर रहे हैं उस पर निर्भर करता है। –

+0

[गिट स्क्वैश का संभावित डुप्लिकेट और अंतिम प्रतिबद्धता का टाइमस्टैम्प संरक्षित करें] (https://stackoverflow.com/questions/10020641/git-squash-and-preserve-last-commits-timestamp) –

उत्तर

31

हैक: आप उपयोग कर सकते हैं

git commit --amend --reset-author 

Git आदमी पेज प्रतिबद्ध का कहना है कि इस "भी लेखक टाइमस्टैम्प नवीनिकृत" । आपको प्रतिबद्धता में कोई भी परिवर्तन करने की ज़रूरत नहीं है (मैंने इसे स्थानीय रूप से आजमाया), और यह टाइमस्टैम्प को वर्तमान समय में अपडेट करेगा। निश्चित रूप से दुरुपयोग का प्रकार, लेकिन ऐसा लगता है कि यह काम करता है।

0
git rebase -i b4465be के बजाय

, क्लिपबोर्ड में हाल ही में लॉग कॉपी और कार्य करें:

git reset --soft b4465be 
git commit 

पेस्ट और संपादित परिवर्तन लॉग, प्रतिबद्ध संदेश संपादक से बाहर निकलें & सहेजें।

संबंधित मुद्दे