前言
使用Git也有幾年了吊说,涉及場景較多的是:
- 學習開源庫治笨。從GitHub上克隆代碼
$ git clone ...
- 公司開發(fā)
// 分支相關
$ git branch
$ git checkout -b dev
$ git checkout dev
// 提交代碼
$ git status
$ git add .
$ git commit -m "..."
$ git pull
$ git push origin dev
其他情況使用命令行如git merge
等較少秉扑,多用IDE(如 Android Studio)自帶的版本控制GUI工具。一般情況下所刀,記得上面幾個命令就足以應付日常工作了嫡霞,如果需要使用其他的命令瓶埋,網上搜一下即可。
最近開始管理小團隊秒际,需要管理分支的創(chuàng)建悬赏、代碼審核狡汉、分支合并娄徊、刪除、沖突解決等等盾戴,開發(fā)的人數開始增多寄锐,以前不常用的命令,現在也要常用了,因此有必要全面的總結下Git的使用橄仆。
可能有人會問剩膘,為什么要學習命令行,熟悉GUI不就可以了嗎盆顾?答案是不可以的怠褐。
只有在命令行模式下你才能執(zhí)行 Git 的 所有 命令,而大多數的 GUI 軟件只實現了 Git 所有功能的一個子集以降低操作難度您宪。 如果你學會了在命令行下如何操作奈懒,那么你在操作 GUI 軟件時應該也不會遇到什么困難,但是宪巨,反之則不成立磷杏。 此外,由于每個人的想法與側重點不同捏卓,不同的人常常會安裝不同的GUI 軟件极祸,但所有人一定會有命令行工具。
本文主要資料參考Git官網-Pro Git教程和廖雪峰的Git教程怠晴。廖寫的東西通俗易懂遥金,非常值得一讀。我的總結盡可能精簡蒜田,初學者可以看廖的教程汰规,了解更詳細的可以看Git官網-Pro Git教程,說的非常詳細物邑,里面有中文文檔溜哮。
Git基礎
三個工作區(qū)域
一個Git項目包括:工作目錄、暫存區(qū)(stage或index)和倉庫目錄色解∶ぃ基本的 Git 工作流程如下:
- 在工作目錄中修改文件。如通過
$ git clone
命令將項目克隆到本地科阎,然后做一些修改述吸。 - 暫存文件,將文件的快照放入暫存區(qū)域锣笨。如通過
$ git add .
命令進行操作蝌矛。 - 提交更新,找到暫存區(qū)域的文件错英,將快照永久性存儲到 Git 倉庫目錄入撒。如通過
$ git commit
命令進行操作。
三種狀態(tài)
工作目錄下的文件分為兩種狀態(tài):已跟蹤或未跟蹤椭岩。
- 未跟蹤茅逮。沒有納入版本控制的文件璃赡。
- 已跟蹤。已跟蹤的文件是指那些被納入了版本控制的文件献雅,在上一次快照中有它們的記錄碉考,在工作一段時間后,它們的狀態(tài)可能處于未修改挺身,已修改或已放入暫存區(qū)侯谁。
已跟蹤的文件分為三種:
- 已提交(committed)。表示數據已經安全的保存在本地倉庫目錄中章钾。
- 已修改(modified)良蒸。表示修改了文件,但還沒保存到暫存區(qū)中伍玖。
- 已暫存(staged)嫩痰。表示對一個已修改文件的當前版本做了標記,即已經放到了暫存區(qū)窍箍,使之包含在下次提交的快照中串纺。
分支結構變更示意
master
指向自己分支的最新提交
HEAD
指向當前分支
-
只有一個主分支時
-
創(chuàng)建并切換到分支dev。即創(chuàng)建一個dev指針指向當前提交椰棘,同時HEAD也指向dev分支
-
修改并提交分支dev
-
合并分支dev到master(默認的快速模式)
-
刪除分支dev
常用命令
使用較多的6個命令
創(chuàng)建
# 創(chuàng)建版本庫纺棺。在當前文件件創(chuàng)建版本庫。
$ git init
# 添加文件邪狞。修改文件后祷蝌,需要把修改后內容添加到暫存區(qū)以備提交》浚“.” 代表所有文件巨朦,也可以添加指定的文件。
$ git add .
# 提交到本地版本庫剑令。
$ git commit -m "本次提交的信息"
# 關聯遠程服務器
$ git remote add origin "遠程倉庫鏈接"
# 推送當前分支信息到遠程服務器糊啡。“origin”代表默認的遠程服務吁津,“master”代表分支棚蓄。
$ git push -u origin master
查看
# 查看狀態(tài)。當前版本目錄的狀態(tài)
$ git status
# 查看提交歷史
$ git log
$ git log --pretty=oneline
$ git log --graph
# 查看命令歷史:checkout碍脏、commit梭依、reset等
$ git reflog
回退、撤銷與刪除
# 版本回退典尾∫鬯回退到歷史版本
# 其中“HEAD^”表示上一個版本,“HEAD^^”表示上上個版本
$ git reset --hard HEAD^
# 版本切換急黎≡回退到歷史版本或跳到最新版本。
# “1094a”表示指定commit id的版本
# 可以通過“git log”命令查看歷史版本commit id
# 或通過通過“git reflog”查看提交記錄
$ git reset --hard 1094a
# 撤銷已修改的文件勃教∮倩鳎恢復到最近一次git commit或git add時的狀態(tài)
$ git checkout -- <file>
# 撤銷已暫存的文件」试矗恢復到已修改狀態(tài)污抬。
# 然后通過“git checkout -- <file>”,恢復到最近一次git commit或git add時的狀態(tài)
$ git reset HEAD <file>
# 刪除文件绳军。在工作區(qū)刪除文件后印机,git add <file> 與 rm <file>效果一致,都可以將變更添加到暫存區(qū)门驾。
# 如果在工作區(qū)誤刪射赛,可以使用“git checkout -- <file>”恢復。
$ git rm <file>
分支管理
命令-創(chuàng)建和切換
# 創(chuàng)建并切換分支
$ git checkout -b dev
# 查看本地分支
$ git branch
# 查看遠程分支
$ git branch -a
# 切換分支
$ git checkout dev
命令-合并
# 在其他分支上合并dev分支
# 默認是Fast-forward模式奶是,直接把master指向dev的當前提交楣责,這種模式下,刪除分支后聂沙,會丟掉分支信息
$ git merge dev
# no-ff模式秆麸,合并后會保存分支信息
$ git merge dev --no-ff
命令-保存和恢復工作現場
# 保存當前工作現場。不提交情況下及汉,可保存當前工作現場沮趣,再并切換到其他分支。
$ git stash
# 查看保存的當前工作現場
$ git stash list
# 恢復并刪除當前工作現場坷随。如果stash有很多房铭,則默認操作最新的一個。
$ git stash pop
# 恢復當前工作現場温眉。僅恢復育叁,不刪除
$ git stash apply
# 刪除工作現場
$ git stash drop
命令-刪除分支
# 刪除本地分支`dev`。
$ git branch -d dev
# 刪除本地分支芍殖。強行刪除沒有合并的分支
$ git branch -D dev
# 刪除遠程分支`dev`豪嗽。
$ git push origin --delete dev
標簽管理
# 增加標簽。默認為HEAD
$ git tag v1.0
# 增加標簽豌骏。針對歷史版本
$ git tag v1.0 <commit id>
# 增加標簽龟梦。附帶說明
$ git tag -a v1.0 -m "version 1.0 release" <commit id>
# 查看所有標簽
$ git tag
# 查看某個標簽
$ git show v1.0
# 推送標簽。增加標簽存儲在本地窃躲,如有必要可以推送到遠程计贰。
$ git push origin v1.0
# 推送所有標簽。
$ git push origin --tags
# 刪除本地標簽
$ git tag -d v1.0
# 刪除遠程標簽蒂窒。先從本地刪除躁倒,再推送到遠程荞怒。
$ git push origin :refs/tags/v1.0
遠程倉庫
# 克隆遠程庫。本地沒有建立項目時秧秉,使用這個
$ git clone <遠程倉庫地址>
# 關聯本地項目到遠程服務褐桌。本地有Git項目時,使用這個象迎。
$ git remote add origin <遠程倉庫地址>
# 從遠程庫更新本地庫荧嵌。多人協(xié)作,遠程有更新時
# 會自動合并
$ git pull
# 不會自動合并
$ git fetch
# 推動本地內容到遠程
$ git push -u origin master
配置信息
# 配置別名
$ git config --global alias.st status
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 配置顏色
$ git config --global color.ui true
# 配置用戶名和郵件
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
# 查看配置
$ git config --list
Git配置信息存儲在配置文件中砾淌,可以在配置文件中直接修改或刪除配置信息啦撮。
- 當期倉庫的配置信息在
.git/config
中 -
--global
的配置信息在用戶主目錄下的.gitconfig
中 -
--system
的配置信息在/etc/gitconfig
中
其中,每一個級別覆蓋上一級別的配置
其他實用命令
# 查看使用手冊汪厨。<verb>表示要查看的命令名
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
常見場景
創(chuàng)建赃春、提交、推送
# 本地沒有項目劫乱,遠程有Git項目
$ git clone <遠程倉庫地址>
$ git add .
$ git commit -m "初始化"
$ git push origin master
# 本地有項目聘鳞,遠程新創(chuàng)建空Git項目
$ git init
# 修改.gitignore文件
$ git add .
$ git commit -m ""
$ git remote add origin <遠程倉庫地址>
$ git push -u origin master
多人協(xié)作
# 合并他人分支、解決沖突
# 新建一個分支要拂,與指定的遠程分支建立追蹤關系
$ git branch --track dev origin/dev
$ git checkout dev
$ git pull
$ git checkout master
$ git merge dev --no-ff
# 如果沒有沖突抠璃,直接就合并好了,如果有沖突脱惰,先解決沖突搏嗡,然后提交
# 如果沖突沒有解決好,希望撤銷這次合并
$ git merge --abort
# 其他待續(xù)
參考
- 說明拉一。圖中圖片皆來自參考鏈接
- 廖雪峰Git教程
- Git官網-Pro Git教程
- 阮一峰-常用Git命令清單