1. 程式人生 > >git命令詳解( 四 )

git命令詳解( 四 )

inf 讓我 指定 提交 調整 ref spa 失敗 命令

此篇為git命令詳解的第四篇,話不多說,我們直接上知識點好吧

   git Push

  偏離的工作

  

gitPush:

  此命令負責將你的變更上傳到指定的遠程倉庫,並在遠程倉庫上合並你的新提交記錄。一旦 git push 完成, 你的朋友們就可以從這個遠程倉庫下載你分享的成果了!你可以將 git push 想象成發布你成果的命令,註意:git push 不帶任何參數時的行為與 Git 的一個名為 push.default 的配置有關。它的默認值取決於你正使用的 Git 的版本

技術分享圖片

執行命令:git push

技術分享圖片

好了,git push 命令沒什麽可以提交的

我們接下來看一個比較復雜一點的問題

偏離的工作:

假設你周一克隆了一個倉庫,然後開始研發某個新功能。到周五時,你新功能開發測試完畢,可以發布了。但是 —— 天啊!你的同事這周寫了一堆代碼,還改了許多你的功能中使用的 API,這些變動會導致你新開發的功能變得不可用。但是他們已經將那些提交推送到遠程倉庫了,因此你的工作就變成了基於項目舊版的代碼,與遠程倉庫最新的代碼不匹配了。

這種情況下, git push 就不知道該如何操作了。如果你執行 git push,Git 應該讓遠程倉庫回到星期一那天的狀態嗎?還是直接在新代碼的基礎上添加你的代碼,異或由於你的提交已經過時而直接忽略你的提交?

因為這情況(歷史偏離)有許多的不確定性,Git 是不會允許你 push

變更的。實際上它會強制你先合並遠程最新的代碼,然後才能分享你的工作。

下面我們看一下實際的例子

技術分享圖片

執行命令:git Push

技術分享圖片

看見了吧?什麽都沒有變,因為命令失敗了!git push 失敗是因為你最新提交的 C3 基於遠程分支中的 C1。而遠程倉庫中該分支已經更新到 C2 了,所以 Git 拒絕了你的推送請求

那該如何解決這個問題呢?很簡單,你需要做的就是使你的工作基於最新的遠程分支。

有許多方法做到這一點呢,

方案一

不過最直接的方法就是通過 rebase 調整你的工作。咱們繼續,看看怎麽 rebase!

技術分享圖片

執行命令:git fetch

     git rebase o/master

     git push

技術分享圖片

技術分享圖片

我們用 git fetch 更新了本地倉庫中的遠程分支,然後用 rebase 將工們的工作移動到最新的提交記錄下,最後再用 git push 推送到遠程倉庫。

方案二

還有其它的方法可以在遠程倉庫變更了以後更新我的工作嗎? 當然有,我們還可以使用 merge

盡管 git merge 不會移動你的工作(它會創建新的合並提交),但是它會告訴 Git 你已經合並了遠程倉庫的所有變更。這是因為遠程分支現在是你本地分支的祖先,也就是說你的提交已經包含了遠程分支的所有變化。

技術分享圖片

執行命令:git fetch

     git merge o/master

     git push

技術分享圖片

技術分享圖片

方案三

很好!但是要敲那麽多命令,有沒有更簡單一點的?

當然 —— 前面已經介紹過 git pull 就是 fetch 和 merge 的簡寫,類似的 git pull --rebase 就是 fetch 和 rebase 的簡寫!

讓我們看看簡寫命令是如何工作的。

技術分享圖片

執行命令:git pull --rebase

     git push

技術分享圖片

方案四

  我們也可以使用git pull 來解決這個問題

技術分享圖片

執行命令:git pull

     git push

技術分享圖片

技術分享圖片

偏離的歷史是非常重要的一部分,希望大家能好好看一下子

git命令詳解( 四 )