GIT 最簡介易懂的入門筆記

一、序言

一句話解釋GIT是什麼:GIT是一個可以幫助你雲備份代碼的工具(GIT是個工具)

一句話解釋你爲什麼要用GIT:開發應用時,幫助你雲備份代碼,還可以多人合作雲備份

一句話解釋GIT和GitHub和Gitee(碼雲)的關係:GIT一個是推送到雲倉庫的工具,GitHub和Gitee是雲倉庫

三句話看完後你可以決定你是否想看本篇博文了,另外不得不推薦一下官方的視頻【碼雲官方推薦】8小時入門Git之團隊合作講的非常易懂,建議看完第四章再配合食用更佳

二、闡述GIT的最基礎架構

用戶端(本地)

工作區

程序員進行開發改動的地方,是你當前看到的,也是最新的。
平常我們開發就是拷貝遠程倉庫中的一個分支,基於該分支進行開發。在開發過程中就是對工作區的操作。

暫存區

.git目錄下的index文件, 暫存區會記錄git add添加文件的相關信息(文件名、大小、時間戳(timestamp)…),不保存文件實體, 通過id指向每個文件實體。可以使用git status查看暫存區的狀態。暫存區標記了你當前工作區中,哪些內容是被git管理的。
當你完成某個需求或功能後需要提交到遠程倉庫,那麼第一步就是通過git add先提交到暫存區,被git管理。

本地倉庫

保存了對象被提交過的各個版本代碼,比起工作區和暫存區的內容,它要更舊一些。
git commit後同步index的目錄樹到本地倉庫,方便從下一步通過git push推送本地倉庫與遠程倉庫的同步。

雲倉庫(雲端)

遠程倉庫

遠程倉庫的內容可能被分佈在多個地點的處於協作關係的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內容是最舊的。

三、很重要的一個操作和一個指令

Frok操作 Clone命令
Web端的操作 本地執行的命令(git clone + 倉庫地址)
從別人遠程倉庫拷貝到自己遠程倉庫 從(無論誰的)遠程倉庫下載到自己電腦
偷到自己倉庫想怎麼改怎麼改 偷到本地想怎麼用怎麼用
要合併自己的代碼需要pull requests操作 不是項目成員不能推送自己的修改回原倉庫

四、一幅圖看完基礎GIT指令

工作區暫存區本地倉庫遠程倉庫git addgit commitgit pushgit commit -agit clonegit fetchgit mergegit pullgit checkout工作區暫存區本地倉庫遠程倉庫

五、分別用一段話解釋基本用法

從雲端到本地

剛開始工作區本地倉庫遠程倉庫裏面的內容都空的

利用git clone加遠程倉庫地址拉取你的遠程倉庫內容到本地倉庫和本地工作區(clone是從無到有的過程)

此時工作區本地倉庫遠程倉庫裏面的內容都同步了,後面合作者提交新的代碼

用git fetch來更新本地倉庫,與遠程倉庫保持同步

這時本地倉庫遠程倉庫裏面的內容都同步了,工作區的代碼還沒有同步

更新好的的本地倉庫需要利用git merge更新到工作區

工作區本地倉庫遠程倉庫裏面的內容都同步了

當我們這個分支完成後切換到其它分支的時候就用git checkout

git pull = git fetch + git merge

從本地到雲端

剛開始工作區本地倉庫遠程倉庫裏面的內容都是一致

當git管理的文件夾裏面的內容出現改變後(自己的寫入或者刪除)

此時工作區的內容就會跟本地倉庫遠程倉庫裏的不一致

當我們執行 git add 後,會將這些改變的文件內容加入暫存區

暫存區是用來暫時保存文件

接着執行 git commit 後,將Git索引中所有改變的文件內容提交至 本地倉庫 中,

所以此時工作區本地倉庫的內容是一致的,但他們與遠程倉庫內容不一致

最後使用git push同步遠程倉庫本地倉庫

這時工作區本地倉庫遠程倉庫裏面的內容都同步了

git commit -a = git add + git commit

六、進階理解

前提(對本地倉庫的理解)

實際上我們看到的保存文件的文件夾不是倉庫,還是工作區如下圖
本地倉庫
你所有的文件都是工作區,而暫存區和本地倉庫是在.git下的文件,這些文件也不是我們看到的文件而是對於文件的快照

約定

後文中以下面的形式解釋指令的作用
約定
綠色的5位字符表示提交的ID,分別指向父節點。分支用橘色顯示,分別指向特定的提交。當前編輯的分支由附在其上的HEAD標識。 這張圖片裏顯示最後5次提交,ed489是最新提交。 master分支指向此次提交,另一個maint分支指向祖父提交節點。commit的實際是向上提交文件的hash值,hash值可以看成每次提交的歷史紀錄

命令詳解

git diff

查看兩次提交之間的變動
git diff

git commit

從暫存區提交到本地倉庫,變更後會產生新的hash值,可以理解陳產生新的產生新的歷史紀錄
git commit
如果在某個歷史版本的某個分支中產生了新的更改,git會同樣操作。 這樣,從a47c3開始歷史版本產生了兩個節點,maint分支就不再是master分支的祖父節點。此時,合併 (或者 衍合) 是必須的
git commit
如果想更改一次提交記錄,使用 git commit --amend。git會使用與當前提交記錄相同的父節點進行一次新提交(4ca87),舊的提交記錄(ed489)會被取消。
git commit -amend

git checkout

當給定某個文件名時,git會從指定的提交中拷貝文件到暫存區域和工作目錄。比如,git checkout HEAD~ foo.c會將提交節點HEAD~(即當前提交節點的父節點)中的foo.c內容複製到工作目錄並且加到暫存區域中。(如果命令中沒有指定提交節點,則會從暫存區域中拷貝內容),注意當前分支不會發生變化。
git checkout HEAD~ file
當不指定文件名,而是給出一個(本地)分支時,那麼HEAD標識會移動到那個分支(也就是說,我們“切換”到那個分支了),然後暫存區域和工作目錄中的內容會和HEAD對應的提交節點一致。新提交節點(下圖中的a47c3)中的所有文件都會被複制(到暫存區和工作目錄中);只存在於ed489節點中的文件會被刪除;不屬於上述兩者的文件會被忽略,不受影響。
git checkout maint
如果既沒有指定文件名,也沒有指定分支名,而是一個標籤、遠程分支、SHA-1值或者是像master~3(master分支的第三代父類)類似的東西,就得到一個匿名分支,稱作detached HEAD(被分離的HEAD標識)。這樣可以很方便地在歷史版本之間互相切換。比如說你想要編譯1.6.6.1版本的git,你可以運行git checkout v1.6.6.1(這是一個標籤,而非分支名),編譯,安裝,然後切換回另一個分支,比如說git checkout master。
git checkout master~3
當HEAD處於分離狀態(不依附於任一分支)時,git commit提交操作可以正常進行,但是不會更新任何已命名的分支。(你可以認爲這是在更新一個匿名分支。)
git commit
在上面的情況下,一旦此後你切換到別的分支,比如說master,那麼這個提交節點(2eecb)再也不會被引用到,然後就會被丟棄掉了。
git checkout master
但是,如果你想保存這個狀態,可以用命令git checkout -b name來創建一個新的分支。如下使用了git checkout -b new生成了新的分支new
git checkout -b new

git reset

reset命令把當前分支指向另一個位置,並且有選擇的變動工作區和暫存區。也用來在從歷史倉庫中複製文件到暫存區,而不動工作區。

如果不給選項,那麼當前分支指向到那個提交。如果用–hard選項,那麼工作區也更新,如果用–soft選項,那麼都不變,如下圖git reset HEAD~3
git reset HEAD~3
如果沒有給出提交點的版本號,那麼默認用HEAD。這樣,分支指向不變,但是索引會回滾到最後一次提交,如果用–hard選項,工作目錄也同樣。(下圖是 git reset)
git reset
如果給了文件名(或者 -p選項), 那麼工作效果和帶文件名的checkout差不多,除了暫存區被更新。
git reset --file

git marge

merge 命令把不同分支合併起來。合併前,暫存區必須和當前提交相同。如果另一個分支是當前提交的祖父節點,那麼合併命令將什麼也不做。 另一種情況是如果當前提交是另一個分支的祖父節點,就導致fast-forward合併。指向只是簡單的移動,並生成一個新的提交。
git marge master
否則就是一次真正的合併。默認把當前提交(ed489 如下所示)和另一個提交(33104)以及他們的共同祖父節點(b325c)進行一次三方合併。結果是先保存當前目錄和索引,然後和父節點33104一起做一次新提交。
git merge other

git cherry-pick

cherry-pick命令"複製"一個提交節點並在當前分支做一次完全一樣的新提交。
git cherry-pick 2c233

git rebase

衍合是合併命令的另一種選擇。合併把兩個父分支合併進行一次提交,提交歷史不是線性的。衍合在當前分支上重演另一個分支的歷史,提交歷史是線性的。 本質上,這是線性化的自動的 cherry-pick
gtt rebase master
上面的命令都在topic分支中進行,而不是master分支,在master分支上重演,並且把分支指向新的節點。注意舊提交沒有被引用,將被回收。
要限制回滾範圍,使用–onto選項。下面的命令在master分支上重演當前分支從169a6以來的最近幾個提交,即2c33a。

git rebase --onto master 169a6
文章部分引用圖解Git,如有侵權,立即刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章