Git是什么?
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒(méi)有之一)。
- 與傳統(tǒng)cvs,svn區(qū)別
- 每一個(gè)開(kāi)發(fā)人員的電腦上都有一個(gè)Local Repository,所以即使沒(méi)有網(wǎng)絡(luò)也一樣可以Commit,查看歷史版本記錄,創(chuàng)建項(xiàng) 目分支等操作,等網(wǎng)絡(luò)再次連接上Push到Server端。
- Git把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ),而SVN是按文件。
- Git沒(méi)有一個(gè)全局版本號(hào),而SVN有:目前為止這是跟SVN相比Git缺少的最大的一個(gè)特征。
- SVN必須先Update才能Commit,可以看到所有的Log。
- 強(qiáng)大的分支管理。
創(chuàng)建一個(gè)倉(cāng)庫(kù)(版本庫(kù))
// 創(chuàng)建一個(gè)倉(cāng)庫(kù)
wanss-MacBook-Pro:gittest wans$ git init
// 創(chuàng)建一個(gè)本地倉(cāng)庫(kù),裸倉(cāng)庫(kù)
wanss-MacBook-Pro:gittest wans$ git --git-dir=lib1.git init --bare
// 獲取一個(gè)遠(yuǎn)程git庫(kù)
wanss-MacBook-Pro:gittest wans$ git clone http://...git
裸倉(cāng)庫(kù),只保存git歷史提交的版本信息,而不允許用戶在上面進(jìn)行各種git操作
這個(gè)就是最好把遠(yuǎn)端倉(cāng)庫(kù)初始化成bare倉(cāng)庫(kù)的原因。
// 添加一個(gè)README.md文件
wanss-MacBook-Pro:lib2 wans$ echo "hello git" > README.md
// 將README.md添加到暫存區(qū),等待提交
wanss-MacBook-Pro:lib2 wans$ git add README.md
// 將暫存區(qū)內(nèi)容提交到版本庫(kù)
wanss-MacBook-Pro:lib2 wans$ git commit -m "hello git"
- 工作區(qū)與版本庫(kù)
- 工作區(qū):項(xiàng)目的目錄
- 版本庫(kù):工作區(qū)有一個(gè)隱藏目錄.git目錄
- 暫存區(qū):稱為stage(或者叫index),保存版本庫(kù)中所有通過(guò)git add命令添加的修改,可提交狀態(tài)。

示意圖
管理修改
1.修改README.md文件后
wanss-MacBook-Pro:lib2 wans$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
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.md
no changes added to commit (use "git add" and/or "git commit -a")
2.添加修改到已暫存狀態(tài)
wanss-MacBook-Pro:lib2 wans$ git add README.md
wanss-MacBook-Pro:lib2 wans$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README.md
3.提交修改
wanss-MacBook-Pro:lib2 wans$ git commit -m "modified README.md"
wanss-MacBook-Pro:lib2 wans$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
4.提交到遠(yuǎn)程分支
wanss-MacBook-Pro:lib2 wans$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 247 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /Users/wans/Documents/gittest/home2/../lib2.git/
6225363..03f2080 master -> master
wanss-MacBook-Pro:lib2 wans$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
wanss-MacBook-Pro:lib2 wans$
撤銷(xiāo)修改
根據(jù)工作區(qū)/暫存區(qū)/版本庫(kù)的狀態(tài)跳轉(zhuǎn)圖:

示意圖
補(bǔ)充: 從staged >> unstracked: git rm --cached file
- git revert 撤銷(xiāo) 某次操作,此次操作之前和之后的commit和history都會(huì)保留,并且把這次撤銷(xiāo)。
- git reset –mixed 默認(rèn)方式,不帶任何參數(shù)的git reset,只保留源碼,回退commit和index 信息。
- git reset –soft 回退到某個(gè)版本,只回退了commit,不會(huì)恢復(fù)index file一級(jí),如果需要提交直接commit就好。
- git reset –hard 回退到某個(gè)版本,文件全部回退到當(dāng)前版本,不可恢復(fù)。
反撤銷(xiāo):git reflow;git reset —hard commitcode;
分支操作
// 創(chuàng)建新分支
git branch dev
// 切換到新分支
git checkout dev
// 創(chuàng)建新分支并切換到新分支
git checkout -b dev
// 放棄當(dāng)前分支修改切換到新分支
git checkout -f dev
// 查看所有分支
git branch -a
// 刪除分支名
git branch -d dev
// 更新遠(yuǎn)程已刪除分支
git fetch -p
// 更新遠(yuǎn)程新分支
git fetch
// 查看本地分支對(duì)應(yīng)的遠(yuǎn)程分支關(guān)系
git branch -vv
// 獲取遠(yuǎn)程分支
git checkout -b dev origin/dev
對(duì)比與合并
// 將指定分支的修改合入當(dāng)前分支
git merge dev
// 解決沖突
git mergetool file
// 選擇另一分支提交記錄合并到當(dāng)前分支
git cherry-pick commitcode
// 查看尚未暫存的文件的修改
git diff
// 查看已經(jīng)暫存起來(lái)的文件(staged)和上次提交時(shí)的快照之間(HEAD)的差異
git diff --cached
// 查看當(dāng)前和HEAD的差別
git diff HEAD
// 將兩個(gè)分支最新的提交做對(duì)比
git diff master dev
// 查看簡(jiǎn)單的diff結(jié)果 追加--stat
// 比較兩次提交的差異
git diff HEAD^ HEAD
git diff SHA1 SHA2
git對(duì)比和合并默認(rèn)在命令行中操作,可配置beyondcompare等第三方可視化比對(duì)工具。配置自定義diff與merge工具
拉取與推送(pull&&push)
// 提交當(dāng)前暫存區(qū)修改
git commit -m "message"
// 提交當(dāng)前修改與暫存的修改
git commit -a -m "meaage"
// 將當(dāng)前修改追加到最近一次提交,不生成新的提交記錄
git commit --amend
// 推送當(dāng)前分支到遠(yuǎn)程倉(cāng)庫(kù)(已關(guān)聯(lián)遠(yuǎn)程分支)
git push
// 未關(guān)聯(lián)遠(yuǎn)程分支
git push --set-upstream origin dev
// 推送到遠(yuǎn)程分支(如果遠(yuǎn)程沒(méi)有,則創(chuàng)建一個(gè)新的分支)
git push origin master
// 推送到遠(yuǎn)程分支目錄
git push origin HEAD:release/3.0
// 拉取遠(yuǎn)程指定分支
git pull origin master
// 刪除遠(yuǎn)程分支
git push origin :<branchName>
git push origin --delete <branchName>
標(biāo)簽
// 查看所有tag
git tag
// 當(dāng)前分支的最新提交打一個(gè)tag
git tag release1.0
// 當(dāng)前分支某一次提交打一個(gè)tag
git tag release1.0 commitcode
// 刪除標(biāo)簽
git tag -d release1.0
// 推送標(biāo)簽到遠(yuǎn)程
git push origin <tagname>
// 推送所有標(biāo)簽到遠(yuǎn)程
git push origin --tags
// 刪除遠(yuǎn)程標(biāo)簽
git push origin :refs/tags/<tagname>
git push origin --delete tag <tagname>
// 獲取標(biāo)簽生成新的分支
git checkout -b branch_name tag_name
忽略文件(.gitinore)
子模塊
git submodule add *.git
git submodule init
git submodule update
git clone --recursive *.git
參考資料
以上主要用于自己總結(jié)常用git命令,后續(xù)也會(huì)持續(xù)更新,其中摘錄了部分網(wǎng)絡(luò)的文字與圖片,侵刪。