git圖解:代碼區域總結

clipboard.png

本文背景,在實際項目中使用git已有一年多,發現很多同事雖然會使用經常使用git指令,但並不理解每一個指令對應的做用原理。今天靜下心總結下git 的基本理解:代碼的存在區域;本文以實際項目出發,理清使用git過程當中,代碼的遷徙流程。html

git跟傳統的代碼管理器(如:svn)不一樣, 主要區別在於git多了個本地倉庫以及緩存區,因此即便沒法聯網也同樣能提交代碼。術語解釋:linux

  • 工做區間: 即咱們建立的工程文件, 在編輯器可直觀顯示;git

  • 緩存區: 只能經過git GUI或git shell 窗口顯示,提交代碼、解決衝突的中轉站;github

  • 本地倉庫: 只能在git shell 窗口顯示,鏈接本地代碼跟遠程代碼的樞紐,不能聯網時本地代碼可先提交至該處;shell

  • 遠程倉庫: 即保存咱們代碼的服務器,本文以公共版本控制系統:github爲例,登陸github帳號後可直觀顯示;segmentfault

接下來, 咱們以三個實際操做的例子講解git的平常,代碼如何在上述4個區域流動。緩存

1.提交 代碼到遠程倉庫:

首先在本地工做區間建立一個新工程:testGit,而後在項目裏新建一個README.md, 工做區間的工程以下:bash

clipboard.png

遠程倉庫建立一新工程,具體操做參見如何在window上把你的項目提交到github服務器

clipboard.png

將該新建的工程提交至遠程倉庫,關鍵的git 指令以下:編輯器

git init
git add README.md
git commit -m "首次提交代碼"
git remote add origin https://github.com/wteam-xq/testGit.git
git push -u origin master

指令解釋:

git init 表示在當前的項目目錄中生成本地的git管理;

git add README.md將「README.md」文件保存至緩存區,實際開發中通常使用 git add -A,使用-A:將新增、刪除、修改的文件改動全保存至緩存區;

git commit -m "first commit" 將代碼從緩存區保存至本地倉庫,實際開發中通常使用git commit -am "first commit"-a即爲all緩存區全部改動保存至本地倉庫

git remote add origin https://github.com/wteam-xq/testGit.git本地倉庫與指定的遠程倉庫建立 聯繫;
push -u origin master本地倉庫代碼推送至遠程倉庫,實際開發中 該指令後須要輸入github 帳號以及密碼。(首次提交注意別遺漏-u指定默認主機)

以上指令正常執行後, 本地倉庫的代碼就提交到遠程倉庫了:

clipboard.png

原理圖以下:

clipboard.png

2.將遠程倉庫代碼更新到本地:

首先咱們新建一文件夾:copyTestGit,進入該文件夾後使用git 指令:

git clone https://github.com/wteam-xq/testGit

指令執行完畢後, 就在該文件夾下生成一份副本啦(至關於多人協做時另外一臺設備上的工程文件),原理圖以下:

clipboard.png

接下來, 討論git pullgit fetchgit merge的關係

先拋簡單結論:

git pull
#等同於下面命令
git fetch
git merge

實際項目:咱們在testGit工程中修改README.md,而後更新、提交下代碼 執行如下git 指令(平常使用中會用git status看看是否有文件須要git add):

git commit -am 'update readme.md'
git push origin master

原理圖以下:

clipboard.png

提交成功:

clipboard.png

遠程倉庫代碼更新後, 咱們進入另外一本地倉庫:copyTestGittestGit,將遠程倉庫的代碼更新至該本地倉庫。
在該目錄下輸入如下git指令:

git fetch 
git merge origin/master

平常使用圖方便通常都是直接:

git pull

以上指令的詳細探討請看 少用pull,多用fetch 和 merge注意: 本文注重git工做原理圖不考慮多分支狀況,且使用了git clone因此副本工程已經跟主分支創建了追蹤關係,因此pull fetch 後都不接分支代碼 )

以上指令區別的原理圖:

clipboard.png

3.更新到本地倉庫時, 出現衝突,解決衝突;
3.1 放棄本地修改
3.2 解決衝突後提交本地修改

首先, 咱們先重現下出現衝突的狀況; 在testGit目錄下先修改README.md文件第三行,hello word 修正爲 hello world:

clipboard.png

提交該修改到遠程倉庫(提交細節參照前述步驟):

clipboard.png

而後, 在副本工程copyTestGit/testGit 目錄下也修改README.md文件第三行,hello word 修正爲 hello world2:

clipboard.png

如今副本工程修改完了代碼打算提交,提交前先將遠程倉庫最新代碼更新至本地倉庫, 慣例使用指令:

git pull

指令執行以後會發現如下衝突提示:

clipboard.png

出現以上提示, 說明本次更新代碼失敗;主要在於本地工做區間遠程倉庫的新代碼衝突了, 圖解以下:

clipboard.png

接下來,有兩種方式處理衝突: 放棄本地修改解決衝突後提交本地修改

3.1 放棄本地修改

放棄本地修改意味着將遠程倉庫的代碼徹底覆蓋本地倉庫以及本地工做區間, 若是對git的指令不熟悉那大能夠將本地工程徹底刪除,而後再從新拷貝一次(git clone)。

固然, git如此強大不必用這麼原始的方法,可讓本地倉庫代碼覆蓋本地修改,而後更新遠程倉庫代碼;

本地倉庫代碼徹底覆蓋本地工做區間,具體指令以下:

git checkout head .

(注意: 別遺漏 "head" 後的 " ." )
而後更新遠程倉庫的代碼就不會出現衝突了:

git pull

原理圖以下:

clipboard.png

3.2 解決衝突後提交本地修改

覆蓋本地代碼解決衝突方法適合不太懂git的菜鳥, 像我這種git老鳥(其實並非(¬_¬))固然用更高級的git指令解決衝突。
除了上述說的4個區間外, 其實git還有第5個區:

clipboard.png

(關於git stash詳見 本人 testGit日誌

跟 緩存區 同樣, 工做現場是 獨立存在於本地倉庫工做區:

clipboard.png

解決衝突後提交本地修改的思路大概以下:
將本地修改的代碼放在工做現場, 而後從遠程倉庫拉取最新代碼,拉取成功後再從工做現場將修改的代碼取出, 這樣最新代碼跟本地修改的代碼就會混雜在一塊兒, 手工解決衝突後, 提交解決衝突後的代碼。
原理圖:

clipboard.png

clipboard.png

對應到咱們實際項目中, 進入 copyTestGit/testGit 執行指令git pull出現 (重回到上述衝突場景)

error: Your local changes to the following files would be overwritten by merge:
        README.md
Please, commit your changes or stash them before you can merge.
Aborting

將本地修改放入工做現場(成功後本地工做區間的代碼跟本地倉庫代碼會同步), 具體指令:

git stash

遠程倉庫獲取最新代碼,具體指令:

git pull

而後, 取出本地修改的代碼, 具體指令:

git stash pop

而後, git 自動合併衝突失敗, 衝突的代碼就很清晰的展示在咱們面前了:

clipboard.png

clipboard.png

手工解決衝突:

clipboard.png

告訴git, 這個文件(README.md)的衝突 已經解決:

git add README.md

提交代碼(細節參考前述流程):

git commit -am '終於解決衝突啦!'
git push origin master

因而本地有衝突的代碼就提交成功啦!

clipboard.png


後記:

以上不少git指令適合在無圖形化界面的linux中使用(例如:阿里雲服務器操做git), 實際開發中固然是用圖形化界面解決!
例如: git status在window 中對應的就是右鍵->git GUI

clipboard.png

解決衝突之覆蓋本地代碼對應的是: 工程目錄下tortoiseGit(git 小烏龜) 「Revert」 :

clipboard.png

解決衝突之解決衝突後提交本地修改對應的是: 手工合併衝突代碼後,工程目錄下tortoiseGit(git 小烏龜) 「resolve」 :

clipboard.png


參考文章:
1.Git版本控制與工做流
2.圖解git項目代碼
3.如何在window上把你的項目提交到github
4.阮一峯:git 遠程操做詳解
5.少用pull,多用fetch 和 merge


相關文章:
git圖解2:git 代碼回退;
git圖解3:git 分支操做;

相關文章
相關標籤/搜索