Git教程-git是一种对修改的操作
Git是目前世界上最先进的分布式版本控制系统
安装
1 | sudo apt-get install git |
安装成功后,运行如下命令
1 | git |
安装完成后,还需要最后一步设置,在命令行输入:
1 2 | $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" |
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
远程仓库
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。首先找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。可以自己搭建这台服务器,也可以使用GitHub网站
本地创建ssh key
先看一下是否有ssh key 如果没有,就自行百度一下安装openssh-server,一般linux下的系统都是默认有ssh
1 | ps ajx|grep ssh #查看ssh的进程 |
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的
创建项目的SSH Key
1 | ssh-keygen -t rsa -C "youremail@example.com" |
创建完成后,在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人
登录github注册或登录账号,打开“settings”的“SSH Keys”页面,然后,点“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key
创建远程库
登陆GitHub
在右上角找到“new repository”按钮,创建一个新的仓库
从远程库克隆
将github上的项目,克隆到本地一份
1 2 3 | git clone git@github.com:账号名/项目名.git git remote #查看远程库信息 git remote -v #查看详细信息 |
与远程库交互
将项目提交到远程库github
1 2 3 4 5 6 7 8 9 | git init #初始化空的Git仓库 git add * #添加到暂存区 git commit -m '1.0' #添加到master分支 git show 查看最近一次提交的记录 #commit记录 #github操作 #在github上面新键项目 git remote add origin git@github.com:luzhisheng/xxx.git #命令管理一组跟踪的存储库 git push -u origin master#将master分支的内容上传到github |
远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
-u 本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,以后就只需要用,如下进行提交。
1 | git push origin master |
报错问题

agent refused operation
1 2 | eval "$(ssh-agent -s)" ssh-add |
SSH警告:
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host ‘github.com (xx.xx.xx.xx)’ can’t be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added ‘github.com’ (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。
本地仓库
创建空目录
1 2 | mkdir test7 cd test7 |
目录结构图如下:

init0
在目录下创建本地仓库
1 | git init |
创建成功后,目录结构如下图:

init1
版本库就是一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”
git版块管理思维图

工作区和版本库
本地仓库分为三部分:工作区,暂存区,仓库区,其中暂存区、仓库区是版本库部分
工作区与暂存区
使用IDE打开目录,创建项目,将文件添加到暂存区
1 2 | git add 文件1 文件2 ... git add 目录 |
使用暂存区的内容恢复工作区的内容
1 | git checkout -- 文件名 |
查看暂存区的状态
1 | git status |
将暂存区的记录添加到仓库区
1 2 3 4 | git commit -m '本次提交的说明信息' [master 1868b23] 本次提交的说明信息 1 file changed, 2 insertions(+) #1个文件已更改,2个插入(+) create mode 100644 readme.txt #创建模式100644 readme.txt |
查看仓库区的历史
1 2 3 4 | 当前版本的历史版本:git log q 退出log 简版显示:git log --pretty=oneline 历史命令:git reflog |
在Git中,用HEAD表示当前版本,也就是最新的提交3628164…882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
查看修改内容
1 2 3 | git diff HEAD -- 文件名 #对比工作区和仓库区中某版本某文件的不同 git diff 文件名 #是工作区(work dict)和暂存区(stage)的比较 git diff --cached 文件名 #是暂存区(stage)和分支(master)的比较 |
撤消修改
git会提示:
1、add之前的话,使用 “git checkout — <文件>…” 丢弃工作区的改动
1 | git checkout -- 文件 |
2、add之后,commit之前
使用 “git reset HEAD <文件>…” 以取消暂存
使用 “git checkout — <文件>…” 丢弃工作区的改动
1 2 | git reset HEAD 文件 git checkout -- 文件 |
第1、2种情况,建议都直接用第2种方式,一次性解决
3、add之后,commit之后
回退历史版本到暂存区
1 2 3 | git reset HEAD^#上一个版本 git reset HEAD^^#上上的版本 git reset HEAD~100#指定第100个版本 |
回到某个版本
1 2 | git reflog #查看版本 git reset --hard 版本号 |
删除文件
从版本库中删除
1 2 3 | rm 文件名 git rm 文件名 git commit -m '删除说明信息' |
删除了文件,版本库文件没有删除,可以恢复文件
1 | git checkout -- test.txt |
分支
分支存在的意义,假如你在开发一个新的功能是,我不能写一点代码提交一次代码,这样会影响污染环境代码,如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。所有分支就出现了,我可以创建一个分支,我在分支上面干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | git branch #有多少个分支并且查看当前分支 git log --graph #查看分支路线图 git checkout -b develop #创建并切换到develop分支 ----- #在分支里面可以编写你的代码 ----- #编写完成代码提交到当前分支 git add 文件名 git commit -m "add 说明" ----- git checkout master #切换回master分支 git merge develop #将develop分支合并到master git branch -d 分支名称 #删除分支 |
主分支master和dev分支都修改,合并冲突怎么办?
1 2 3 4 5 | cat 文件 #查看文件,有提示信息 vim 文件 #修改文件 git add 文件 git commit -m "说明" 成功 |
查看分支合并情况
1 | git log --graph --pretty=oneline --abbrev-commit#查看日志 |
* d3478e7 add rc cc
|\
| * 042be06 add rc
* | 8091717 add cc
|/
* f356751 branch dev test
* 83101bd add test.txt
推荐工作方法:
分支合并信息,最正确的做法,重要:工作中一定要这么干!禁用fast forward合并模式(fast forward合并就看不出来曾经做过合并),如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit。我们用加参数的git log 就可以查看到分支合并信息

禁用fast forward 后git log
1 2 3 4 5 6 | git checkout -b 分支名称 vim 文件 git add 文件 git commit -m "说明" git checkout master #切换分支 git merge --no-ff -m "说明信息" dev #--no-ff参数,表示禁用Fast forward |
再次用git log 加参数的形式看日志
1 | git log --graph --pretty=oneline --abbrev-commit |
* 7748fd0 merge with no-ff #合并说明描述
|\
| * 8702335 fast #分支说明描述
|/
* d3478e7 add rc cc
* f356751 branch dev test
* 83101bd add test.txt
* 7893f7a pjl

工作中git log 图
暂时存储内容
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
1 2 | git stash #当前分支 git stash pop #删除暂时存储内容,并恢复暂存区 |
可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
1 | git stash apply stash@{0} |
如果要丢弃一个没有被合并过的分支,可以通过git branch -D
1 | git branch -D 分支名称 |
标签
标签作用: 在开发的一些关键时期,使用标签来记录这些关键时刻, 例如发布版本, 有重大修改, 升级的时候, 会使用标签记录这些时刻, 来永久标记项目中的关键历史时刻;
1 2 3 4 5 6 7 | git branch git checkout master Switched to branch 'master' #默认标签是打在最新的commit上面 git tag v1.0 git tag |
如果我们忘了打标签,比如我前天我刚发布一个重大的变革,而忘记记录的这个时刻,那就可以找到commit id去打标签。
1 2 3 4 | git log --pretty=oneline --abbrev-commit#查看历史commit记录 git tag <tagname> 6224937 git tag #查看历史标签 git show <tagname>#查看指定版本信息 |
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
1 2 | git tag -a <tagname> -m "版本说明信息" 3628164 git show <tagname> #能看到指定版本的信息 |
如果打错标签就删除
1 | git tag -d <tagname> |
如果要推送某个标签到远程,使用命令
1 | git push origin <tagname> |
或者,一次性推送全部尚未推送到远程的本地标签:
1 | git push origin --tags |
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
1 | git tag -d v0.9 |
然后,从远程删除。删除命令也是push,但是格式如下:
1 | git push origin :refs/tags/v0.9 |
1163848899
2018 年 1 月 27 日 15:44
博客还真是个好东西!
民间秘术
2018 年 1 月 21 日 10:29
转眼又是新一年,博主万事如意不差钱!
致富技术
2018 年 1 月 20 日 19:24
初来乍到,无条件支持!