Git的使用
基礎(chǔ)操作
- git init 初始化一個倉庫
- git add readme.txt 添加一個文件到版本控制
- git commit -m "add a readme file" 提交文件并添加一個說明
- git status 查看倉庫的當(dāng)前狀態(tài),下面的命令告訴我們,readme文件被修改了领迈,但是還沒有提交钞螟。
PS D:\learngit> git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
- git diff readme.txt 查看具體修改內(nèi)容,13,14行表名了文檔內(nèi)容修改部分
PS D:\learngit> git diff readme.txt
diff --git a/readme.txt b/readme.txt
index d8036c1..7b4104a 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
\ No newline at end of file
- git log (--pretty=oneline) 顯示從最近到最遠(yuǎn)的提交日志,一行顯示膜蠢。前面的一長串字母加數(shù)字的組合是SHA1值
PS D:\learngit> git log
commit 7e4d2e7ca2c64acba9d4580112f2d111681ae30e
Author: Sunxin <sunxin0630@gmail.com>
Date: Wed Jun 28 16:53:17 2017 +0800
append GPL
commit 8ba42d2299510a66489741269a789e9a3fa31691
Author: Sunxin <sunxin0630@gmail.com>
Date: Wed Jun 28 16:51:36 2017 +0800
add distributed
commit 67ae9c91bce5b91e54a722d091f13c1de425b9a3
Author: Sunxin <sunxin0630@gmail.com>
Date: Wed Jun 28 16:36:25 2017 +0800
wrote a readme file
PS D:\learngit> git log --pretty=oneline
7e4d2e7ca2c64acba9d4580112f2d111681ae30e append GPL
8ba42d2299510a66489741269a789e9a3fa31691 add distributed
67ae9c91bce5b91e54a722d091f13c1de425b9a3 wrote a readme file
版本回退
- git reset --hard HEAD^ 回退到上一個版本忌愚,在git中HEAD代表當(dāng)前版本誊役,HEAD代表上個版本婿脸,HEAD^代表上上個版本础倍,HEAD是一個指針
PS D:\learngit> git reset --hard HEAD^
HEAD is now at 8ba42d2 add distributed
PS D:\learngit> cat readme.txt
Git is a distributed version control system.
Git is free software.
- git reset --hard 7e4d2e7 回退過版本之后又后悔了,想要回去怎么辦徒蟆,只需要記著原來的commit id即可胁出,這樣就可以指定回到未來的某個版本
PS D:\learngit> git reset --hard 7e4d2e7
HEAD is now at 7e4d2e7 append GPL
PS D:\learngit> cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
- git reflog 想要回到未來卻找不到commit id怎么辦,此命令用來記錄用戶操作的每一次命令,這樣就可以找到每一次操作的commit id了段审。
PS D:\learngit> git reflog
7e4d2e7 HEAD@{0}: reset: moving to 7e4d2e7
8ba42d2 HEAD@{1}: reset: moving to HEAD^
7e4d2e7 HEAD@{2}: commit: append GPL
8ba42d2 HEAD@{3}: commit: add distributed
67ae9c9 HEAD@{4}: commit (initial): wrote a readme file
工作區(qū)和暫存區(qū)
工作區(qū)(Working Directory):能看到的一個目錄
暫存區(qū)(stage):隱藏目錄不算工作區(qū)全蝶,而是版本庫,版本庫中存放著名為stage or index 的暫存區(qū)寺枉,還有g(shù)it自動為我們創(chuàng)建的第一個分支master抑淫,以及指向master的一個指針HEAD。
- git add 是把文件添加進(jìn)去姥闪,實(shí)際上就是把文件修改添加到暫存區(qū)
- **git commit **提交更改始苇,實(shí)際上就是把暫存區(qū)的文件提交到當(dāng)前分支
管理修改
為什么Git比其他版本控制系統(tǒng)設(shè)計(jì)的優(yōu)秀?因?yàn)間it跟蹤管理的是文件的修改甘畅,而非文件埂蕊。
小結(jié):每次修改,如果不
add
到暫存區(qū)疏唾,那就不會加入到commit
中
- git diff HEAD -- readme.txt 查看工作去和版本庫里面最新版本的區(qū)別
撤銷修改
- git checkout -- readme.txt 當(dāng)修改了工作區(qū)的某個文件的內(nèi)容蓄氧,想直接丟棄工作區(qū)的修改時使用。
- git reset HEAD readme.txt 當(dāng)修改了工作區(qū)的某個文件內(nèi)容并且添加到了暫存區(qū)槐脏,使用該命令就可以回到添加暫存區(qū)之前喉童,然后使用第一個命令就可以撤銷修改。
- 如果已經(jīng)把修改commit顿天,想要撤銷修改堂氯,可以進(jìn)行版本回退,前提是沒有提交遠(yuǎn)程倉庫牌废。
刪除文件
在工作區(qū)刪除了一個已經(jīng)提交到倉庫的文件咽白,可能有兩種情況:
誤刪,這時候就要工作區(qū)和版本庫就不一致了鸟缕,可以把誤刪的文件恢復(fù)
**`git checkout -- test.txt`** 用版本庫里面的版本替換工作區(qū)的版本晶框,一鍵還原
-
真的想刪除該文件
git rm test.txt
git commit -m "remove test.txt"
命令
git rm
用于刪除一個文件。如果一個文件已經(jīng)被提交到版本庫懂从,那么你永遠(yuǎn)不用擔(dān)心誤刪授段,但是要小心,你只能恢復(fù)文件到最新版本番甩,你會丟失最近一次提交后你修改的內(nèi)容侵贵。
分支管理
使用情景:
? 假設(shè)你準(zhǔn)備開發(fā)一個新功能,但是需要兩周才能完成缘薛,第一周你寫了50%的代碼窍育,如果立刻提交卡睦,由于代碼還沒寫完,不完整的代碼庫會導(dǎo)致別人不能干活了蔫骂。如果等代碼全部寫完再一次提交么翰,又存在丟失每天進(jìn)度的巨大風(fēng)險。現(xiàn)在有了分支辽旋,就不用怕了浩嫌。你創(chuàng)建了一個屬于你自己的分支,別人看不到补胚,還繼續(xù)在原來的分支上正常工作码耐,而你在自己的分支上干活,想提交就提交溶其,直到開發(fā)完畢后骚腥,再一次性合并到原來的分支上,這樣瓶逃,既安全束铭,又不影響別人工作。
分支的切換時使用HEAD指針厢绝,所以git切換分支速度很快契沫。
創(chuàng)建與合并分支
-
git branch
查看分支 -
git branch <name>
創(chuàng)建分支 -
git checkout <name>
切換分支 -
git checkout -b <name>
創(chuàng)建+切換分支 -
git merge <name>
合并某分支到當(dāng)前分支 -
git branch -d <name>
刪除分支
解決沖突
當(dāng)兩個分支修改了文件的同一個地方并且都分別有了新的提交,在這種情況下昔汉,Git無法執(zhí)行“快速合并”懈万,只能試圖把新的提交合并起來,這樣就可能造成沖突靶病。我們必須手動解決沖突之后再提交会通,git status 也可以查看沖突的文件
PS D:\learngit> git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
也可以直接查看源文件
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
Creating a new branch is quick AND simple.
- 查看分支合并圖
PS D:\learngit> git log --graph --pretty=oneline --abbrev-commit
* 2b7d8c2 conflict fixed
|\
| * f8cde07 AND simple
* | ec07ee4 & simple
|/
* 0057b61 branch test
* 5fc1cd2 remove test.txt
* e1161a9 add a test file
分支策略
在實(shí)際開發(fā)中,我們應(yīng)該按照幾個基本原則進(jìn)行分支管理:
首先娄周,
master
分支應(yīng)該是非常穩(wěn)定的涕侈,也就是僅用來發(fā)布新版本,平時不能在上面干活煤辨;那在哪干活呢驾凶?干活都在
dev
分支上,也就是說掷酗,dev
分支是不穩(wěn)定的,到某個時候窟哺,比如1.0版本發(fā)布時泻轰,再把dev
分支合并到master
上,在master
分支發(fā)布1.0版本且轨;你和你的小伙伴們每個人都在
dev
分支上干活浮声,每個人都有自己的分支虚婿,時不時地往dev
分支上合并就可以了。所以泳挥,團(tuán)隊(duì)合作的分支看起來就像這樣:
- 合并分支時然痊,加上
--no-ff
參數(shù)就可以用普通模式合并,合并后的歷史有分支屉符,能看出來曾經(jīng)做過合并剧浸,而fast forward
合并就看不出來曾經(jīng)做過合并。
Bug分支
修復(fù)bug時矗钟,我們會通過創(chuàng)建新的bug分支進(jìn)行修復(fù)唆香,然后合并,最后刪除吨艇;
當(dāng)手頭工作沒有完成時躬它,先把工作現(xiàn)場
git stash
一下,然后去修復(fù)bug东涡,修復(fù)后冯吓,再git stash pop
,回到工作現(xiàn)場疮跑。
Feature分支
當(dāng)需要開發(fā)一個新功能的時候组贺,最好開一個Feature分支進(jìn)行開發(fā)。在上面開發(fā)完成祸挪,合并锣披,最后刪除Feature分支。
- git branch -D name丟棄一個沒有被合并過的分支
多人協(xié)作
-
git remote
查看遠(yuǎn)程庫的信息 -
git remote -v
顯示更詳細(xì)的信息
推送分支
把該分支上的所有本地提交推送到遠(yuǎn)程庫贿条。推送時雹仿,要指定本地分支,這樣整以,Git就會把該分支推送到遠(yuǎn)程庫對應(yīng)的遠(yuǎn)程分支上
git push origin master
git push origin dev
抓取分支
-
git pull
把最新的提交從倉庫中抓取下來
多人協(xié)作的工作模式:
- 首先胧辽,可以試圖用
git push origin branch-name
推送自己的修改;- 如果推送失敗公黑,則因?yàn)檫h(yuǎn)程分支比你的本地更新邑商,需要先用
git pull
試圖合并;- 如果合并有沖突凡蚜,則解決沖突人断,并在本地提交;
- 沒有沖突或者解決掉沖突后朝蜘,再用
git push origin branch-name
推送就能成功恶迈!如果
git pull
提示“no tracking information”,則說明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒有創(chuàng)建谱醇,用命令git branch --set-upstream branch-name origin/branch-name
暇仲。
標(biāo)簽管理(tag)
用來為發(fā)布的正式版打上版本號
-
git tag v1.0
在master分支上打tag步做,默認(rèn)tag是打在最新提交的commit上。 -
git tag v0.8 commit id
如果忘了打標(biāo)簽奈附,可以使用commit id找到歷史提交全度,再去打標(biāo)簽。
PS D:\learngit> git tag v0.9 ac3f8e4
PS D:\learngit> git tag
v0.8
v1.0
-
git show v0.9
查看標(biāo)簽信息 -
git tag -a v0.1 -m "version 0.1 released" 67ae9c9
創(chuàng)建一個帶有說明的標(biāo)簽 - 命令
git push origin <tagname>
可以推送一個本地標(biāo)簽斥滤; - 命令
git push origin --tags
可以推送全部未推送過的本地標(biāo)簽将鸵; - 命令
git tag -d <tagname>
可以刪除一個本地標(biāo)簽; - 命令
git push origin :refs/tags/<tagname>
可以刪除一個遠(yuǎn)程標(biāo)簽中跌。