2013-03-07 128 views
1

例如,您已經推送了一些提交併將其投入生產,例如在服務器的webroot中。然後出了點問題。很顯然,你想要做的就是暫時將webroot中的文件恢復到以前的狀態,然後返回到本地開發位置,修復損壞的內容,對其進行測試,提交失敗並提交的提交新的修改向主分支提交。然後再次轉到生產webroot並將所有內容都提交到最新的提交中,這樣所有內容都可以修復並正常工作。然後,每個人都可以拉出主分支,而不用擔心提交失敗或重新設置git head或其他令人沮喪的事情。Git:暫時還原推送提交

所以:是它做的

在生產webroot的合法和安全的方法,在主分支

>git log --pretty=format:"%h %ad | %s [%an]" --date=short 

0fu83bd Wed Mar 6 17:47:42 2013 | Merge branch 'sample' [developer1] 
fd442f8 Wed Mar 6 17:47:10 2013 | Some updates [developer1] 
ad84471 Wed Mar 6 17:25:12 2013 | Added something [developer2] 

找到您要暫時恢復的文件狀態提交說ad84471

>git checkout ad84471 
>git branch 
* (no branch) 
    master 

去你開發,修復,提交,[合併],推主分支的任何地方。當你這樣做時,生產文件處於ad84471狀態,沒有人修改它們。然後回到生產Webroot公司:

>git checkout master 
>git pull 
>git branch 
* master 
>git log --pretty=format:"%h %ad | %s [%an]" --date=short 
7guffbd Wed Mar 6 17:47:42 2013 | Fixed 0fu83bd bugs [developer1] <---new commit 
0fu83bd Wed Mar 6 17:47:42 2013 | Merge branch 'sample' [developer1] 
fd442f8 Wed Mar 6 17:47:10 2013 | Some updates [developer1] 
ad84471 Wed Mar 6 17:25:12 2013 | Added something [developer2] 

現在我們是在主分支,一切正常應該。每個人都只需要抓住最新的變化,並且很好。

我檢查與md5deep的文件,以確保一切恢復狀態(拉修復之前),我們已經從恢復:

>md5deep -rel webroot > hashes_master_before_checkouting_ad84471 
>git checkout ad84471 
>git checkout master 
>md5deep -rel webroot > hashes_master_after_checkouting_master_again 

這些哈希值之間的差異只顯示

webroot/.git/logs/HEAD 
webroot/.git/index 

已經改變。

所以它似乎是一個很好的方法來快速修復某些東西,或者我錯了?

聲明:我知道,在很多項目中,這違背了預期的工作流程,而且這種做法不太好,而且以前應該進行自動化測試,但對於開發人員很少的小型項目不可能或不實用,所以與使用git reset或revert相比,此方法可以節省大量時間並簡化這些操作。

回答

2

對我來說,對於緊急修復似乎很好。

如果您想要更加「嚴謹」一點,您可以改爲從「已知良好」提交中創建一個分支,並在生產中檢查該分支,因爲它會留下更多的審計線索。

在開發機:

git branch hotfix-20130307 ad84471 
git push origin hotfix-20130307 

在督促機:

git fetch 
git checkout hotfix-20130307 

然後主分支被固定後,就結賬督促機器上再次掌握和更新:

git checkout master 
git pull 

這樣做的好處是,如果有人前往prod機器並運行git branch他們得到了更多的信息,並且可以大概找到bug追蹤器中hotfix-20130307分支的一些記錄,並知道它爲什麼完成。如果它是一個小團隊,並且唯一可能看到prod機器的人將已經知道情況是什麼,那麼這可能是矯枉過正。

+0

謝謝!我可以得出結論:我描述的方法和你的方法都不會導致未來的問題? – Snifff 2013-03-07 11:37:57

+0

他們不應該,我甚至會說他們不可以。不需要執行'md5'檢查(除了保證自己的安全),因爲Git保證文件在您檢查某些內容時將被恢復到正確的內容,並且如果文件包含未提交的更改,它將大聲喊叫。檢出以前的提交,檢出分支頭,提取等都是非常明確的操作,不能讓文件處於不良狀態,他們會準確地給出存儲庫中的內容 – 2013-03-07 12:26:39