《Git的前因后果》因何而來天揖?
2018年3月份之前摸屠,番茄開發(fā)一直使用的是svn作為版本管理工具,對git知之甚少。4月份步入新的工作環(huán)境顶别,也隨著潮流接觸到了Git以及GitHub谷徙、GitLab、碼云這類遠(yuǎn)端管理工具驯绎。雖然git和svn完全是兩種模式完慧,但是我更傾向于git,為什么剩失?不怕笑話屈尼,我是2017年下半年才接觸到了分布式開發(fā),Spring Boot和Spring Boot兩大框架拴孤,而git也是一種分布式理念的產(chǎn)物脾歧,自然而然就摒棄掉了svn。而且在我看來演熟,git以及類似GitHub這類遠(yuǎn)端代碼管理工具鞭执,給我?guī)淼淖畲笫芤嬷幘褪潜WC了代碼不易丟失并省去了代碼存儲工具(如svn的中央服務(wù)器)。因此自然而然投入了Git的懷抱中芒粹。
Git 工作流程:
- 克隆 Git 資源作為工作目錄兄纺。
- 在克隆的資源上添加或修改文件。
- 如果其他人修改了是辕,你可以更新資源囤热。
- 在提交前查看修改猎提。
- 提交修改获三。
- 在修改完成后,如果發(fā)現(xiàn)錯誤锨苏,可以撤回提交并再次修改并提交疙教。
Git 工作區(qū)、暫存區(qū)和版本庫:
- 工作區(qū):就是你在電腦里能看到的目錄伞租。
- 暫存區(qū):英文叫stage, 或index贞谓。一般存放在 ".git目錄下" 下的index文件(.git/index)中,所以我們把暫存區(qū)有時也叫作索引(index)葵诈。
- 版本庫:工作區(qū)有一個隱藏目錄.git裸弦,這個不算工作區(qū),而是Git的版本庫作喘。
備注:圖中的 objects 標(biāo)識的區(qū)域為 Git 的對象庫,實際位于 ".git/objects" 目錄下泞坦,里面包含了創(chuàng)建的各種對象及內(nèi)容窖贤。
Git 命令(基礎(chǔ)):
$ git config --global user.name 'username' //Git為你的每一個提交都記錄你的名字與電子郵箱地址,所以第一步需要配置用戶名和郵箱地址
$ git config --global user.email 'email'
$ git init //使用當(dāng)前目錄作為Git倉庫。
$ git init <newrepo> //當(dāng)前目錄下新建newrepo文件夾作為Git倉庫赃梧。
$ git add <file> //當(dāng)對工作區(qū)修改(或新增)的文件執(zhí)行 "git add" 命令時滤蝠,暫存區(qū)的目錄樹被更新,同時工作區(qū)修改(或新增)的文件內(nèi)容被寫入到對象庫中的一個新的對象中授嘀,而該對象的ID被記錄在暫存區(qū)的文件索引中物咳。
$ git commit -m '<remark>' //暫存區(qū)的目錄樹寫到版本庫(對象庫)中,master 分支會做相應(yīng)的更新蹄皱。即 master 指向的目錄樹就是提交時暫存區(qū)的目錄樹所森。
$ git clone <repo> //從現(xiàn)有Git倉庫中拷貝項目。
$ git clone <repo> <directory> //從現(xiàn)有Git倉庫中拷貝項目到指定的目錄夯接。
$ git status //文件狀態(tài)查詢焕济。
$ git status -s
$ git remote add origin <repo> //新增遠(yuǎn)端倉庫路徑。
$ git push -u origin master //將本地更新推送到遠(yuǎn)端倉庫的主分支上盔几。
git status -s 狀態(tài)碼解析:
狀態(tài)碼 | 含義 |
---|---|
A | 你本地新增的文件(服務(wù)器上沒有) |
C | 文件的一個新拷貝 |
D | 你本地刪除的文件(服務(wù)器上還在) |
M | 文件的內(nèi)容或者mode被修改了 |
R | 文件名被修改了 |
T | 文件的類型被修改了 |
U | 文件沒有被合并(你需要完成合并才能進(jìn)行提交) |
X | 未知狀態(tài)(很可能是遇到git的bug了晴弃,你可以向git提交bug report) |
? | 未被git進(jìn)行管理,可以使用git add file1把file1添加進(jìn)git能被git所進(jìn)行管理 |
Git 命令(高級):
$ git diff //尚未緩存的改動逊拍。
$ git diff --cached //查看已緩存的改動上鞠。
$ git diff HEAD //查看已緩存的改動與未緩存的所有改動。
$ git diff --stat //顯示摘要而非整個芯丧。
$ git reset HEAD //取消已緩存的內(nèi)容芍阎。
//如果只是簡單地從工作目錄中手動刪除文件,運行 git status 時就會在 Changes not staged for commit 的提示缨恒。
$ git rm <file> //從Git中移除某個文件谴咸,就必須要從已跟蹤文件清單中移除,然后提交骗露。
$ git rm -f <file> //如果刪除之前修改過并且已經(jīng)放到暫存區(qū)域的話岭佳,則必須要用強制刪除選項 -f。
$ git rm --cached <file> //如果把文件從暫存區(qū)域移除萧锉,但仍然希望保留在當(dāng)前工作目錄中珊随,換句話說,僅是從跟蹤清單中刪除柿隙,使用 --cached 選項即可叶洞。
$ git mv <filename> <filename> //用于移動或重命名一個文件、目錄禀崖、軟連接衩辟。
Git 命令(查看提交歷史):
$ git log //列出歷史提交記錄。
$ git log --oneline //查看歷史記錄的簡潔的版本帆焕。
$ git log --oneline --graph //查看歷史中什么時候出現(xiàn)了分支惭婿、合并不恭。以下為相同的命令,開啟了拓?fù)鋱D選項财饥。
$ git log --reverse --oneline //逆向顯示所有日志换吧。
$ git log --author=<name> //只查找指定用戶的提交日志。
//指定日期钥星,可以執(zhí)行幾個選項:--since 和 --before沾瓦,以及--until 和 --after。
$ git log --oneline --before={} --after={} --no-merges //查看Git項目中三周前且在四月十八日之后的所有提交(--no-merges 選項以隱藏合并提交)谦炒。
Git 分支管理(必殺技)
$ git branch //列出全部分支贯莺。
$ git branch <branchname> //創(chuàng)建分支。
$ git checkout <branchname> //切換分支宁改。
$ git checkout -b <branchname> //創(chuàng)建新分支并立即切換到該分支下缕探,從而在該分支中操作。
$ git branch -d <branchname> //刪除分支还蹲。
//合并分支爹耗,首先切換到要合并的分支(如,我要將branchtest合并到master上谜喊,那么就要先切到master分支上)潭兽。
$ git merge <branchname> //合并branchname分支到當(dāng)前分支。
合并沖突:這是很多第一次接觸git的小白最害怕發(fā)生的狀況斗遏,其實大可不必山卦,三步解決。
1.git merge <branchname>之后提示沖突诵次,在提示內(nèi)容中會明確告訴你沖突的位置账蓉。
2.手動解決沖突。
3.將修改的文件藻懒,git add剔猿,git commit即完成沖突的解決,不需要再次執(zhí)行g(shù)it merge <branchname>命令嬉荆。
參考:RUNOOB.COM Git教程、git status -s 狀態(tài)碼解析
愚見:實戰(zhàn)一次git的常用命令酷含,親手解決一次沖突鄙早,你便不再覺得git是你的“BUG”了。