一. git安裝配置
1. 安裝git
安裝完成后,在任意目錄下 右鍵
==> Git Bash Here
就會彈出命令行窗口腿堤,說明安裝成功。
2. 配置git
配置git
時淮蜈,首先確保擁有 github
賬號般婆。 該步驟配置你的 github
的用戶名和郵箱。
配置命令:(引號內(nèi)換成自己的用戶名和郵箱)
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
查看當(dāng)前git用戶信息
$ git config user.name
$ git config user.email
二. 倉庫管理
1. 創(chuàng)建本地倉庫
創(chuàng)建一個空文件夾作為新的倉庫(選擇一個已存在的目錄也可以) 以 E:\mygit
目錄為例
進(jìn)入 E:\mygit
目錄下, 在該文件夾下 右鍵
==> Git Bash Here
$ git init
Initialized empty Git repository in E:/mygit/.git/
mygit 目錄下會出現(xiàn)一個 .git
目錄,則本地倉庫創(chuàng)建成功萌业。 .git
是進(jìn)行版本跟蹤管理的蔑担。
2. git 區(qū)域介紹
git倉庫創(chuàng)建完成之后包括了工作區(qū)和版本庫,版本庫主要的區(qū)域包括: 暫存區(qū)咽白、 分支
工作區(qū) add 暫存區(qū) commit 分支
(本地目錄) ====>> (stage) ====>> (本地當(dāng)前分支)
工作區(qū): 即工作的區(qū)域,為mygit文件夾
暫存區(qū): 版本庫中的暫存區(qū)鸟缕,稱為stage
分支: Git會自動創(chuàng)建一個master分支晶框,默認(rèn)當(dāng)前分支為master分支
3. git 倉庫操作
在 \mygit
目錄下(工作區(qū))創(chuàng)建一個空文件 test.txt
,并提交到倉庫中懂从。
$ git add test.txt 將test.txt從工作區(qū)加到暫存區(qū)
$ git rm --cached test.txt 將test.txt從暫存區(qū)撤回
$ git commit -m "create test.txt" 將test.txt從暫存區(qū)提交到分支
此時授段,test.txt
被 git
倉庫管理了。
git add
與 git commit
命令:
1 $ git add . 將工作區(qū)中所有內(nèi)容加到暫存區(qū)(注意:有個點(diǎn) . )
2 $ git add file1 file2 將工作區(qū)中的 file1 和 file2 加到暫存區(qū)
3 $ git commit -m "comment" 提交到暫存區(qū)并為該提交添加一個描述信息(便于理解該提交進(jìn)行的修改)
4 $ git commit -am "comment" 該命令是1和3的結(jié)合番甩,效果等同于 `1+3` 操作
5 $ git status 查看當(dāng)前倉庫狀態(tài)
(1) nothing to commit, working tree clean 工作區(qū)和暫存區(qū)干凈
(2)changes not staged for commit 工作區(qū)的修改未add進(jìn)暫存區(qū)
(3) changes to be commit 暫存區(qū)的修改未commit
git diff
命令
git diff 比較的是工作區(qū)和暫存區(qū)的差別
git diff --cached 比較的是暫存區(qū)和版本庫的差別
git diff HEAD -- file 可以查看該文件在工作區(qū)和版本庫里的差別
三. 版本管理
1. 為 test.txt 設(shè)置三個版本
為 \mygit
倉庫中的 test.txt
增加內(nèi)容 abc
侵贵,提交
$ git add test.txt
$ git commit -m "add abc"
為 test.txt
增加內(nèi)容 “This is a version test”
, 提交
$ git add test.txt
$ git commit -m "add sentence"
此時缘薛,倉庫中的test
有三個版本: 創(chuàng)建的test
窍育, 增加 abc
后的test
, 增加“This is a version test
”后的test宴胧。 可以用 git log
查看提交日志信息漱抓。
$ git log
commit 671b83b096c1d68c5c80396252c5d27e299ef315 (HEAD -> master) ===>> 最新一次提交的版本號
Author: wangchangyuan <wangchangyuan@hikvision.com.cn>
Date: Thu Nov 9 16:34:01 2017 +0800
add sentence ===>> 提交的信息
commit 6de209cfd436cd05ffa7d6c82956ed1d400440bc ===>> 歷史提交
Author: wangchangyuan <wangchangyuan@hikvision.com.cn>
Date: Thu Nov 9 16:28:12 2017 +0800
add abd
commit 950f14488316b4839d19983cad220caa584d2a36 ===>> 歷史提交
Author: wangchangyuan <wangchangyuan@hikvision.com.cn>
Date: Thu Nov 9 16:27:19 2017 +0800
create test.txt
git log
的簡化版
$ git log --pretty=oneline
671b83b096c1d68c5c80396252c5d27e299ef315 (HEAD -> master) add sentence
6de209cfd436cd05ffa7d6c82956ed1d400440bc add abd
950f14488316b4839d19983cad220caa584d2a36 create test.txt
2. 版本回退 git reset --hard
當(dāng)前版本用 HEAD
表示 , 上一版本用 HEAD^
表示恕齐,上上版本用HEAD^^
表示乞娄, 每一版本都有自己的版本號,即上面那一長串?dāng)?shù)字显歧。
(1) 回退到上一個版本
$ git reset --hard HEAD^
HEAD is now at 6de209c add abd
(2) 回退到指定版本
$ git reset --hard 950f ===>> 加版本號的前幾位數(shù)字即可
HEAD is now at 950f144 create test.txt
此時HEAD指向的是回退過去的版本仪或。
回退到過去的版本后,還可以再回到未來的某一版本士骤,此時通過 git reflog
找到未來版本的版本號范删,然后設(shè)置head
指向該版本即可。
$ git reflog
950f144 (HEAD -> master) HEAD@{0}: reset: moving to 950f
6de209c HEAD@{1}: reset: moving to HEAD^
671b83b HEAD@{2}: commit: add sentence
6de209c HEAD@{3}: commit: add abd
950f144 (HEAD -> master) HEAD@{4}: commit (initial): create test.txt
$ git reset --hard 671b
HEAD is now at 671b83b add sentence
3. 撤銷修改
3.1 撤銷工作區(qū)的修改
對工作區(qū)的文件進(jìn)行了修改敦间,但還沒有 git add
進(jìn)暫存區(qū)瓶逃, 可以用 git status
看狀態(tài)。撤銷工作區(qū)的修改:
git checkout -- test.txt
3.2 撤銷暫存區(qū)的修改
對工作區(qū)的文件進(jìn)行了修改廓块,并且 git add
進(jìn)了暫存區(qū)厢绝,可以用 git status
看狀態(tài)。撤銷修改:
$ git reset HEAD test.txt ===>> 把暫存區(qū)的修改撤回带猴,重新放入工作區(qū)
$ git checkout -- test.txt ===>> 把工作區(qū)的修改撤回
4. 文件刪除
首先先建立一個文件用于測試演示: test_rm.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted:test_rm.txt
no changes added to commit (use "git add" and/or "git commit -a")
4.1 工作區(qū)的文件誤刪
此時只需要撤銷該操作即可:
$ git checkout -- test_rm.txt
4.2 確認(rèn)刪除版本庫中的文件
$ git rm test_rm.txt ===>> 刪除工作區(qū)中的test_rm.txt
$ git commit -m "delete test_rm.txt" ===>> 提交刪除操作
四. 遠(yuǎn)程倉庫
1. 創(chuàng)建關(guān)聯(lián)遠(yuǎn)程倉庫
遠(yuǎn)程倉庫可以搭建在github
上昔汉,也可以搭建在私有服務(wù)器上。在github
上是圖形操作,可以 create
一個新的倉庫靶病。
對于遠(yuǎn)程的倉庫既可以從遠(yuǎn)程倉庫克隆到本地会通,也可以和已有本地倉庫進(jìn)行連接。
建立連接后娄周,可以查看遠(yuǎn)程倉庫信息:
$ git remote -v
1.1 克隆遠(yuǎn)程倉庫到本地涕侈,遠(yuǎn)程倉庫地址為: git@1.1.1.1:user/moirai.git
在本地一個目錄下克隆
$ git clone git@1.1.1.1:user/moirai.git
從遠(yuǎn)程倉庫克隆時,已經(jīng)自動將 git
本地倉庫的 master
分支和遠(yuǎn)程倉庫的 master
分支對應(yīng)起來了煤辨, 遠(yuǎn)程倉庫默認(rèn)名為 origin
1.2 將已存在的本地倉庫與遠(yuǎn)程倉庫連接裳涛,在本地倉庫主目錄下:(origin
是遠(yuǎn)程庫的名字,默認(rèn)都是origin
)
$ git remote add origin git@1.1.1.1:user/moirai.git
解除與遠(yuǎn)程倉庫的關(guān)聯(lián):
$ git remote remove <name> 默認(rèn)情況下 <name> 是origin
2. 推送遠(yuǎn)程倉庫
有了遠(yuǎn)程倉庫之后众辨,可以把本地倉庫的內(nèi)容推送到遠(yuǎn)程倉庫:
$ git push -u origin master ===>> master是分支名
master
是指把當(dāng)前master
分支推送到遠(yuǎn)程倉庫端三;
-u
是把本地master
分支和遠(yuǎn)程master
分支進(jìn)行關(guān)聯(lián), 之后可以省略-u
參數(shù)
3. 拉取遠(yuǎn)程倉庫
當(dāng)遠(yuǎn)程倉庫被其他人提交修改后鹃彻,自己在 push
時會出錯郊闯, 此時需要先從遠(yuǎn)程倉庫中 pull
最新的提交,如果有沖突則在本地合并后再 push
$ git pull
4. 獲取遠(yuǎn)程倉庫
從遠(yuǎn)程倉庫獲取他人的提交蛛株,但在本地不會自動的merge
团赁。 而 git pull
拉取到本地后會自動merge
$ git fetch origin master
$ git merge origin/master
五. 分支管理
git
倉庫默認(rèn)的分支為 master
主分支,前面版本回退提到的 HEAD
實際是指向當(dāng)前分支 master
谨履, 圖中每個節(jié)點(diǎn)是一次提交然痊,當(dāng)版本回退時實際是將 master
指向了前面的節(jié)點(diǎn)。
[圖片上傳失敗...(image-4dfffa-1551108699579)]
1. 創(chuàng)建分支
在git
倉庫中默認(rèn)處于 master
分支屉符,開發(fā)時一般將 master
分支作為穩(wěn)定版本發(fā)布的分支剧浸,會另建一個分支作為開發(fā)分支。創(chuàng)建一個 develop
分支:
$ git branch develop
2. 切換分支
默認(rèn)所處分支為 master
矗钟, 切換到 develop
分支上去:
$ git checkout develop
其實1+2的功能可以用下面命令合并實現(xiàn):
$ git checkout -b develop ===>>創(chuàng)建并切換到分支 develop
在創(chuàng)建分支的同時與遠(yuǎn)程倉庫的分支對應(yīng)起來:
$ git checkout -b develop origin/develop
或者
$ git branch --set-upstream develop orgin/develop
3. 查看當(dāng)前分支
查看當(dāng)前處于哪個分支:
$ git branch
* develop ===>> 展示出所有分支唆香,當(dāng)前分支前帶 * 號
master
4. 合并分支
4.1 無沖突合并
只在 develop
分支上對 test.txt
進(jìn)行一次修改并提交:
$ git add test.txt
$ git commit -m "add test info for develop"
切換回 master
分支
$ git checkout master
查看 test.txt
文件,發(fā)現(xiàn)剛才的修改不見了吨艇。 這是因為修改是發(fā)生在 develop
分支上躬它,對 master
分支沒影響。
修改完之后可以將 develop
分支與 master
分支進(jìn)行合并东涡。 (注意當(dāng)前是在 master
分支上)
$ git merge develop ===>> 將 develop 分支合并到當(dāng)前 master 分支上
4.2 有沖突合并
在 develop
分支上修改了test.txt冯吓, 同時切換回 master
分支后也進(jìn)行修改, 合并時會有沖突:
$ git merge develop
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
根據(jù)提示要先解決沖突疮跑, 此時查看 Test.txt
內(nèi)容:
abc
this is a git test file.
<<<<<<< HEAD
add merge and conflict for master
=======
add something to test the develop branch.
test branch merge and conflict
>>>>>>> develop
這是因為在不同的分支上對同一個文件都進(jìn)行了修改组贺,需要手動解決沖突,修改完 test.txt
之后重新 git add
并 git commit
即可修復(fù)沖突祖娘。
4.3 查看分支合并
用 git log --graph
可以查看分支合并圖的情況失尖。 --pretty=oneline
表示一行顯示; --abbrev-commit
表示只顯示 commit
版本號和comment信息
$ git log --graph --pretty=oneline --abbrev-commit
* ee60ae5 (HEAD -> master) conflict fixed
|\
| * ee7b768 (develop) add merge info for develop
| * b17679a add test info for develop
* | 1decf7a add merge info for master
|/
* 6970fc4 delete test_rm.txt
* d82b873 add test_rm.txt
* 671b83b add sentence
* 6de209c add abd
* 950f144 create test.txt
4.4 不同合并方式
在4.1 采用的分支合并方式是 Fast forward
模式:
$ git merge develop
Updating ff3d8cc..c283635
Fast-forward
test.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
另一種合并模式是 --no-ff
:
$ git merge --no-ff -m "merge without fast-forward" develop
比較兩者區(qū)別:
Fast-forward: 快速合并模式,將 `HEAD` 快速地指向 `develop` 分支的當(dāng)前提交掀潮。該方式?jīng)]有對合并進(jìn)行 `commit`菇夸,在刪除該分支后會丟失該分支的信息。
--no-ff: 保留分支的 `commit` 歷史信息仪吧, 所以該命令需要有 `-m` 參數(shù)庄新,并增加提交的說明信息。
5. 刪除分支
合并完分支之后薯鼠,可以將其刪除:
$ git branch -d develop
強(qiáng)制刪除:
$ git branch -D develop
6. 暫儲分支
正在某個分支上進(jìn)行開發(fā)摄咆,但臨時需要先建立新分支去進(jìn)行其他的工作,建立分支前需要將當(dāng)前分支的修改進(jìn)行提交人断,但此時修改內(nèi)容還不能 commit
。 此時可以將當(dāng)前分支的修改暫時儲藏起來 git stash
$ git stash
這樣工作區(qū)就是干凈的了朝蜘,可以建立新分支恶迈。
回到剛才分支恢復(fù)工作區(qū)的修改, 有兩種恢復(fù)方式:
$ git stash list ===>> 查看stash的內(nèi)容
1 $ git stash apply ===>> 恢復(fù)stash內(nèi)容谱醇,同時保留了stash內(nèi)容
2 $ git stash pop ===>> 恢復(fù)stash內(nèi)容暇仲,同時刪除了stash內(nèi)容
對于多次stash
的內(nèi)容,在恢復(fù)時可以選擇性的恢復(fù):
$ git stash apply stash@{0} ===>>表示恢復(fù) stash@{0}
六. 標(biāo)簽管理
git 的 commit
版本號是一串很長的數(shù)字副渴,難以區(qū)分版本奈附。 所以為版本打一個容易理解的標(biāo)簽很重要。
-
為當(dāng)前最新版本打標(biāo)簽:
$ git tag v1.0 ===>>為當(dāng)前版本打標(biāo)簽: v1.0
-
為之前提交的版本打標(biāo)簽:
$ git tag v0.1 commit-id ===>>commit-id指的是之前版本提交的版本號id
-
為某個版本打上帶有說明的標(biāo)簽:
$ git tag -a v0.2 -m "comment" commit-id ===>>為commit-id版本打上說明為 “comment”的標(biāo)簽
-
查看當(dāng)前分支中的標(biāo)簽:
$ git tag
-
查看某個標(biāo)簽的詳細(xì)信息:
$ git show v1.0
-
刪除標(biāo)簽:
$ git tag -d v1.0 ===>> 刪除v1.0這個標(biāo)簽
-
標(biāo)簽推送到遠(yuǎn)程倉庫:
$ git push origin v1.0 ===>> 將標(biāo)簽v1.0推送到遠(yuǎn)程 $ git push origin --tags ===>> 將所有標(biāo)簽一次性推送到遠(yuǎn)程
-
刪除遠(yuǎn)程標(biāo)簽:
$ git tag -d v1.0 ===>>先將本地標(biāo)簽刪除 $ git push origin :refs/tags/v1.0 ===>>再將遠(yuǎn)程標(biāo)簽刪除
七. 命令附錄
-
本地倉庫基礎(chǔ)操作
$ git init ==>初始化本地倉庫 $ git add file/files/. ==>增加文件到暫存區(qū) $ git commit -m "comment" ==>提交到版本庫 $ git status ==>查看倉庫狀態(tài) $ git diff ==>查看修改內(nèi)容 $ git log ==>查看提交歷史 $ git reflog ==>查看命令歷史
-
版本操作
$ git reset --hard commit-id ==>版本回退到commit-id $ git reset --hard HEAD^ ==>版本回退到上次提交
-
刪除操作
$ git checkout -- file ==>撤銷工作區(qū)file的修改 $ git reset HEAD file ==>撤銷暫存區(qū)file的修改 $ git rm file ==>刪除工作區(qū)的file $ git commit -m "delete file" ==>提交對file的刪除操作
-
遠(yuǎn)程倉庫操作
$ git remote -v ==>查看遠(yuǎn)程庫信息 $ git remote add origin git@server-name:path/repository.git ==>關(guān)聯(lián)遠(yuǎn)程倉庫 $ git clone git@server-name:path/repository.git ==>克隆遠(yuǎn)程倉庫 $ git push -u origin master ==>首次推送本地master分支內(nèi)容到遠(yuǎn)程倉庫 $ git pull ==>拉取遠(yuǎn)程倉庫內(nèi)容并自動本地融合 $ git fetch ==>拉取遠(yuǎn)程倉庫內(nèi)容煮剧,不自動融合
-
分支操作
$ git branch ==>查看當(dāng)前分支 $ git branch <name> ==>創(chuàng)建新分支 $ git checkout <name> ==>切換到分支 $ git checkout -b <name> ==>創(chuàng)建并切換到新分支 $ git merge <name> ==>將分支合并到當(dāng)前分支 $ git merge --no-ff -m "comment" <name> ==>非Fast-forward方式合并分支到當(dāng)前分支 $ git branch -d <name> ==>刪除分支 $ git branch -D <name> ==>強(qiáng)制刪除分支 $ git log --graph ==>查看分支合并圖 $ git checkout -b branch-name origin/branch-name ==>在本地建立與遠(yuǎn)程分支對應(yīng)的分支 $ git branch --set-upstream branch origin/branch ==>將本地已有的分支與遠(yuǎn)程分支建立關(guān)聯(lián)
-
暫存分支工作現(xiàn)場
$ git stash ==>將當(dāng)前分支的工作現(xiàn)場儲藏 $ git stash list ==>查看儲藏起來的工作現(xiàn)場 $ git stash apply ==>恢復(fù)工作現(xiàn)場斥滤,保留stash內(nèi)容 $ git stash drop ==>刪除stash內(nèi)容 $ git stash pop ==>恢復(fù)工作現(xiàn)場同時刪除stash內(nèi)容
-
標(biāo)簽操作
$ git tag ==>查看當(dāng)前所有標(biāo)簽信息 $ git tag <tag-name> ==>為當(dāng)前分支最新的提交打標(biāo)簽 $ git tag <tag-name> commit-id ==>為當(dāng)前分支 commit-id標(biāo)識的提交打標(biāo)簽 $ git show <tag-name> ==>查看標(biāo)簽 <tag-name> 的詳細(xì)信息 $ git tag -a <tag-name> -m "comment" commit-id ==>為提交打上帶有說明的標(biāo)簽