- 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
經(jīng)過這幾天的學(xué)習(xí)Github,現(xiàn)在也對Github有了更深的一層了解.
Git是一個分布式文件版本管理系統(tǒng)女轿。Git 直接記錄文件快照丹鸿,而非差異比較,所以在切換分支速度極快缓呛,幾乎是秒切催享。所有操作基本上都是本地執(zhí)行,時刻保持?jǐn)?shù)據(jù)完整性哟绊,每臺機器上都有完整的 Git 提交歷史因妙,即使不聯(lián)網(wǎng),也能任意切換到歷史版本票髓。多數(shù)操作僅添加數(shù)據(jù)攀涵,也就是說,操作都是可恢復(fù)的洽沟。
初始化目錄
# 創(chuàng)建空的 Git 目錄
git init
git add README
git commit -m 'initial project version'
# 或者使用 clone 方式從遠(yuǎn)程復(fù)制一個
git clone git://git.kernel.org/pub/scm/git/git.git [mygit]```
##文件狀態(tài)
工作目錄下面的所有文件都不外乎這兩種狀態(tài):已跟蹤或未跟蹤以故。已跟蹤的文件是指本來就被納入版本控制管理的文件,在上次快照中有它們的記錄玲躯,工作一段時間后据德,它們的狀態(tài)可能是未更新(nothing to commit),已修改(Changes not staged for committed)或者已放入暫存區(qū)(Changes to be committed)跷车。而所有其他文件都屬于未跟蹤文件(Untracked files)棘利,它們既沒有上次更新時的快照,也不在當(dāng)前的暫存區(qū)域朽缴。如下圖
![](http://upload-images.jianshu.io/upload_images/25574-26c6796007af0029.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- `README.txt` 已放入暫存區(qū)善玫,等待被提交。使用`git commit -m 'change log'`提交
- `benchmarks.rb`已修改密强,但修改未放入暫存區(qū)茅郎。使用`git add benchmarks.rb`添加到暫存區(qū)
- `b.txt`未根據(jù),需要用命令`git add b.txt`添加到暫存區(qū)或渤。
需要注意的是系冗,每次修改文件都需要執(zhí)行`git add filename`將修改添加到暫存區(qū),而不僅僅只是新文件薪鹦。也就是說掌敬,每次更改惯豆,都要執(zhí)行兩個命令,`git add`和`git commit`才能將更改添加到版本庫中奔害。一次完整的提交過程:
將當(dāng)前目前下的所有更改添加到暫存區(qū)楷兽,或者根據(jù)情況,只添加某些文件的更改华临,將 . 換成文件名
git add .
將暫存區(qū)的內(nèi)容添加到 Git 版本庫中芯杀,永久存儲。這一步無法選擇要提交哪些內(nèi)容雅潭,所有暫存區(qū)的內(nèi)容都會被提交揭厚。
git commit -m 'change log'```
.gitignore
有時候,我們可能不想跟蹤一些文件寻馏,比如工程文件的配置文件棋弥,編譯生成的二進(jìn)制文件。這些文件無需納入版本管理诚欠,否則在團隊協(xié)作,合并代碼時容易發(fā)生沖突漾岳。在項目的根目錄下轰绵,新建.gitignore
文件,將不需要跟蹤的文件添加到里面尼荆,如下:
# 此為注釋 – 將被 Git 忽略
# 忽略所有 .DS_Store 結(jié)尾的文件
*.DS_Store
# 但 lib.a 除外
!lib.a
# 僅僅忽略項目根目錄下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目錄下的所有文件
build/
# 會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt
# A **/ pattern is available in Git since version 1.8.2.```
如果在創(chuàng)建`.gitignore`文件前左腔,這些文件已經(jīng)進(jìn)入版本管理時,需要先將它們從暫存區(qū)中刪除:`git rm —cached filename` 或 `git rm -rf —cached .`捅儒,讓`.gitignore`生效液样。
##對比
`git diff`可以查看當(dāng)前修改和某次提交之后都改動了哪些東西。
>- 1.查看已暫存和未暫存的更新 :git diff
- 2.查看已暫存和上次提交時的快照之間的變化: git diff —cached 或 git diff —staged
- 3.對比當(dāng)前提交和某個提交:git diff 99734f7ff
- 4.對比當(dāng)前分支和其他某個分支:git diff test
![git diff](http://upload-images.jianshu.io/upload_images/25574-16a320bf2080b86c.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
##查看提交歷史
>- 1.查看提交日志巧还,只列出時間和提交信息:git log
- 2.查看最近2次提交的歷史鞭莽,并列出改動的內(nèi)容差異:git log -p -2
- 3.以圖表的形式列出提交歷史: git log --oneline --graph
![git log -p -2](http://upload-images.jianshu.io/upload_images/25574-30c6db6abcb0cdb9.jpeg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
##撤銷操作
>- 1.修改最后一次提交信息:git commit --amend
- 2.取消已經(jīng)暫存的文件:git reset HEAD filename
- 3.取消對文件的修改:git checkout -- filename
- 4.返回到某個節(jié)點,不保留修改:git reset --hard HASH
- 5.返回到某個節(jié)點麸祷,保留修改:git reset --soft HASH
##遠(yuǎn)程倉庫
>- 1.查看:git remote -v
- 2.添加遠(yuǎn)程倉庫:git remote add pb git://github.com/paulboone/ticgit.git
- 3.拉取遠(yuǎn)程倉庫的代碼到本地倉庫:git fetch pb
- 4.修改遠(yuǎn)程倉庫地址:git remote set-url origin git://github.com/newuser/ticgit.git
##打標(biāo)簽
- 每次推送一個新的版本到遠(yuǎn)程倉庫的 master 時澎怒,需要打一個版本號的標(biāo)簽。
>- 1.查看標(biāo)簽:git tag -l
- 2.打標(biāo)簽:git tag -a v1.4 -m 'my version 1.4'
- 3.查看相應(yīng)標(biāo)簽的版本信息:git show v1.4
- 4.推送標(biāo)簽到遠(yuǎn)程:git push origin v1.5 或者 git push origin --tags
##分支
- 在 Git 中提交時阶牍,會保存一個提交(commit)對象喷面,該對象包含一個指向暫存內(nèi)容快照的指針。Git 中的分支走孽,本質(zhì)上是個指向 commit 對象的可變指針惧辈。
##新建分支
git branch test
git checkout test
或者直接 checkout -b, -b 參數(shù)表示新創(chuàng)建一個分支
git checkout -b test```
合并分支
- 將 issue-1 分支合并到 master:
git checkout master
git merge issue-1
# 合并后刪除
git branch -d issue-1```
##沖突解決
- 在`merge`代碼的時候,如果兩個分支對同一行文件做了不一樣的修改磕瓷,便會產(chǎn)生沖突盒齿。解決沖突需要人為介入,編輯沖突的文件,選擇正確的一行代碼县昂,然后重新提交肮柜。
- 如果代碼產(chǎn)生沖突,沖突的文件會出現(xiàn)類似下面的內(nèi)容:
<<<<<<< HEAD
<div id="footer">contact us at support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
issue-1```
<<<<<<<
HEAD到=======
之間是當(dāng)前分支的代碼倒彰,=======
到>>>>>>> issue-1
是issue-1
分支的代碼审洞,這行代碼不一致,這里我們選擇issue-1
的代碼待讳,修改后這幾行變?yōu)?/p>
<div id="footer">
please contact us at support@github.com
</div>```
修改完之后芒澜,運行`git add .; git commit -m 'merged'`提交當(dāng)前修改后的代碼,沖突便解決了创淡,代碼也合并了痴晦。
##管理分支
>- 列出當(dāng)前所有本地分支: git branch
- 包含各分支最后提交信息: git branch -v
- 查看當(dāng)前分支已合并的分支: git branch --merged
- 刪除分支:git branch -d testing
##遠(yuǎn)程分支
>遠(yuǎn)程分支`(remote branch)`是對遠(yuǎn)程倉庫中的分支的索引,遠(yuǎn)程分支的表示形式:`(遠(yuǎn)程倉庫名)/(分支名)` 琳彩。如 `origin/master`誊酌,`origin` 是遠(yuǎn)程倉庫名,`master`是分支名露乏。
>查看遠(yuǎn)程分支: `git branch -r`
推送本地分支: `git push origin master`
拉取遠(yuǎn)程分支并合并到當(dāng)前分支:`git pull origin master`
獲取遠(yuǎn)程代碼到本地倉庫:`git fetch origin`
合并遠(yuǎn)程分支到本地分支代碼:`git merge origin/master`
本地新建遠(yuǎn)程分支:`git checkout -b hotfix origin/master` # 從遠(yuǎn)程 master 分支上新建本地 hotfix 分支
刪除遠(yuǎn)程分支碧浊,在分支名前加冒號:`git push origin :hotfix` # 刪除遠(yuǎn)程 hostfix 分支
- git pull = git fetch + git merge
##Stash
- 要切換到其他分支又不提交當(dāng)前的修改時,使用 git stash 保存當(dāng)前修改到一個堆棧中瘟仿,需要時重新應(yīng)用修改
>- 1.保存修改:git stash
- 2.應(yīng)用保存起來的修改:git stash apply 或 git stash pop
- 3.查看已保存的stashing:git stash list
- 4.刪除stash:git stash drop
###具體可以參照此文http://iissnan.com/progit/