此內(nèi)容為內(nèi)部分享,大多內(nèi)容為口述畜侦,無需詳看
Why
- 自己
- 團隊
什么是Git
Git是Linux發(fā)明者Linus開發(fā)的一款新時代免費暴浦、開源的分布式版本控制系統(tǒng)捷枯。
Github與Git關系
引用一下stormzhang 初識 GITHUB的一段話
Git 是一款免費洲尊、開源的分布式版本控制系統(tǒng),他是著名的 Linux 發(fā)明者 Linus Torvalds 開發(fā)的奈偏。說到版本控制系統(tǒng)坞嘀,估計很多人都用過 SVN ,只不過 Git 是新時代的產(chǎn)物惊来,如果你還在用 SVN 來管理你的代碼丽涩,那就真的有些落伍了。不管是學習 GitHub 裁蚁,還是以后想從事編程行業(yè)矢渊,Git 都可以算是必備技能了,所以從現(xiàn)在開始建議你先去學習熟悉下 Git 枉证,后面我會有文章推薦一些適合新手的 Git 學習資料給你們矮男。
而 GitHub 上面說了,主要提供基于 git 的版本托管服務室谚。也就是說現(xiàn)在 GitHub 上托管的所有項目代碼都是基于 Git 來進行版本控制的毡鉴,所以 Git 只是 GitHub 上用來管理項目的一個工具而已,GitHub 的功能可遠不止于此秒赤!
Git與SVN區(qū)別
SVN屬于集中式版本控制系統(tǒng)猪瞬。
Git是分布式版本控制系統(tǒng)。
Git常用命令
本地
- help //幫助
- init //初始化倉庫
- status //查看當前工作區(qū)和暫存區(qū)狀態(tài)
- add //添加修改至暫存區(qū)
- commit //提交暫存區(qū)的修改
- log //查看提交日志信息
- reflog //查看所有分支的所有操作記錄
branch(分支)
git branch branch-name #創(chuàng)建分支
git branch -d branch-name #刪除指定分支
git branch -D branch-name #強制刪除指定分支
checkout (檢出,也具有撤銷功能)
git checkout branch-name #檢出分支
git checkout tag-name #檢出tag
git checkout commit_id #檢出某次commit
git checkout -- file #撤銷還未add進暫存區(qū)的文件
場景:當你改亂了工作區(qū)某個文件的內(nèi)容入篮,還未add至暫存區(qū)陈瘦,想直接丟棄工作區(qū)的修改時,用命令git checkout -- file潮售。
merge & rebase(合并)
#merge(合并)
git checkout master #切換回master分支
git merge featureA #合并目標分支
#rebase(復位基底的)
git checkout master #切換回master分支
git rebase featureA #合并目標分支
rebase 跟 merge 的區(qū)別你們可以理解成有兩個書架甘晤,你需要把兩個書架的書整理到一起去,第一種做法是 merge 饲做,比較粗魯暴力,就直接騰出一塊地方把另一個書架的書全部放進去遏弱,雖然暴力盆均,但是這種做法你可以知道哪些書是來自另一個書架的;第二種做法就是 rebase 漱逸,他會把兩個書架的書先進行比較泪姨,按照購書的時間來給他重新排序,然后重新放置好饰抒,這樣做的好處就是合并之后的書架看起來很有邏輯肮砾,但是你很難清晰的知道哪些書來自哪個書架的。
只能說各有好處的袋坑,不同的團隊根據(jù)不同的需要以及不同的習慣來選擇就好仗处。
reset(回退)
git reset HEAD^ #回退至上一版本, 并重置緩存區(qū)
git reset HEAD~10 #回退至10個版本之前, 并重置緩存區(qū)
git reset --soft HEAD #回退時不重置緩存區(qū)和工作區(qū)
git reset --mixed HEAD #回退時重置緩存區(qū), 默認選項
git reset --hard HEAD #回退時重置緩存區(qū)和工作區(qū)
git reset #不指定HEAD, 用來清空緩存區(qū)的修改
git reset filename #清空緩存區(qū)指定文件的修改
git reset --hard #不指定HEAD, 用來清空工作區(qū)和緩存區(qū)的修改
場景:當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改婆誓,分兩步吃环,第一步用命令git reset HEAD file,就回到了checkout場景
tag(標簽)
git tag tag-name #在最新提交的commit上打標簽
git tag tag-name commit_id #指定某次commit上打標簽
git tag -a tag-name -m "message" #在最新提交的commit上打標簽并添加說明信息
git show tag-name #查看tag信息
config(配置)
#必須配置
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
#alias(別名)
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
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"
diff(比較差異)
git diff <$id1> <$id2> # 比較兩次提交之間的差異
git diff <branch1>..<branch2> # 在兩個分支之間比較
git diff --staged # 比較暫存區(qū)和版本庫差異
clean(清除未跟蹤的文件)
git clean -d # 刪除未跟蹤目錄以及目錄下的文件洋幻,如果目錄下包含其他git倉庫文件郁轻,并不會刪除(-dff可以刪除)。
git clean -f # 如果 git cofig 下的 clean.requireForce 為true文留,那么clean操作需要-f(--force)來強制執(zhí)行好唯。
git clean -i # 進入交互模式
git clean -n # 查看將要被刪除的文件,并不實際刪除文件
stash(儲藏)
git stash 或 git stash save #儲藏修改的跟蹤文件與暫存改動
git stash list #查看儲藏的列表
git stash apply stash@{x} #回復儲藏燥翅,可以不指定id骑篙,代表最近的儲藏
git stash drop stash@{x} #刪除儲藏,可以不指定id权旷,代表最近的儲藏
git stash pop stash@{x} #回復并刪除儲藏替蛉,可以不指定id,代表最近的儲藏
遠程
clone(克隆)
#ssh協(xié)議
git clone git@xxx:xxx/xxx.git
#https協(xié)議
git clone https://github.com/Walkud/OptUI.git
Git支持多種協(xié)議拄氯,包括https躲查,但通過ssh支持的原生git協(xié)議速度最快。
使用https除了速度慢以外译柏,還有個最大的麻煩是每次推送都必須輸入口令
push(推送)
git push origin branch-name #推送至遠程倉庫對應分支上
pull(抓取)
git pull <remote> <branch>
remote(遠程)
git remote #查看倉庫
git remote -v #顯示倉庫更詳細信息
忽略文件
Git工作區(qū)的根目錄下創(chuàng)建一個特殊的.gitignore文件镣煮,然后把要忽略的文件名填進去,Git就會自動忽略這些文件鄙麦。
場景
誤提交或需求變更場景
已經(jīng)提交了不合適的修改到版本庫時典唇,只能使用版本回退。HEAD指向的版本就是當前版本胯府,因此介衔,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id骂因。
穿梭前炎咖,用git log可以查看提交歷史,以便確定要回退到哪個版本寒波。
要重返未來乘盼,用git reflog查看命令歷史,以便確定要回到未來的哪個版本俄烁。
團隊協(xié)作
資料
代碼回滾:Reset绸栅、Checkout、Revert的選擇
問題
項目初期在某人一個分支上添加一個庫后页屠,怎么把該庫單獨提交到公共分支上