设为首页 收藏本站
查看: 1209|回复: 0

[经验分享] git光速入门

[复制链接]

尚未签到

发表于 2017-6-10 09:30:19 | 显示全部楼层 |阅读模式
  1.git是什么?
  git是一种版本控制器.
更直白说,团队开发时,管理代码用的软件.
面试时,容易被问到的一个东西.
  2.安装
  git在Linux,Mac,Win下都可以安装.
本文是以Win7系统为环境编写的.
  Window环境:
到 https://git-for-windows.github.io/ 下载软件, 双击,一路"Next",安装完毕.
到开始菜单找"git bash".
  Linux环境安装git:
# ubuntu,debian#
$ sudo apt-get install git
centos,redhat系统
# yum install git
  3.报家门
  人在江湖,岂能没有名号.
开源教主Richard Matthew Stallman的江湖名号RMS.
在你用git之前,要先报家门,否则代码不能提交.
$ git config --global user.name #你是谁
$ git config --global user.email #怎么联系你
  4.创建版本库
$ cd E:/
$ mkdir test #创建test目录
$ cd test #进入test目录
$ git init #初始化test目录为仓库
  注意:
不要把仓库建在中文目录下,可能出问题.
.git是个隐藏目录,不要乱碰.(你的每一次代码修改它都帮你记录着呢)
  5.添加文件
  在E:/test目录下,用你喜欢的编辑器(sublime/editplus/notepad,vim等),
开发你的程序. 比如,index.php
echo 'hello git';
  编辑PHP文件后, # git status , 查看仓库状态
实例如下:
$ git status
可见,此时git发现有一个新文件,但并没有把此文件纳入管理.
我们需要两步,让git仓库管理index.php
git add index.php 把index.php提交到暂存区
git commit -m "新建index.php" 把index.php提交到版本库
  实例如下:
$ git add index.php
$ git commit -m "新建index.php"
  6.修改文件
  如果修改了文件,也不要忘记提交到版本库
这个过程和添加文件是一样的
一样是需要两步,让git仓库记录此次改变
git add index.php 把index.php提交到暂存区
git commit -m "改了第2行" 把index.php提交到版本库
实例:
$ git add index.php
$ git commit -m "改了第2行"
  7.删除文件
  用rm命令删除文件,并直接commit,提交到版本库
例:先创建一个foo.php,供练习删除用
实例如下:
$ touch foo.php # 创建foo.php
$ git add foo.php
$ git commit -m "练习删除用"
$ ls
foo.php index.php
# 开始删除
$ git rm foo.php
rm 'foo.php'
$ git commit -m "删除foo.php"
[master e4dc37c] 删除foo.php
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 foo.php
$ ls
index.php
1.5
  8.远程仓库
  经过前面的练习,你在本地的仓库里管理代码已经比较熟练了.
但如果是团队开发,如何配合起来呢?
我们可以把版本仓库放在互联网上.
开发者把自己最新的版本推到线上仓库,
同时,把线上仓库的最新代码,拉到自己本地.
这样,就可以配合工作了.
  9.注册git在线仓库的账号
  国外: http://www.github.com
国内: http://git.oschina.net
github.com也是目前程序员的装逼利器,在github上挂个项目,逼格瞬间提升两三档.
不过由于是国外网站,速度不咋样.
出于学习的方便,我在oschina.net给大家演示.
请立即打开 http://git.oschina.net 注册一个账户.
  10.创建项目
  在oschina注册后,"新建项目",我们先建一个测试项目,叫test.
  oschina为此项目提供的仓库地址有2个.
http地址:https://git.oschina.net/lianshou/test.git
ssh地址: git@git.oschina.net:lianshou/test.git
近几章的学习,我们先用https地址.
  11.把代码推到远程仓库
  推: push
push https://git.oschina.net/lianshou/test.git master
意思是,把本地的版本(默认是master),推到远程的仓库去.
这个过程会让你输入用户名/密码,即你注册时的账户密码.
  12.团队合作
  你想让一位叫"火夫"和程序员,和你一起开发.
首先lianshou账户把火夫添加到此项目中来,让其成为开发者
项目->管理->项目成员管理->开发者->添加项目成员->输入"huofu"
  他应该先把远程库复制一份到他本地.
命令: clone
$ cd F:/
$ git clone https://git.oschina.net/lianshou/test.git
$ cd test
$ ls
index.php
  "火夫"在F:/test下随便加个文件或改个文件,
然后push代码到服务器
$ git add .
$ git commit -m "试试"
$ git push https://git.oschina.net/lianshou/test.git master
  另一个账户,如何得到仓库里的最新代码?
推:push; 拉? pull!
对的. 你已经猜到了,用pull命令.
lianshou账户拉取最新代码
$ git pull https://git.oschina.net/lianshou/test.git
此时,查看最新的index.php内容,第4行,多了"火夫"的那一行.
  至此,你可以和小伙伴愉快的用git配合开发了.
如果要掌握更多git功能,后面还有四章, 敬请期待!
  13.git的特点及诞生
  何为分布式? 与集中式相比有何特点?
以SVN为例:
  中心的svn服务器中,存储着代码版本的变迁,及日志.
你想查看改动日志,请联网SVN服务器.
你想退回上个版本,请联网SVN服务器.
你想创建新的分支,请联网SVN服务器.
联网不说,万一SVN服务器要是坏了???后果你说呢.
而git是这样的:
  每个开发者的电脑上,都有完整的版本,日志,及分支信息.
但开发者不依赖于服务器,可以查看日志,回退版本,创建分支.
当然,世界各地的开发需要交换最新的版本信息,
因此,git往往也需要服务器.
但是,本质的区别在于:
git服务器是供开发者"交换"代码,服务器数据丢了没关系,分分钟再建一台.
svn的服务器,不仅交换代码,还控制着日志,版本,分支.服务器数据丢了就完了.
  14.发展历史
  Linux之父Linus Torvalds在1991年创建了linux开源项目,并把项目放在互联网上,引来世界大量的黑客,大神为项目贡献代码.
问题是,这么多的人同时贡献代码,如何管理代码成了一件头疼的事.
随着linux内核的管理工作越来越吃力,linus选择了一款商业版本控制器-BitKeeper.
BitKeeper是BitMover公司旗下的产品.
公司的老大Larry也希望借机扩大产品的影响力,因此授权Linux社区免费使用BitKeeper.
这件事,在开源圈引起了不小的骚动.
因为,BitKeeper只是free(免费),而非free(自由).
开源教主RMS为这事儿还说过linus.
2002年2月,Linus 开始用它来管理Linux内核代码主线,Linus对BitKeeper的评价是the best tool for the job.
确实,自从Linus使用BitKeeper之后,Linux的开发步伐加快了两倍.
可惜的是,就像黑帮电影中,老大蒸蒸日上的事业,往往坏在一个不懂事的小弟手中.
这帮视free(自由)如信仰的牛人中,一个叫Andrew的,试图破解BitKeeper的协议,且被BitMover公司警告几次后仍不停手.
最终,出事了!
Linus在Andrew和Larry两人间费力调停,但没有成功.
既如此,Linus说:"我的兄弟只是做错事不是做坏事. 我扛!"
于是,10天后,git诞生了!
  15.代码管理
  如果你想更清晰的学习git,你必须要了解3个重要区域.
工作区, 即开发者的工作目录.
暂存区, 修改已被记录,但尚未录入版本库的区域.
版本库, 存储变化日志及版本信息
  做个实验: 创建并提交一个文件的全过程
touch readme.txt 创建文件
$ git status 查看状态,如下:
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# readme.txt
nothing added to commit but untracked files present (use "git add" to track)
  意思是说:有未被跟踪的文件 readme.txt.
(文件在你的工作区,还没告诉git去管理它,当然没被跟踪了.)
你可以用git add <file> ,把它加入待提交列表
git add reame.txt 添加到暂存区
再次查看状态,如下:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: readme.txt
#
  意思是说:
代码的变化,可以提交(commit)了.
也可以git reset HEAD <file把它从暂存区拿出来.
git commit <file> -m <注释> 提交代码
$ git commit readme.txt -m "new readme.txt"
再次查看状态,如下:
# On branch master
nothing to commit, working directory clean
  可以看到,所有的变动,已录入版本库. 目前工作区没有新内容,是干净的.
  16.文件操作
  添加多个文件
git add <file1> <file2> #添加file1,file2
git add *.txt #添加当前目录下的.txt文档
git add . #添加当前目录的所有变化
删除文件
git rm <file>
移动或改名
git mv 源文件 新文件

移动:git mv config.php ./inc/config.php
改名:git mv config.php config.inc.php
3.3 改动日志
每个文件/目录发生的版本变化,我们都可以追溯.
命令为:"git log "
常用格式:
git log 查看项目的日志
git log <file> 查看某文件的日志
git log . 查看本目录的日志
  例:
git log 显示如下:
commit 37285a5a9bc5b62609c5e81dacc4daafab1b9600
Author: lucy <lucy@xx.com>
Date: Thu Nov 12 17:09:04 2015 +0800
new readme.txt
...
...
commit c7dfbb8a7ab6c6377040a20c851216572a79d0a0
Author: yanshiba <yanshiba@gmail.com>
Date: Mon Nov 9 15:08:05 2015 +0800
新建index.php
  如果感觉log有点乱,可以git log --pretty=oneline ,让日志单行显示.
37285a5a9bc5b62609c5e81dacc4daafab1b9600 new readme.txt
...
c7dfbb8a7ab6c6377040a20c851216572a79d0a0 新建index.php
  17.版本切换
  我们针对ver.txt,连续修改4次,形成4个版本,练习版本切换.
one line
second line
third line
four line
  git reflog 查看版本变化
$ git reflog
5d5df85 HEAD@{0}: commit: four
6207e59 HEAD@{1}: commit: three
70110b9 HEAD@{2}: commit: two
bc65223 HEAD@{3}: commit (initial): one
  HEAD指向当前版本5d5df86 ,
切换为head的前1版本,git reset --hard HEAD^
切换为head的前2版本,git reset --hard HEAD^^
切换为head的前100版本,git reset --hard HEAD~100
实例:
$ git reset --hard HEAD^^
HEAD is now at 70110b9 two
  此时,查看ver.txt的内容变为:
one line
two line
也可以利用版本号来切换,例
$ git reset --hard 6207e59
HEAD is now at 6207e59 three
注意:版本号不用写那么长,能要能保证不与其他版本号重复就行.
例git reset --hard 6207
  18.分支管理
  分支有什么用?
  在开发中,遇到这样的情况怎么办?
网站已有支付宝在线支付功能,要添加"微信支付".
修改了3个文件, wechat.php ,pay.php
刚做到一半,突然有个紧急bug: 支付宝支付后不能修改订单状态.
你需要立即马上修改这个bug,需要修改的文件是,ali.php ,pay.php .
问题是:pay.php ,已经被你修改过,而且尚未完成.
直接在此基础上改,肯定有问题.
把pay.php倒回去? 那我之前的工作白费了.
此时你肯定会想: 在做"微信支付"时,能否把仓库复制一份,在此副本上修改,不影响原仓库的内容.修改完毕后,再把副本上的修改合并过去.
好的,这时你已经有了分支的思想.
前面见过的master ,即是代码的主干分支,
事实上,在实际的开发中,往往不会直接修改和提交到master分支上.
而是创建一个dev分支,在dev分支上,修改测试,没问题了,再把dev分支合并到master上.
  在做"微信支付"时,我们创建一个wechat分支.
把wechat分支commit ,此时,master分支内容不会变,因为分支不同.
当遇到紧急bug时,创建一个AliBug分支.
修复bug后,把AliBug分支合并到master分支上.
再次从容切换到wechat分支上,接着开发"微信支付"功能,开发完毕后,
把wechat分支合并到master分支上.
  查看分支
  查看所有分支 git branch

git branch
* master # 说明只有master分支,且处于master分支.
  创建分支
  创建dev分支 git branch dev
git branch dev # 创建dev分支
git branch #查看分支
dev
* master # dev分支创建成功,但仍处于master分支
  切换分支
  切换到dev分支 git checkout dev
再次查看
$ git branch
* dev
master # 已切换到dev分支上
  合并分支
  当我们在dev上开发某功能,并测试通过后,可以把dev的内容合并到master分支.
例:
当前的readme.txt 内容为"so so",在dev分支下,添加一行"from dev"
并提交
git add readme.txt
git commit -m "mod in dev"
再次切换到master ,查看readme.txt的内容,仍为'so so'
合并dev分支,git merge dev , 如下:
$ git merge dev
Updating c5364fe..412926b
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
再次查看readme.txt的内容,已变为"soso from dev";
  删除分支
  git branch -d dev
Deleted branch dev (was 412926b).
  快速创建和切换分支
  git checkout -b dev # 创建dev分支并立即切换到dev分支
即起到git branch dev和git checkout dev的共同作用.
  19.查看远程仓库别名
  查看远程仓库别名
查看远程仓库:git remote
查看仓库地址:git remote -v
例:
git remote -v
origin https://git.oschina.net/lianshou/test.git (fetch)
origin https://git.oschina.net/lianshou/test.git (push)
  20.删除远程库别名
  命令:git remote remove <远程库名>
示例:git remote remove origin
  21.添加远程库别名
  命令:git remote add <远程库名> <远程库地址>
示例:
git remote add origin https://git.oschina.net/lianshou/test.git
注: 远程库名一般叫origin ,但并非强制,你可以自己起名.
例:
git remote add online https://git.oschina.net/lianshou/test.git
  22.修改远程库名称
  git remote rename <旧名称> <新名称>
例:
git remote rename online oschina
  23.公钥登陆
  我们push本地仓库到远程时,总要输入用户名/密码,这很不方便.
配置公钥,可以避免频繁输用户名/密码的麻烦.
1. 配置ssh格式的远程仓库地址
git remote add 远程仓库名 远程仓库地址
例:
git remote add gitaddr git@git.oschina.net:lianshou/test.git
2. 创建ssh key
ssh-keygen -t rsa -C "youremail@example.com" ,把邮件地址换成你自己的邮件地址,一直回车,不用输入密码.完成后,可以在用户主目录里找
到.ssh目录,内有id_rsa和id_rsa.pub两个文件. id_rsa是私钥,id_rsa.pub是公钥.
这两把钥匙是成对的,可以让分别持有私钥和公钥的双方相互认识.
3. 把公钥放在服务器
用记事本打开id_rsa.pub ,复制公钥内容.
登陆git.oschina.net,如下图,填入公钥并保存.
  push本地仓库到远程,发现不用填密码了
git push gitaddr master

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-385756-1-1.html 上篇帖子: 最快捷地开始git 下篇帖子: windows配置Gitlab、SSH和TorToiseGit基本操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表