前言
在項目開發我們不可避免的需要接觸到版本管理,目前市面上最常用的應該就是Git了,而且我比較推薦的是直接使用命令行來進行操作,特別是類似我這種工作中可能需要不同的OS或者不同IDE的,學會了使用命令行,完全不用關心不同的Git工具是如何使用的了。按照Git命令一個一個說作用可能沒有什麼深切的體會,於是我便對我在工作中經常會遇到的一些場景進行一下總結。
常見的場景
1. SSH方式clone代碼(以GitHub爲例)
如果我們使用http的方式進行clone代碼或者其他的git命令方式,就可能會遇到經常需要去輸入賬號密碼去進行身份的驗證,爾換成SSH方式的話,我們便能夠節約出來大量的時間。
- 生成SSH KEY
ssh-keygen -t rsa -b 4096 -C "[email protected]"
使用上面的命令之後一路回車就能成功生成一個沒有密碼的key了。
- 之後我們要找文件id_rsa.pub文件
例如我自己的:
cat /home/z2wenfa/.ssh/id_rsa.pub
3.將文件中文本複製到github中SSH and GPG
keys中點擊new SHH key按鈕添加進入,這時我們就能夠以SSH方式clone代碼啦。
2. Clone代碼到本地
git clone [email protected]:z2wenfa/SpinnerEditText.git
3. 以當前分之爲基礎創建一個新的分支
git checkout -b dev
4. 切換到其他分支
git checkout master
5. 刪除一個分支
git branch -d dev
6. 添加新的文件進行代碼管理(git add)
這個命令主要有兩個作用:
1. 將新文件加入代碼管理。
2. 標記衝突文件爲已修改完成。
git add filePath
其中的filePath爲需要添加的文件的全路徑
我們也可以一次性的提交當前目錄下的全部新增文件到代碼管理
git add -A
7. 提交代碼
需要注意的是Git的代碼提交比svn多一步
- 提交代碼到本地倉庫
git commit -m "代碼提交"
- 將本地倉庫的代碼推送到遠程倉庫
git push origin master
origin:
遠程主機名
master
:遠程分支名
8. 拉取更新本地的代碼爲遠程倉庫的最新代碼
git pull origin master
9. 代碼撤回
- reset --hard
git reset --hard 5870a83
- revert
git revert 5870a83
這兩個命令都會撤回修改,不過他們的不同之處在於revert命令會新建一條revert記錄,而reset --hard則會直接回滾代碼。
10. 合併其它分支的commit到當前分支
例如當前是master分支我們需要合併dev分支的提交,我們先切換到mater分支
git merge dev
11. 重新編輯提交信息
git強制我們每次commit時都必須添加這次提交的描述,所以有時我們可能會覺得這次寫的描述不夠好需要重新再寫這時我們就可以使用–amend命令:
git commit --amend
12. 合併其他分支的某個commit到當前分支
有時我們可能並不想使用merge
命令將其它分支的全部提交都合併到當前分支,此時我們可以使用cherry-pick命令只合並一個commit。
git cherry-pick 30e7497d64445bd5c9571569e0b3fcbfdd2f1ed8
cherry-pick
後面跟的是我們需要合併的那個提交的commit id,我們可以使用git log命令得到。
13. 合併多個commit爲一個commit
在實際開發中一個功能模塊的開發我們可能會commit多次代碼,但是功能模塊開發完成之後我們可能覺得不想有這麼多的commit記錄,這時我們可以用到rebase這個命令
git rebase -i 30e7497d64445bd5c9571569e0b3fcbfdd2f1ed8
16. 一次push提交到多個倉庫中
當我們同一個項目添加了多個遠程倉庫,我們便能夠利用這個命令一次性的將修改提交的commit提交到全部的遠程倉庫中。
git push
17. push全部代碼到一個新的倉庫中
有些時候我們可能需要將一個倉庫的代碼遷到另外一個倉庫,我們需要把全部的代碼全都遷到新的倉庫中,同時我們可能還需要,此時我們便可以使用以下命令:
git push --mirror [email protected]:z2wenfa/SpinnerEditText.git
這個命令便能夠將本地倉庫的代碼以鏡像的方式推送到新的倉庫中.
18. push出現衝突時如何解決
- 調用
git status
查看哪些文件出現了衝突 - 進入每個衝突文件進行修改,確認哪些是正確的內容需要保留的,當一個文件的衝突的被全部解決完成之後,再調用
git add -A
,標記全部的衝突都已經解決。 - 調用
git commit -m "comment"
添加描述 - 調用
git push origin master
推送本地記錄到服務器.
19.代碼改到一半需要在提交前的版本進行修改,但是這時又不想commit代碼時的處理
stash
命令
- 首先我們可以使用
git stash save
保存當前暫存區的所有修改,還原到上次提交前的代碼。 - 當我們處理完了臨時需要處理的事情並提交完成修改記錄之後,我們可以調用
git stash list
獲取緩存的列表。
- 最後我們調用
git stash apply stash@{0}
,還原之前保存到stash中的代碼。
20. 忽略文件.gitignore的添加
我們在編譯項目之後進程會自動生成很多的文件,但是這些文件很可能每次編譯都會發生變化,我們也沒有必要將這些文件上傳到服務器上,所以我們會創建一個配置哪些文件需要被過濾的文檔。
我們可以執行vim .gitignore
命令將需要過濾的文件或者文件夾配置進入。
Android常見的.gitignore文件配置如下:
21. 查看當前分支的提交記錄
git log
22. 常看當前文件的提交記錄
由於我們人員對git命令熟悉的程度不同,很多時候會出現一段好的代碼,結果被另外一個同事合併了一些錯誤的代碼進行,導致系統出問題,這時我們變能夠利用這個命令快速的找到出問題的那段代碼到底是誰改錯了…
git blame filename
23. 添加遠程倉庫
爲了安全起見很多公司的代碼倉庫都是部署在本地的,但是我們作爲開發免不了會出現需要在家修改代碼的情況,這時我們便可以自己在外網再存放一份,這個時候我們可以先使用git push --mirror
在其他倉庫先推送一個倉庫的鏡像過去再在本地添加一個遠程路徑,之後我們便能夠將本地的修改及時的同步到外部倉庫一份,同時我們在外網倉庫的修改,只要通過pull
命令在同步到公司的電腦就行了,這樣既臨時結局了問題,也不需要再做什麼拷貝把在家修改的內容再手動添加過來了,很方便。
git remote add gitee [email protected]:z2wenfa/SpinnerEditText.git
24. Commit了多個記錄後如何合併成一個記錄
日常開發中我們可能每開發好某個功能的一部分我們都會去提交一個commit,但是push到服務器的話可能會顯的太多了,這個時候我們可以使用rebase
這個命令
rebase -i 15612b9c
15612b9c
:想要合併的那組commit的更前一個commitid,可以看到上圖,可以看到上面的pick代表這可以使用也就是說保留這個commit,只要我們把最上面一條commit的pick改成s,這兩個commit便能夠合成一個commit進行push,減少最終push到服務器的commit的數量,讓commit log看起來更加整潔,rebase還有很多用法,可以看上面的圖,多去嘗試下。