############ssh key及 配置信息#############
設(shè)置Git的user name和email:
$ git config --global user.name ""
$ git config --global user.email ""
生成SSH密鑰過程:
1.查看是否已經(jīng)有了ssh密鑰:cd ~/.ssh
如果沒有密鑰則不會有此文件夾惜论,有則備份刪除
2.生存密鑰:$ ssh-keygen -t rsa -C “郵箱”
按3個回車析恢,密碼為空
.在github上添加ssh密鑰嘀韧,這要添加的是“id_rsa.pub”里面的公鑰
#############本地初始化一個目錄為代碼倉庫##################
git init? 初始化倉庫
1惋鸥、創(chuàng)建一個新目錄作為代碼倉庫
2酗洒、執(zhí)行 git init;
? 執(zhí)行之后會發(fā)現(xiàn)多了一個.git目錄
? 這就說明倉庫已經(jīng)初始完成
3裁眯、在github上創(chuàng)建一個新的代碼倉庫(創(chuàng)建對應(yīng)的代碼倉庫)
4页响、git remote add origin git鏈接?
5、正常提交代碼即可鸟缕。?
########克隆一個項目#######
https? 速度慢晶框、需要輸入賬號和密碼/ ssh 會被公司限制 兩種協(xié)議
要克隆一個倉庫,首先必須知道倉庫的地址懂从,后使用git clone命令克隆然授段。
git clone git鏈接
Git支持多種協(xié)議,包括https番甩,但通過ssh支持的原生git協(xié)議速度最快侵贵。
git clone git https鏈接
or
git clone git鏈接
通常推薦大家直接git clone 一個項目的方式來創(chuàng)建本地的代碼倉庫!
演示一下在github上如何創(chuàng)建一個代碼倉庫T笛ΑG嫌卡睦!
###############創(chuàng)建分支################
Git鼓勵大量使用分支:
創(chuàng)建分支:git branch <name> (默認(rèn)當(dāng)前所在分支為基礎(chǔ)分支,可以指定其它分支)
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name> <基礎(chǔ)分支名稱>(origin/master)
提交剛創(chuàng)建的分支:git push origin branch-name
更新分支:Git pull origin branchname? or Git fetch origin branchname? git merge --no-ff 目標(biāo)分支
合并某分支到當(dāng)前分支:git merge --no-ff <branch1分支名稱>(把分支branch1合并到當(dāng)前分支上)
git merege (fast forward? and --no-ff )
通常漱抓,合并分支時表锻,如果可能,Git會用Fast forward模式乞娄,但這種模式下瞬逊,刪除分支后,會丟掉分支信息仪或。
如果要強制禁用Fast forward模式确镊,Git就會在merge時生成一個新的commit,這樣范删,從分支歷史上就可以看出分支信息
請注意--no-ff參數(shù)蕾域,表示禁用Fast forward請注意--no-ff參數(shù),表示禁用Fast forward
git merge --no-ff -m "merge with no-ff" dev
因為本次合并要創(chuàng)建一個新的commit到旦,所以加上-m參數(shù)旨巷,把commit描述寫進去
查看本地分支:git branch? or git branch -l
查看遠程分支:git branch -r
查看所有分支(本地+遠程):git branch -a
帶*的分支為當(dāng)前工作的分支
刪除本地分支:
git branch -d branchnamne
or
git branch -D? branchname 強制刪除
刪除遠程分支:
Git push origin --delete branchname (刪除遠端分支branchname)
Git push origin :branchname (直接刪除遠端分支branchname)
獲取遠程倉庫的分支(本地沒有的分支)
git pull origin $branch:$branch
實例:git pull? origin? branchname:branchname
############git commit####################
git commit -m''? 只會提交已經(jīng)git add過的文件(包括新增、修改厢绝、刪除等所有修改操作)
git commit -a -m'' 會提交除新增未add的文件之外的所有修改操作
#############git diff ####################
Git diff? filename? 顯示本地文件修改的內(nèi)容同版本庫的差別
Git diff? branchone? branchtwo? 對比兩個branch不同之處
Git diff? tagone? tagtwo? ? 對比兩個tag 不同之處
########刪除文件###########
在本地直接刪除文件
1契沫、rm? file? (工作區(qū)中文件刪除)
2带猴、git add file (文件刪除的狀態(tài)添加到暫存區(qū)中)
3昔汉、git commit? (提交文件刪除的狀態(tài)到本地的版本庫中)
以上三步可以縮減為兩步:
1、git rm file (直接把刪除的文件添加到暫存區(qū)中)
2拴清、git commit? (提交文件刪除的狀態(tài)到本地的版本庫中)
#############刪除文件###############
1靶病、git rm filename? 然后 git commit 即可
2、rm filename? / git add? / git commit
git rm filename 就是 rm filename 的簡化版
########查看當(dāng)前工作區(qū)修改狀態(tài)#######
git status;
要隨時掌握工作區(qū)的狀態(tài)口予,
使用git status命令
如果git status告訴你有文件被修改過娄周,
用git diff可以查看修改內(nèi)容。
git diff 默認(rèn)查看所有被修改過的文件(不包括新增未add的文件)
git diff filename (查看具體某個文件的修改內(nèi)容 )
###########查看log記錄#####
git log? 默認(rèn)列出之前提交過記錄(根據(jù)提交時間由近到遠排列)
git log -n? 列出指定提交次數(shù)的記錄
git log --pretty=oneline? 列出簡單記錄信息(commitid 和 提交注釋)
git reflog -n 查看指定次數(shù)的提交操作的記錄信息(commitid)
log? and? reflog
兩者都是查看所有的commit操作的記錄沪停,log查看不到reset回退時跳過的commit操作的commitid
(可以夸版本回退一次煤辨,進行實際演示)
git log
git reflog
git reset --hard commitid
git log
git reflog
git log? --graph? 可以查看分支合并圖
#########撤回和回滾#######
1、在工作區(qū)內(nèi)修改了文件但沒有提交到暫存區(qū)撤銷所有修改:
git checkout -- file.name? 可以丟棄工作區(qū)的修改 木张,只針對已跟蹤的文件
git checkout -- file? ? ? ? 命令中的--很重要众辨,沒有--,就變成了“切換到另一個分支”的命令
2舷礼、文件已經(jīng)添加到暫存區(qū)撤回:
git reset HEAD file
or
git rm --cached filename
3鹃彻、文件已經(jīng)提交到了本地的版本庫且未推向遠端的版本庫中:
git reset --hard HEAD~n
or
git reset --hard commitid(推薦)
HEAD 表示提交的最新版本。HEAD^表示上一個版本妻献,HEAD^^表示上上個版本蛛株。HEAD~100表示往上100個版本团赁。
(上兩個版本 HEAD~2)
4、文件已經(jīng)從本地倉庫推倒遠程倉庫的回退
? git log? or git reflog 找到目標(biāo)版本
? git reset --hard commitid
? git push -f origin master? (-f 參數(shù)是強制覆蓋的意思谨履,沒有該參數(shù)會推送失敗欢摄,因為遠程倉庫的版本高于當(dāng)前版本)
? git revert commitid
git revert 是生成一個新的提交來撤銷某次提交,此次提交之前的commit都會被保留
git reset 是回到某次提交笋粟,提交及之前的commit都會被保留剧浸,但是此次之后的修改都會被退回到暫存區(qū)
團隊開發(fā)時,版本回退一定要通知其他人員矗钟!如果其他同事在每次提交前沒有先更細后提交的意識或習(xí)慣的話唆香,回退是白費功夫。
http://yijiebuyi.com/blog/8f985d539566d0bf3b804df6be4e0c90.html
######################狀態(tài)凍結(jié)####################
git stash? ? ? 凍結(jié)當(dāng)前修改狀態(tài)
git? stash list? 列出總結(jié)列表
git? stash pop? 可以按版本恢復(fù)某個凍結(jié)狀態(tài)并刪除
git? stash apply? 只是按某個版本恢復(fù)某個凍結(jié)狀態(tài)不刪除
git? stash drop? ? 刪除指定某個凍結(jié)狀態(tài)
####################tag管理#####################
創(chuàng)建tag:
git tag -a tagname? -m “添加tag的描述信息”? (tag要有個規(guī)則標(biāo)識例如:feature_abc_v1.1 吨艇,給當(dāng)前分支打一個tag名為tagname)
命令git tag <name>用于新建一個標(biāo)簽躬它,默認(rèn)為HEAD,也可以指定一個commit id东涡;
提交創(chuàng)建的tag:
git push origin tagname (同提交分支操作一樣)
命令git tag可以查看所有標(biāo)簽冯吓。
查看tag:
git tag?
or
git tag -l
查看標(biāo)簽的具體信息:
git show tag-name
刪除標(biāo)簽:
Git tag -d tagname (本地刪除)
Git push orign (空格):refs/tags/tagname (把刪除的tag提交到遠端)
刪除標(biāo)簽實例:
git tag -d v0.9
git push origin :refs/tags/v0.9
獲取遠程倉庫的tag信息(本地沒有)
git fetch origin tag $tag
##########同遠程倉庫關(guān)聯(lián)#########
查看當(dāng)前代碼關(guān)聯(lián)的遠程倉庫信息
git remote? 直接回車,列出所有關(guān)聯(lián)的遠程倉庫
git remote -v? 回車 列出每個遠程倉庫名及對應(yīng)的倉庫地址url
git remote add [shortname] [url]: 添加同一個遠程倉庫的關(guān)聯(lián)關(guān)系
git remote remove shortname : 刪除同一個遠程倉庫的關(guān)聯(lián)關(guān)系
要關(guān)聯(lián)一個遠程庫疮跑,使用命令git remote add origin git@server-name:path/repo-name.git组贺;
關(guān)聯(lián)后,使用命令git push -u origin master第一次推送master分支的所有內(nèi)容祖娘;
此后失尖,每次本地提交后,只要有必要渐苏,就可以使用命令git push origin master推送最新修改掀潮;
分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠程庫的存在,也就是有沒有聯(lián)網(wǎng)都可以正常工作琼富,而SVN在沒有聯(lián)網(wǎng)的時候是拒絕干活的仪吧!
當(dāng)有網(wǎng)絡(luò)的時候,再把本地提交推送一下就完成了同步鞠眉,真是太方便了薯鼠!
.gitignore規(guī)則不生效的解決辦法
把某些目錄或文件加入忽略規(guī)則,按照上述方法定義后發(fā)現(xiàn)并未生效械蹋,原因是.gitignore只能忽略那些原來沒有被追蹤的文件出皇,如果某些文件已經(jīng)被納入了版本管理中,則修改.gitignore是無效的朝蜘。那么解決方法就是先把本地緩存刪除(改變成未被追蹤狀態(tài))恶迈,然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'