git代碼'檢出'
git采用分布式無中心化設計昭抒,因此檢出代碼的同時需要將完整的倉庫下載到本地徒欣。所以不像SVN一樣可以直接用checkout來直接檢出服務端的版本庫(即開發(fā)代碼)到本地工作目錄,在git中應該使用git clone將遠程倉庫檢出到本地泳桦。
git clone 流程
git clone 是一個復合高級指令汤徽,內部會執(zhí)行git init(在本地初始化git repository,即創(chuàng)建.git隱藏目錄)灸撰、git pull(將遠程倉庫的幾乎所有拷貝到本地)谒府、git remote add(將遠程倉庫的URL連接添加到記錄),以及git checkout(將默認的倉庫的master分支代碼拷貝到本地工作目錄working directory和緩沖區(qū)index)浮毯。
拓展內容-git pull
要注意git pull與git fetch的區(qū)別完疫,由下圖可以看出git pull是git fetch和git merge的復合指令,由此可以得出git fetch只負責將文件檢出到本地债蓝,并不會與當前工作區(qū)的代碼合并壳鹤。
拓展內容-git checkout系列之checkout的底層機制
通過“git的日常操作流workflow”和“git的代碼‘檢出’”我們大致了解了如何從倉庫中將git所管理的各種文件拉取到本地。
這里著重說下checkout饰迹,尤其是當需要同時管理多個分支芳誓,在多個分支之間切換時;甚至是當需要與同一個源的其他倉庫進行合并時(即我們通常所說的多人協(xié)同開發(fā))蹦锋。
checkout所做的事情就是將命令行對應的版本庫中或者index中的文件拷貝出來兆沙,粘貼到working directory(如果參數(shù)是版本庫也會拷貝到index區(qū)域)區(qū)域中
當git checkout后面跟的是一個本地(或遠程)分支、或者HEAD(即默認的當前分支)時莉掂,實際的操作如上圖所示:
會將本地的working directory和 index 的內容設置成與制定的分支(你checkout選擇的分支)的最近一次提交內容相一致葛圃,即目標分支中存在的任何文件都會被拷貝到index和working directory中。
同時也意味著屬于現(xiàn)有分支憎妙,但目標分支不存在的文件库正,將會自動從index和working directory中暫時移除
例如:我創(chuàng)建了一個test.txt文件,我從默認分支(master)切換到新建分支
BranchB厘唾,然后一系列add褥符,commit之后,再切回分支master抚垃,test.txt文件會
自己消失(已經在working directory移除)
- 兩個分支提交都存在的文件保持不變喷楣。
拓展內容-git checkout系列之checkout多分支維護
新建的文件在working directory的中屬于狀態(tài)untracked,不會影響分支的切換(不論你怎么切換分支鹤树,新建的文件都不會‘暫時移除’)铣焊。
新建的文件在某一分支上 git add之后,但并未commit罕伯,也不會影響分支切換曲伊。
新建的文件在當前分支commit之后,如果有修改追他,但沒有再一次commit坟募,那么此時切換另一分支會報錯
(因為新建的文件在當前分支commit的時候就算屬于當前分支了岛蚤,在你修改之后但沒commit,卻要切換分支懈糯,那么git本來是準備遵循‘移除涤妒,屬于現(xiàn)有分支,但目標分支不存在的文件’赚哗,但發(fā)現(xiàn)你的文件修改之后未提交届腐,還處于臨時狀態(tài),如果移除了蜂奸,會導致本地修改丟失犁苏,故報錯)
拓展內容-git checkout系列之‘錯誤的dirty狀態(tài)’
至此我們清楚了checkout是如何完成分支切換的,以及什么情況下才能切換扩所。這也就是官方所說的只有在非“dirty”狀態(tài)下才能自由執(zhí)行checkout指令围详。
因此當你遇到這樣的狀況,你不想/不能祖屏,提交你正在進行中的工作助赞,但又不得不切換到其他分支,去完成那個分支上的任務或者工作袁勺,那么你就可以這樣做:
儲藏你的當前修改 stash
乘搭‘時光機’回到最近的版本 reset -hrad HEAD
切換分支 checkout
這里就不得不提前拓展以下幾個個命令:
git stash 和git stash apply:將當前工作儲藏and重新應用你儲藏好的修改
git stash list:查看現(xiàn)有的所有儲藏
git stash drop 移除某個儲藏的工作