Git初級全攻略

轉載請注意:http://blog.csdn.net/wjzj000/article/details/77882874

本菜開源的一個自己寫的Demo,希望能給Androider們有所幫助,水平有限,見諒見諒…
https://github.com/zhiaixinyang/PersonalCollect (拆解GitHub上的優秀框架於一體,全部拆離不含任何額外的庫導入)
https://github.com/zhiaixinyang/MyFirstApp(Retrofit+RxJava+MVP)

寫在前面

之前都是使用AndroidStudio自帶的圖形化命令行,而身邊的同事都是清一色的命令行…在如此的氛圍之下,催生出了這篇記錄學習的博客。
這篇博客並非如同文檔那樣一行行去講解怎麼用。而且記錄我對Git的理解,以及導師給我講的內容。


開始

初始化

我們如果想要對一個文件下的內容進行git管理,我們首先要進入這個目錄下,然後執行:

git init

執行完畢後,我們可以看到這個目錄下看到一個隱藏的.git文件,裏邊包含我們的git管理的信息。
比如在config裏會記錄我們的遠程服務倉庫的地址信息,以及依賴的子庫情況…


暫存區的小操作

初始化過後我們就可以進行常用的git操作了。

我們改動某些文件後,git add xxx。(如果我們修改內容過多可以使用git add .)將xxx文件添加到暫存區。進入暫存區之後,我們的commit就可以追蹤到文件的變化。

關於git rm以及rm的區別:

  • rm:正常的刪除文件的命令(和正常修改文件一樣,刪除也會被追蹤記錄,可依然可以checkout操作)。
    如果這個文件下面還有文件,想要一股腦全部刪掉,就使用rm -r;如果想要不問三七二十一強制刪除,可以使用rm -rf。
  • git rm:刪除文件並將其加入到暫存區。此命令不能刪除空文件。因爲直接進入了暫存區,因此我們想要進行撤銷的操作不能單純使用checkout命令,要是reset了命令。具體操作請參考版本回退小節。

使用git commit -m "我要commit暫存區所有內容"。此命令一出,暫存區所有內容將被我們提交。那麼此時我們使用git status會得到一個乾淨的工作區。

此時我們當前的內容便是最新的內容,如果後悔了,不想這次提交,怎麼辦?


版本回退

情況1:

如果我們完成了一些工作,進行了一次add操作(沒有commit),並且接下來我們只是在工作區搞事情,沒有涉及到add以及commit,那麼如果我們想撤銷現在工作區的操作,那麼使用git checkout xxx,此條命令一出,我們的工作區的文件便被撤銷,回退到暫存區的狀態了。

此命令適用於場景:我們add的一部分操作,並且在這個add基礎上進行了新內容的增加,如果我們感覺新加的內容沒有意義,那麼直接checkout就可以刪除這些無意義的內到,回退到我們add時候的狀態。
如果暫存區沒有我們add的這個文件的記錄,那麼我們將不能checkout。

情況2:

如果我們把我們的先add了一次文件,並且沒有新的內容增加(此時沒有進行commit),而此時我們想要對之前add的內容進行撤銷,那麼此時我們就可以使用git reset HEAD xxx,此命令一出我們的xxx便退出了暫存狀態,愛怎麼checkout怎麼checkout。

之前我對一些checkout/reset操作很迷,其實很簡單:

  • 當我們當前的修改沒有被add時,可以使用checkout將當前的修改內容全部丟棄。

  • 如果我們已經將修改內容add了,那麼我們想要丟棄這些修改的內容,要使用reset,它的作用就是把add的修改在從暫存區拿出來。這樣我們就回到了剛纔那種情況,checkout即可。

情況3:

如果對我們的操作進行了commit操作,因爲此時我們已經把工作內容提交了,所以我們此時的回退,只能回退到之前的提交版本。比如我們提交了一次git commit -m "v_1.0.0",此後我們有提交了一次git commit -m "v_1.0.1",以及git commit -m "v_1.0.2"。那麼此時我們存在了3次提交,如果我們使用git log我們就可以看到這三次提交詳細內容。如果我們想回退到v_1.0.0這個版本,那麼我們需要在log中複製一下對應提交的SHA1,也就是那一串很長的字母與數字相錯的字符串(不需要全複製,複製部分即可)。
回退的命令如下git reset --hard d1022e5,此命令一出,我們的版本回到了v_1.0.0,如果此時我們再次使用git log我們會發現v_1.0.1和v_1.0.2沒了…如果我們後悔了想要再次回到v_1.0.2怎麼辦?我們使用git reflog找到我們提交操作所有備份,找到對應v_1.0.2的SHA1的值,git reset --hard 對應的SHA1即可。
當然這裏也有一些不需要查找SHA1值的回退操作,比如:git reset --hard HEAD^回退到上一個版本。以及git reset --har HEAD~5回退到上5個版本。

我們在使用git log時,會進入log界面,此時敲一下q便會退出log界面。
git log -2:表示只顯示2個提交日誌。


分支管理

命令branch:

git branch -vv顯示當前本地分支對應追蹤的線上分支情況
git branch -u [remotename]/[branch]改變當前分支的追蹤對象
git branch顯示當前分支
git branch dev創建dev分支

命令checkout:

git checkout dev切換到dev分支
git checkout -b dev創建並切換到dev分支
git branch -d dev刪除當前分支,此條命令的前提:不能刪除當前分支,刪除的分支必須已經被合併
git branch -D dev不問青紅皁白直接刪除

命令merge:

git merge dev把dev分支的內容合併到自己這個分支上來,如果出現衝突(倆條分支都在同一行內容上進行了修改),需要合併者手動修改後在進行commit等一系列後續操作。

我們在當前分支進行的add,commit是不會影響到其他分支的操作。並且我們在沒有進行commit的時候,是不允許就行切換分支操作。

但是如果我們情況實在緊急沒辦法等到這個分支任務完成commit後再切換到其他分支進行工作改怎麼處理?
此時我們將使用git stash此命令代表的含義是,先把我們當前分支工作區(也就是沒有commit)的內容先存一下,我一會再回來用。那麼既然當前的內容已經被存了,我們就可以切換分支去進行其他操作了。(注意stash完了之後,我們此時的內容是最新的commit一至,此時在沒有恢復stash不要直接在此分支上進行操作)

在其他分支操作完畢後,緊接着便是回到我們自己並未完成工作的分支上去,checkout過來之後,我們此時我們有倆個命令可以選擇:

  • git stash apply:此命令默認回到最新的一次stash記錄。這也就是說明了一個問題:stash存在記錄,允許存在多次stash。也就是說只要我們能找到stash的記錄,我們就可以切換到具體記錄的stash工作內容。但是這裏有一個前提。stash保留的工作內容要和當前的commit不一樣。如果一樣那就沒有什麼意義…當然我們也可以將當前的版本回退到之前的版本在進行stash。
    這裏我們如果我們的stash存在對跳記錄那麼我們的git stash apply默認調出的是最新的stash,如果我們想要其他的,我們可以使用git stash list查看想要的某一個stash記錄,然後使用git stash apply stash@{x}(x代表對應的版本)即可。
  • git stash pop:彈出最新的stash並且把它從stash list之中刪除。

命令rebase:

提到merge必須要要談一談rebase:
二者都是對分支內容進行合併,不同點文檔說的很詳細,簡單來說:merge方式的合併會保留分支結構lrebase會把所有分支合併成一條線的結構。

!個人被坑的地方:二者在處理合並衝突時不同:

  • merge:修完衝突正常add/commit即可

  • rebase:遇到衝突會被移動到一個臨時分支上,處理好衝突之後,要使用git rebase –continue操作回到自己的分支。如果不這麼搞,會出現很麻煩的問題…

rebase在進行合併時會把當前分支的所有提交複製一份副本讓後往想要合併的分支上去合併,每遇到一個衝突,都會停下來讓你去解決,然後–continue繼續進行合併,直到所有合併完成。
當然也可以使用rebase –abort,放棄合併,回退到沒合併的狀態。


遠程倉庫

正常情況下,我們都是進行了協同開發。因此我們勢必需要一個共我們多人協同開發的服務器。這裏比如我們使用了GitHub對我們的公共倉庫進行託管。
那麼我們只需要爲我們當前這臺機器生成一個ssh文件,並且把ssh的公鑰設置到我們的GitHub上。我這樣我們就可以我們自己的本地和我們自己的GitHub進行pull和push操作了。
那如果我想讓我的其他基友也參與該怎麼辦?根據我們剛纔的理論,只需要把基友的ssh公鑰設置到我們的這個GitHub賬號上來即可。
亦或者在GitHub之中手動添加協同用戶。

正常我們本地與服務端建立聯繫,我們會通過clone的方式git clone xxx(xxx是遠程端的git的clone地址),在本地建立複製一個遠程庫,並建立關係。默認的名字是origin。我們可以在當前文件中的隱藏文件.git中的config之中看到具體的設置內容。

這是一種情況,另一種是通過add的方式,git remote add myremote xxx,執行後如果我們進入config就會看到git爲我們自動設置了一個名字爲myremote的遠程庫的關係。

這樣我們就可以正常的使用git pull/push myremote master,進行拉和退的過程。這裏的myremote是我們在config之後設置的名字,master是對應遠程端的分支。

命令submodule:

有時我們會遇到這種情況,clone的項目依賴了其他的項目。這個時候clone是不會把依賴的子庫也clone下來的,我們需要手動git submodule init,然後又git submodule update即可。

使用git ls -remote可以查到當前的線上分支情況
從線上拉下一個分支,在本地創建自己設置的名字的分支上:git checkout -b [branch] [remotename]/[branch]
從線上拉下一個分支,在本地創建同名的分支上:git checkout –track [remotename]/[branch] (track前有倆個-)
刪除線上分支:git push [remotename] –delete [branch]


尾聲

日後遇到更多的git的tips時,會保持持續的更新。

最後希望各位看官可以star我的GitHub,三叩九拜,滿地打滾求star:
https://github.com/zhiaixinyang/PersonalCollect
https://github.com/zhiaixinyang/MyFirstApp

發佈了106 篇原創文章 · 獲贊 74 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章