初始化一個倉庫
//創(chuàng)建版本庫(倉庫胧砰,其實就是一個目錄)
mkdir fileName
cd fileName
//把這個目錄變成 git 可管理的目錄 (文件夾下多了 .git 文件被隱藏了 < ls -ah 可見 >)
git init
//操作 往fileName文件夾添加文件贩虾,添加了file1.txt , file2.txt
//把修改添加到倉庫
git add * / git add . / git add file1.txt /git add file1.txt file2.txt
//提交到倉庫
git commit -m "說明這次提交做了什么操作嘉熊!"
命令解釋(官方)
git init ---Create an empty Git repository or reinitiallize existing one
git add ---Add file contents to the index
一芙委、GIT配置
git config --global user.name "your name"
git config --global user.email "mail@xx.com"
Git會按照你需要自動為大部分的輸出加上顏色,你能明確地規(guī)定哪些需要著色以及怎樣著色必怜,設(shè)置color.ui為true來打開所有的默認終端著色唆迁。
git config --global color.ui true
Git默認會調(diào)用你的環(huán)境變量editor定義的值作為文本編輯器鸭丛,如果沒有定義的話,會調(diào)用Vi來創(chuàng)建和編輯提交以及標簽信息唐责, 你可以使用core.editor改變默認編輯器
git config --global core.editor vi
git config --global alias.別名 "指定代碼" 設(shè)置alias鳞溉,這樣"別名"就是自己新的命令了
eg git config --global alias.mypuh "pull gitlab my_branch" git mypush === git pull gitlab my_branch
git config -list //列出所有g(shù)it配置
二、命令
前言:
cd /path/to/my/codebase
git init (1) //Create a /path/to/my/codebase/.git directory.
git add . (2) //Add all existing files to the index.
git commit (3) //Record the pristine state as the first commit in the history.
** git add 詳解
** git commit -m / -sm / -am 詳解
- git status //時刻掌握倉庫當前的狀態(tài)鼠哥,告訴你有什么文件做了修改熟菲,是提交了還是未提交等信息
- git diff filename1 //查看filename1具體做了什么修改
git diff *index.js //查看以index.js結(jié)束的文件修改情況(路徑)
git diff || git diff . || git diff * //查看所有文件具體修改
- git log 命令顯示從最近到最遠的提交日志
如下所示:
commit cb926e7ea50ad11b8f9e909c05226233bf755030 //版本號
Author: Michael Liao <askxuefeng@gmail.com> //作者看政,就是config里設(shè)置的
Date: Mon Aug 19 17:51:55 2013 +0800 //該版本提交的時間
wrote a readme file //每次commit的內(nèi)容
git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
版本回退
HEAD 表示當前版本,也就是最新提交的版本
HEAD^
HEAD^^
HEAD^^^.....以此類推
HEAD~98 簡單寫法
- git reset --hard HEAD^ 執(zhí)行后抄罕,順便把工作區(qū)的文件更新了
回退之后允蚣,使用 git log 查看,HEAD 版本信息看不到了,如果后悔了怎么辦呆贿?記得之前版本的Commit ID(不用全部記住嚷兔,一部分就OK)就可以了,必須要知道COMMITID
git reset --hard commitID
- git reflog 記錄你的每一次命令,關(guān)機也可以記錄COMMITID,所以關(guān)機之后也可以往前走一個版本
git reflog是從建庫對這個版本的所有操作記錄(一定是本地從clone之后開始記錄)
git log 是這個版本的保留的操作記錄榨崩,這樣理解沒錯吧 (包括線上的原始記錄)
概念:工作區(qū) & 暫存區(qū) & 版本庫
工作區(qū):就是一個目錄谴垫,我們工作章母,都是在工作區(qū)內(nèi)
工作區(qū)里面有個.git文件母蛛,這個不算工作區(qū),這個是Git的版本庫乳怎!
Git的版本庫里存了很多東西彩郊,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master蚪缀,以及指向master的一個指針叫HEAD秫逝。
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區(qū)询枚;
第二步是用git commit提交更改违帆,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支。
因為我們創(chuàng)建Git版本庫時金蜀,Git自動為我們創(chuàng)建了唯一一個master分支刷后,所以,現(xiàn)在渊抄,git commit就是往master分支上提交更改尝胆。
你可以簡單理解為,需要提交的文件修改通通放到暫存區(qū)护桦,然后含衔,一次性提交暫存區(qū)的所有修改。
git diff #是工作區(qū)(work dict)和暫存區(qū)(stage)的比較
git diff --cached #是暫存區(qū)(stage)和分支(master)的比較
試驗了一下才理解二庵,stage或cache與雖說是暫存區(qū)贪染,緩沖區(qū),但commit并不是像想像那樣把這個區(qū)清空催享,估計只是打個同步的標志杭隙,內(nèi)容還在,就能理解了睡陪。
add 是 把工作區(qū)的更新到暫存區(qū)寺渗,commit是把緩沖區(qū)更新到倉庫匿情。所以經(jīng)過add, commit,修改再add,再修改,就會出現(xiàn)工作區(qū)信殊、緩沖區(qū)炬称、和倉庫三者都不同。
就可以下面的比較了:
git diff 是工作區(qū)和 中間區(qū)比較涡拘,git diff --cached是中間區(qū)和倉庫比較玲躯。
為什么Git比其他版本控制系統(tǒng)設(shè)計得優(yōu)秀,因為Git跟蹤并管理的是修改鳄乏,而非文件
git diff HEAD -- readme.txt 命令可以查看工作區(qū)和版本庫里面最新版本的區(qū)別
撤銷修改
git checkout -- file(指的是相對路徑) : 工作區(qū)的修改全部撤銷跷车,回到修改之前的狀態(tài)
一種是 file 已經(jīng)添加到暫存區(qū)后,又作了修改橱野,現(xiàn)在朽缴,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。
那么如何把暫存區(qū)的修改撤銷掉呢水援?
git reset HEAD file 暫存區(qū)修改撤銷密强,重新放回工作區(qū)
接著 git checkout -- file 就可以回到修改之前
場景1:當你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時蜗元,用命令git checkout -- file或渤。
場景2:當你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時奕扣,想丟棄修改薪鹦,分兩步,第一步用命令git reset HEAD file惯豆,就回到了場景1池磁,第二步按場景1操作。
場景3:已經(jīng)提交了不合適的修改到版本庫時循帐,想要撤銷本次提交框仔,參考版本回退一節(jié),不過前提是沒有推送到遠程庫拄养。
刪除文件:
工作區(qū) ------> 暫存區(qū) ------> 版本庫
rm test.txt 刪除了工作區(qū)的文件离斩,與版本庫不一致了怎么辦?
git status
兩種情況:
1、把版本庫中的文件也刪除
git rm test.txt
git commit -m "remove test.txt"
2瘪匿、誤刪文件跛梗,找回來
git checkout -- file (git checkout 讓暫存區(qū)和工作區(qū)同步,修改刪除棋弥,都可以還原)
遠程倉庫:
遠程新建一個倉庫和本地已有倉庫關(guān)聯(lián)起來核偿!
git remote add origin git@server-name:path/repo-name.git
//我們第一次推送master分支時,加上了-u參數(shù)顽染,Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支漾岳,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來轰绵,在以后的推送或者拉取時就可以簡化命令。
git push -u origin master
git clone git地址
branch control
git checkout -b dev ==== ( git branch dev(創(chuàng)建) , git checkout dev(切換) )
-b 創(chuàng)建并切換
git branch 查看當前分支(當前分支會標上*號)
在dev分支修改之后尼荆,git checkout master 左腔, git merge dev 切換到master分支,再合并指定分支到當前分支
刪除分支 git branch -d dev git branch
解決矛盾:新建一個分支dev 做了修改并commit 切回到master分支捅儒,也做了修改并commit
此時 git merge dev就會產(chǎn)生矛盾
修改之后
git add & git commit
git log --graph 以看到分支合并圖液样。
git log --graph --pretty=oneline --abbrev-commit
no-ff參數(shù)代表合并的時候,保留記錄巧还,沒有該參數(shù)鞭莽,刪除dev 后 ,則沒有 dev 記錄
git merge --no-ff -m "merge with no-ff" dev
git stash 存儲現(xiàn)場
save working derectory and index state WIP on dev:6224973 add merge
HEAD is now at 622437 add merge
技術(shù)總是跟隨場景變化的麸祷!
總存在這樣的情況澎怒,你的工作完成到一半沒有add,沒有commit,未完成的工作一般是不允許commit 否則容易出問題摇锋。保持原來可行版本永遠是最優(yōu)選擇
忽然要修一個BUG 丹拯,很緊迫,怎么辦?工作了那么多可不能丟啊 git stash保存現(xiàn)場吧
在主分支上開一個新分支 git checkout -b bug-01
修復bug 提交
合并 git merge --no-ff -m "xxx" bug-01
刪除新開分支 git branch -d bug-01
回到以前的工作分區(qū) git checkout dev
查看有多少現(xiàn)場 git stash list
只有一個現(xiàn)場 有兩個選擇:
git stash apply && git stash drop (刪除現(xiàn)場荸恕,避免影響后面的工作)
git stash pop (恢復現(xiàn)場并且刪除現(xiàn)場)
若有很多現(xiàn)場
stash@{0}:xxxxx
stash@{1}:xxxxx
stash@{2}:xxxxx
stash@{3}:xxxxx
git stash apply stash@{0}
git stash drop stash@{0}
git branch -D <name> 新分支沒有合并時候,強行刪除分支
刪除遠程關(guān)聯(lián)
git remote remove origin || origin/dev || ...
查看遠程庫信息
git remote
git remote -v(詳細)
完整的操作
1/
git remote add origin git地址
git push origin(遠程倉庫) dev(本地的dev分支)/anybranch
遠程版本比你本地版本高
先pull死相,在push
git pull 提示no tracking information ,要先 git branch --set-upstream branch-name origin/branch-name
2/
git clone ssh_adress
git checkout -b <branch_name> origin/<branch_name>
標簽一般記錄版本(每升一個版本融求,可以打個標簽,下次要看這個版本的時候算撮,不用記住commitID,只要記住你打的標簽即可I稹)
標簽一打,不能修改(說的是不能再次修改標簽指定的版本0构瘛)
打標簽O菥恕:
1、切換到需要打標簽的分支上
git branch
git checkout master
git tag v1.0
OK啦
2审洞、查看所有標簽
git tag
v1.0
v1.2
v2.0
v2.1
v2.2
.....
注意莱睁,標簽不是按時間順序列出,而是按字母排序的芒澜⊙鼋耍可以用git show <tagname>查看標簽信息(其實也滿足了語義化,標簽不就是把一個版本進行語義化記錄嗎痴晦?)
git show v1.0
commitID
author
Date
-m
information
....
-a 表示指定標簽名 南吮,-m說明文字
git tag -a v0.1 -m "version 0.1 released" 3628164
git show v0.1
Tagger: Michael Liao <askxuefeng@gmail.com>
Date: Mon Aug 26 07:28:11 2013 +0800
version 0.1 released
commit 3628164fb26d48395383f8f31179f24e0882e1e0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Tue Aug 20 15:11:49 2013 +0800
append GPL
還可以通過-s用私鑰簽名一個標簽:
git tag -s v0.2 -m "signed version 0.2 released" fec145a
簽名采用PGP簽名,因此誊酌,必須首先安裝gpg(GnuPG)部凑,如果沒有找到gpg露乏,或者沒有g(shù)pg密鑰對,就會報錯:
如果報錯涂邀,請參考GnuPG幫助文檔配置Key施无。
how to handle tag?
刪除標簽
本地刪除
git tag -d <tag_name>
git push origin :refs/tags/<tag_name>
推送遠程
git push origin <tag_name>
一次性推送所有tag
git push origin --tags
pull request *
忽略特殊文件
有些時候,你必須把某些文件放到Git工作目錄中必孤,但又不能提交它們猾骡,比如保存了數(shù)據(jù)庫密碼的配置文件啦,等等敷搪,每次git status都會顯示Untracked files ...兴想,有強迫癥的童鞋心里肯定不爽。
好在Git考慮到了大家的感受赡勘,這個問題解決起來也很簡單嫂便,在Git工作區(qū)的根目錄下創(chuàng)建一個特殊的.gitignore文件,然后把要忽略的文件名填進去闸与,Git就會自動忽略這些文件毙替。
配置別名