git push 錯誤,回滾 push操作
阿新 • • 發佈:2020-06-11
作者:故事我忘了¢
個人微信公眾號:程式猿的月光寶盒
[TOC] # 0.記一次使用git push後,覆蓋了同事程式碼的糗事 前言: 都在WebStorm中操作,Idea或者PyCharm同理 為了高度還原尷尬現場,這裡在原有專案上新建分支,然後都在分支上操作,一方面怕自己搞炸了,一方面真實環境就是如此 # 1.還原案發現場的準備工作 ## 1.1 新建分支 ![圖片](http://blog-cc.nos-eastchina1.126.net/b27b3df8-b89a-4861-886f-49c3041527f6) ![圖片](http://blog-cc.nos-eastchina1.126.net/c37def76-eb1f-41d3-8a5f-828183a87882) ![圖片](http://blog-cc.nos-eastchina1.126.net/83b41c77-8c18-4a05-9206-0f0ce344ec76) ### 注意: 這裡建立的分支僅僅在本地倉庫 ## 1.2. 分支提交到遠端Git倉庫 ![圖片](http://blog-cc.nos-eastchina1.126.net/571c6abc-b759-44ee-a4d0-28048beaba32) 遠端檢視確認,確實有,說明分支已經建立 ![圖片](http://blog-cc.nos-eastchina1.126.net/ca497568-9070-4e23-bafb-3491f101ffb6) # 2.糗事發生契機 這時候別人可能會和你改同一檔案 ## 2.1 假設檔案是這個html檔案,然後你上傳到遠端分支 **注意這時候都是在剛建立的那個分支操作** ![圖片](http://blog-cc.nos-eastchina1.126.net/09157766-1ac6-4a54-a029-a1d355a1de44) ![圖片](http://blog-cc.nos-eastchina1.126.net/8045fa42-1028-4320-b5e1-9f719f93353d) 可以看到遠端分支已經有了 ![圖片](http://blog-cc.nos-eastchina1.126.net/d2b834ed-0f82-4918-956b-f982ad48a267) ## 2.2 這時我用另一電腦修改這個檔案,並提交到遠端,故意模仿他人操作,如圖,在遠端分支上Linux已經更新過 ![圖片](http://blog-cc.nos-eastchina1.126.net/031051d8-083b-4df7-9db5-535894e250b6) ## 2.3 本地檔案也做不一樣的修改,假設自己再不知情的情況下做push操作必然會引起版本衝突 ![圖片](http://blog-cc.nos-eastchina1.126.net/b9b25560-c72d-4793-97b7-333e7022d215) > Remote changes need to be merged before pushing > > 推送前需要合併遠端更改 這時你點了**合併** ![圖片](http://blog-cc.nos-eastchina1.126.net/fc28d879-af14-4113-bd30-4fbcac6d749e) ![圖片](http://blog-cc.nos-eastchina1.126.net/594bd218-8b5e-441b-9c31-405bb1d9632d) ![圖片](http://blog-cc.nos-eastchina1.126.net/5fe82711-ad92-4388-a03c-ac50fc3a8145) 上圖,把你的和他的都合併提交,但是出現如下警告 ![圖片](http://blog-cc.nos-eastchina1.126.net/9e1fc716-7cb0-4206-918d-f02a814ce618) > Push has been cancelled, because there were conflicts during update. Check that conflicts were resolved correctly, and invoke push again. > > Push已被取消,因為在更新期間有衝突。檢查衝突是否已正確解決,並再次呼叫pull。 ## 2.4 此時本地我已經做了版本合併,所以,再次pull ![圖片](http://blog-cc.nos-eastchina1.126.net/2fbfbd40-0cce-40fa-b45c-2d6a440cbff8) # 3. 正事來了.回滾吧 現在,你被告知``Linux``的為正確的修改,並且你上一步的提交影響到他了,要回滾``push``到``Linux``操作的階段 ![圖片](http://blog-cc.nos-eastchina1.126.net/f715b8b5-6cef-4a05-bbf1-da604faa8034) ## 3.1 將win給回滾調,留下Linux的程式碼 ### 步驟 #### 1. **在目標分支上``copy revision number``:** ![圖片](http://blog-cc.nos-eastchina1.126.net/3c08c23e-1a73-4e01-a399-00dc302e9ce4) #### 2. **右擊專案依次選中:``git->Repository->Reset HEAD``** ![圖片](http://blog-cc.nos-eastchina1.126.net/f988ade4-acd7-4617-916b-afd1c54115bb) ![圖片](http://blog-cc.nos-eastchina1.126.net/2827c711-e961-49a4-95ad-5a90cbcb3df9) **Reset Type選Hard,To Commit 寫剛複製的版本號**, 然後點選Reset按鈕 **這時候,程式碼已經回到了老的版本,這個時候``不能``提交程式碼,提交也是會衝突的。** # 4.提交 1.可以使用命令強制提交 ``git push -f`` 或者 2.使用Idea,(我使用的是這個方法) 在最新的commit上覆製版本號 ![圖片](http://blog-cc.nos-eastchina1.126.net/26c0dea3-2ec1-4d30-872f-e99652798aff) 使用mixed型別,將上面複製的版本號貼上進來: ![圖片](http://blog-cc.nos-eastchina1.126.net/0418a309-b9c2-4f1b-92c1-b01fec0724dd) ## git reset soft,hard,mixed之區別深解 > [git reset soft,hard,mixed之區別深解](https://www.cnblogs.com/kidsitcn/p/4513297.html) ![圖片](http://blog-cc.nos-eastchina1.126.net/f798b11f-4784-464d-a597-02eb8110726c) ![圖片](http://blog-cc.nos-eastchina1.126.net/44d68371-2d69-4fe5-a84f-b740061abc1e) 又出來這個提示 ![圖片](http://blog-cc.nos-eastchina1.126.net/ee6b9026-71ed-4fc8-9a7b-b36e0f679d68) ### 3.再次pull ![圖片](http://blog-cc.nos-eastchina1.126.net/d80112f1-8dc3-4103-ae22-747f4f609fba) 此時 程式碼是最新的正確的, 也就是Linux操作的正確修改 # 5:驗證 上一步的強制push ``git push -f`` 1.說明 將程式從錯誤的復原,回滾到win操作 2.步驟 按照上面的步驟進行操作。 在後面提交的時候,直接強制提交, ![圖片](http://blog-cc.nos-eastchina1.126.net/eb6e4896-acf6-4b18-8e06-6bdebfcaf73a) 則效果是: ![圖片](http://blog-cc.nos-eastchina1.126.net/d1fe315e-4664-4f86-a88f-25b4834041fd) 可以看到一開始的 對應遠端的檔案 ![圖片](http://blog-cc.nos-eastchina1.126.net/ebc27f08-b64b-4149-9bd5-322f2f01fe1d) 至此就恢復以及修改了,Linux端只要pull一下就行了,就是最新程式碼 ![圖片](http://blog-cc.nos-eastchina1.126.net/7b1387c8-0f42-4ea8-ab93-2bfde9
個人微信公眾號:程式猿的月光寶盒
[TOC] # 0.記一次使用git push後,覆蓋了同事程式碼的糗事 前言: 都在WebStorm中操作,Idea或者PyCharm同理 為了高度還原尷尬現場,這裡在原有專案上新建分支,然後都在分支上操作,一方面怕自己搞炸了,一方面真實環境就是如此 # 1.還原案發現場的準備工作 ## 1.1 新建分支 ![圖片](http://blog-cc.nos-eastchina1.126.net/b27b3df8-b89a-4861-886f-49c3041527f6) ![圖片](http://blog-cc.nos-eastchina1.126.net/c37def76-eb1f-41d3-8a5f-828183a87882) ![圖片](http://blog-cc.nos-eastchina1.126.net/83b41c77-8c18-4a05-9206-0f0ce344ec76) ### 注意: 這裡建立的分支僅僅在本地倉庫 ## 1.2. 分支提交到遠端Git倉庫 ![圖片](http://blog-cc.nos-eastchina1.126.net/571c6abc-b759-44ee-a4d0-28048beaba32) 遠端檢視確認,確實有,說明分支已經建立 ![圖片](http://blog-cc.nos-eastchina1.126.net/ca497568-9070-4e23-bafb-3491f101ffb6) # 2.糗事發生契機 這時候別人可能會和你改同一檔案 ## 2.1 假設檔案是這個html檔案,然後你上傳到遠端分支 **注意這時候都是在剛建立的那個分支操作** ![圖片](http://blog-cc.nos-eastchina1.126.net/09157766-1ac6-4a54-a029-a1d355a1de44) ![圖片](http://blog-cc.nos-eastchina1.126.net/8045fa42-1028-4320-b5e1-9f719f93353d) 可以看到遠端分支已經有了 ![圖片](http://blog-cc.nos-eastchina1.126.net/d2b834ed-0f82-4918-956b-f982ad48a267) ## 2.2 這時我用另一電腦修改這個檔案,並提交到遠端,故意模仿他人操作,如圖,在遠端分支上Linux已經更新過 ![圖片](http://blog-cc.nos-eastchina1.126.net/031051d8-083b-4df7-9db5-535894e250b6) ## 2.3 本地檔案也做不一樣的修改,假設自己再不知情的情況下做push操作必然會引起版本衝突 ![圖片](http://blog-cc.nos-eastchina1.126.net/b9b25560-c72d-4793-97b7-333e7022d215) > Remote changes need to be merged before pushing > > 推送前需要合併遠端更改 這時你點了**合併** ![圖片](http://blog-cc.nos-eastchina1.126.net/fc28d879-af14-4113-bd30-4fbcac6d749e) ![圖片](http://blog-cc.nos-eastchina1.126.net/594bd218-8b5e-441b-9c31-405bb1d9632d) ![圖片](http://blog-cc.nos-eastchina1.126.net/5fe82711-ad92-4388-a03c-ac50fc3a8145) 上圖,把你的和他的都合併提交,但是出現如下警告 ![圖片](http://blog-cc.nos-eastchina1.126.net/9e1fc716-7cb0-4206-918d-f02a814ce618) > Push has been cancelled, because there were conflicts during update. Check that conflicts were resolved correctly, and invoke push again. > > Push已被取消,因為在更新期間有衝突。檢查衝突是否已正確解決,並再次呼叫pull。 ## 2.4 此時本地我已經做了版本合併,所以,再次pull ![圖片](http://blog-cc.nos-eastchina1.126.net/2fbfbd40-0cce-40fa-b45c-2d6a440cbff8) # 3. 正事來了.回滾吧 現在,你被告知``Linux``的為正確的修改,並且你上一步的提交影響到他了,要回滾``push``到``Linux``操作的階段 ![圖片](http://blog-cc.nos-eastchina1.126.net/f715b8b5-6cef-4a05-bbf1-da604faa8034) ## 3.1 將win給回滾調,留下Linux的程式碼 ### 步驟 #### 1. **在目標分支上``copy revision number``:** ![圖片](http://blog-cc.nos-eastchina1.126.net/3c08c23e-1a73-4e01-a399-00dc302e9ce4) #### 2. **右擊專案依次選中:``git->Repository->Reset HEAD``** ![圖片](http://blog-cc.nos-eastchina1.126.net/f988ade4-acd7-4617-916b-afd1c54115bb) ![圖片](http://blog-cc.nos-eastchina1.126.net/2827c711-e961-49a4-95ad-5a90cbcb3df9) **Reset Type選Hard,To Commit 寫剛複製的版本號**, 然後點選Reset按鈕 **這時候,程式碼已經回到了老的版本,這個時候``不能``提交程式碼,提交也是會衝突的。** # 4.提交 1.可以使用命令強制提交 ``git push -f`` 或者 2.使用Idea,(我使用的是這個方法) 在最新的commit上覆製版本號 ![圖片](http://blog-cc.nos-eastchina1.126.net/26c0dea3-2ec1-4d30-872f-e99652798aff) 使用mixed型別,將上面複製的版本號貼上進來: ![圖片](http://blog-cc.nos-eastchina1.126.net/0418a309-b9c2-4f1b-92c1-b01fec0724dd) ## git reset soft,hard,mixed之區別深解 > [git reset soft,hard,mixed之區別深解](https://www.cnblogs.com/kidsitcn/p/4513297.html) ![圖片](http://blog-cc.nos-eastchina1.126.net/f798b11f-4784-464d-a597-02eb8110726c) ![圖片](http://blog-cc.nos-eastchina1.126.net/44d68371-2d69-4fe5-a84f-b740061abc1e) 又出來這個提示 ![圖片](http://blog-cc.nos-eastchina1.126.net/ee6b9026-71ed-4fc8-9a7b-b36e0f679d68) ### 3.再次pull ![圖片](http://blog-cc.nos-eastchina1.126.net/d80112f1-8dc3-4103-ae22-747f4f609fba) 此時 程式碼是最新的正確的, 也就是Linux操作的正確修改 # 5:驗證 上一步的強制push ``git push -f`` 1.說明 將程式從錯誤的復原,回滾到win操作 2.步驟 按照上面的步驟進行操作。 在後面提交的時候,直接強制提交, ![圖片](http://blog-cc.nos-eastchina1.126.net/eb6e4896-acf6-4b18-8e06-6bdebfcaf73a) 則效果是: ![圖片](http://blog-cc.nos-eastchina1.126.net/d1fe315e-4664-4f86-a88f-25b4834041fd) 可以看到一開始的 對應遠端的檔案 ![圖片](http://blog-cc.nos-eastchina1.126.net/ebc27f08-b64b-4149-9bd5-322f2f01fe1d) 至此就恢復以及修改了,Linux端只要pull一下就行了,就是最新程式碼 ![圖片](http://blog-cc.nos-eastchina1.126.net/7b1387c8-0f42-4ea8-ab93-2bfde9