Git是什么蹬耘?
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)。
- 與傳統(tǒng)cvs阐滩,svn區(qū)別
- 每一個(gè)開發(fā)人員的電腦上都有一個(gè)Local Repository,所以即使沒有網(wǎng)絡(luò)也一樣可以Commit巧娱,查看歷史版本記錄拒课,創(chuàng)建項(xiàng) 目分支等操作,等網(wǎng)絡(luò)再次連接上Push到Server端羡儿。
- Git把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ)礼患,而SVN是按文件。
- Git沒有一個(gè)全局版本號(hào)掠归,而SVN有:目前為止這是跟SVN相比Git缺少的最大的一個(gè)特征缅叠。
- SVN必須先Update才能Commit,可以看到所有的Log拂到。
- 強(qiáng)大的分支管理痪署。
創(chuàng)建一個(gè)倉庫(版本庫)
// 創(chuàng)建一個(gè)倉庫
wanss-MacBook-Pro:gittest wans$ git init
// 創(chuàng)建一個(gè)本地倉庫,裸倉庫
wanss-MacBook-Pro:gittest wans$ git --git-dir=lib1.git init --bare
// 獲取一個(gè)遠(yuǎn)程git庫
wanss-MacBook-Pro:gittest wans$ git clone http://...git
裸倉庫,只保存git歷史提交的版本信息兄旬,而不允許用戶在上面進(jìn)行各種git操作
這個(gè)就是最好把遠(yuǎn)端倉庫初始化成bare倉庫的原因狼犯。
// 添加一個(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)容提交到版本庫
wanss-MacBook-Pro:lib2 wans$ git commit -m "hello git"
- 工作區(qū)與版本庫
- 工作區(qū):項(xiàng)目的目錄
- 版本庫:工作區(qū)有一個(gè)隱藏目錄.git目錄
- 暫存區(qū):稱為stage(或者叫index)领铐,保存版本庫中所有通過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$
撤銷修改
根據(jù)工作區(qū)/暫存區(qū)/版本庫的狀態(tài)跳轉(zhuǎn)圖:
示意圖
補(bǔ)充: 從staged >> unstracked: git rm --cached file
- git revert 撤銷 某次操作绪撵,此次操作之前和之后的commit和history都會(huì)保留瓢姻,并且把這次撤銷。
- 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ù)。
反撤銷: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)暫存起來的文件(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)程倉庫(已關(guān)聯(lián)遠(yuǎn)程分支)
git push
// 未關(guān)聯(lián)遠(yuǎn)程分支
git push --set-upstream origin dev
// 推送到遠(yuǎn)程分支(如果遠(yuǎn)程沒有锦募,則創(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ò)的文字與圖片御滩,侵刪鸥拧。