Git的使用
Git是一个开源的分布式版本控制系统,Git和linux创始人是同一个人,当年Linus为管理linux代码专门写了一个管理软件——Gti。何为分布式?Git和svn一样有一个server。但Git有一个本地库概念,所有人都有一个本地库。首先文件在工作区,工作区的文件就是平时目录下的文件,一眼就可以看出来,add之后文件传输到暂存区,commit后提交到本地库。暂存区和本地库文件都可以后腿、撤销、修改以及删除,因为本地库是在自己电脑上,所以不需要网络,只是如果要和别人文件同步,这时候就需要网络PUS到Server。当然也可以两个人直接传输文件,比如用QQ,U盘。对Server依赖没有svn这么强。
一:安装Git
1:Linux安装:
$ sudo apt-get install git #Debian或Ubuntu $ yum install git #Centos2:Windows安装:
在这里下载官网安装程序,选择对应的版本,32/64位。安装完后可以在开始——菜单里看见三个快捷工具:
Git Bash:为Git win客户端命令行工具,可以使用很多linux命令,如:
GIT Ui为可视化工具。如果对linux不熟悉,也可以用GIT CMD,看自己选择。
3:安装好以后,接下来设置名字和邮箱,必须
$ git config --global user.name "李小龙" $ git config --global user.email "2421102982@qq.com"
git config credential.helper store #然后再试一下推送或者拉取,再次输入用户名和密码后,下次就不用输入了
--global 为全局设置,表示这台机器上所有的Git都用这个设置。
也可以单独项目配置:切换到项目目录执行:
git config user.name "李小龙" git config user.email "2421109282@qq.com"
或者直接到.git/config文件
[user] name = jacken email = 444444@qq.com [credential] helper = store
第一次输入后,记录了
二:创建版本库:
1:首先创建一个空目录
上图这个过程我使用Git Bash用linux命令操作,进入f盘,在盘下新建phpchina文件夹,也可以打开f盘,鼠标右键新建目录,都行。然后进入文件夹。
$ git init
出现这个就表示新建仓库完成了,此时在F:/phpchina下多了一个.git文件,该目录是隐藏的。
三:添加提交
1:添加:
$ git add 1.txt如果没有任何提示,说明添加成功,用 git status 查看一下现在的状态
$ git status On branch master No commits yet Changes to be committed: (use "git rm --cached以上说明已经添加到缓冲区,我们在运行 git commit -m "new" 提交..." to unstage) new file: 1.txt
$ git commit -m 'new' [master (root-commit) 1f13d3b] new 1 file changed, 123457 insertions(+) create mode 100644 1.txt
这样文件就被提交到本地库。 -m 后面的参数自己定义,大概定义一下这次提交的注释,比如改了什么东西,以便以后查找。再运行一下status 查看状态
$ git status On branch master nothing to commit, working tree clean显示没有需要提交的修改,工作目录是干净的(working directory clean)
我们再修改一下1.txt文件,status查看状态
$ git status On branch master Changes not staged for commit: (use "git add提示modified: 1.txt修改过,可以add,我们add一下,add没有任何提示,表明添加成功,再status查看状态..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: 1.txt
$ git status On branch master Changes to be committed: (use "git reset HEAD..." to unstage) modified: 1.txt
表示提交成功,看见没,这里两次add之后的status状态提示不一样,虽然两次add,但第一次我们文件还没到本地版本库里,第二次版本库已经有了文件,我们修改后再次add,所以两次显示的信息不一样,但结果是一样的。
另外两个有用的命令:
git diff 可以查看当前没有add 的文件(不在暂存区的文件变化)
git diff --cached查看已经add但没有commit 的文件(在暂存区的文件变化)
再次提交
$ git commit -m 'new_1' [master ed22ca3] new_1 1 file changed, 1 insertion(+), 123457 deletions(-) rewrite 1.txt (100%)
add:把文件提交到缓存区,commit:把缓存区的文件提交到本地仓库。还有第三部,把本地仓库服务器上的仓库去。为什么说Git在没有网络的时候也可以开发,就是因为没有网络我们可以把数据暂时先放在自己的仓库里,等有网络的时候再推过去。版本库在哪里?我们init的时候会在工作区的目录下产生一个.git目录,这个目录是隐藏的,版本库就在这里。
四:查看日志
上面我们提交了两次,查看一下,运行 git log
$ git log commit ed22ca30b5f695e5ec636bb65a413bf0bcfa492e (HEAD -> master) Author: unknownDate: Sun May 6 14:59:18 2018 +0800 new_1 commit 1f13d3bf06840575ed27e0c1609d7fc5a03a492e Author: unknown Date: Sun May 6 14:40:45 2018 +0800 new
我们在commit的时候有一个参数,第一次我们是-m "new",第二次是-m "new_1",从上面我们可以清晰的看到提交的历史记录。git log命令从近到远显示提交的记录日志。
也可以只查看commit_id(版本号)等参数,带入参数 --pretty=oneline
$ git log --pretty=oneline ed22ca30b5f695e5ec636bb65a413bf0bcfa492e (HEAD -> master) new_1 1f13d3bf06840575ed27e0c1609d7fc5a03a492e new
五:版本回退
$ git reset --hard HEAD^ #回退到上一个版本,HEAD表示最新版本 $ git reset --hard ed22ca30b #回退到指定版本
回退到指定版本,--hard 加上版本号即可,版本号可以不写全,Git自动补全。
回退一下
$ git reset --hard 1f13d3bf HEAD is now at 1f13d3b new再查看日志
$ git log commit 1f13d3bf06840575ed27e0c1609d7fc5a03a492e (HEAD -> master) Author: unknown刚才有两个log,我们回退了一次,就只有一个了。Date: Sun May 6 14:40:45 2018 +0800 newg
如果我们上次回退了一个,后面忘记了,但又想撤销回退怎么办?Git一样有办法。执行命令:git reflog;该命令记录了历史命令记录
$ git reflog 1f13d3b (HEAD -> master) HEAD@{0}: reset: moving to 1f13d3bf ed22ca3 HEAD@{1}: commit: new_1 1f13d3b (HEAD -> master) HEAD@{2}: commit (initial): new这里ed22ca3,找到这个版本号就好办了,执行以下
$ git reset --hard ed22ca3 HEAD is now at ed22ca3 new_1查看log
$ git log commit ed22ca30b5f695e5ec636bb65a413bf0bcfa492e (HEAD -> master) Author: unknown回来啦,又出现了两个。Date: Sun May 6 14:59:18 2018 +0800 new_1 commit 1f13d3bf06840575ed27e0c1609d7fc5a03a492e Author: unknown Date: Sun May 6 14:40:45 2018 +0800 new
六:修改删除
1:撤销修改:add 是把文件提交到暂存区,commit是把文件提交到本地版本库,刚才五,我们撤销修改是把版本库的撤回来,那么怎么把暂存区的也撤销回来呢?也就是add之后但还没commit的文件,很简单,使用checkout 命令
$ git checkout -- 1.txt
命令里的 -- 一定要加,如果不加,就切换到另外一个分支。
2:删除:我们新建一个2.txt,add ,commit提交,然后到目录中把这个文件删除,再看一下Git状态
$ git status On branch master Changes not staged for commit: (use "git add/rm显示 2.txt已经在工作区中被删除, use有两个命令可以用,一个是在版本库中也删除,一个是把版本库的文件恢复过来,可能我们发现删错了,我们先恢复一下..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) deleted: 2.txt no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout -- 2.txt再看一下工作区,2.txt又回来了,有点类似win的回收站。
再试一下从版本库中删除,先执行git rm,再仔细git commit
$ git rm 2.txt rm '2.txt'已经被删除了,接下来执行 git commit -m "remove 2.txt" 提交,j将变化更新到仓库,如果不执行这个,会怎么样?我们git status看看
$ git status On branch master Changes to be committed: (use "git reset HEAD看见了吧,如果不执行commit,还可以恢复过来。..." to unstage) deleted: 2.txt
$ git commit -m "remove 2.txt" [master 6d939ba] remove 2.txt 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 2.txt再看状态:
$ git status On branch master nothing to commit, working tree clean没了!
七:注册GitHub仓库
1:登陆GitHub,如果没有账号,请先注册,注册后进入个人中心,点击头像——》settings-》SSH and GPG keys(左侧)
2:创建SSH Key,运行 ssh-keygen -t rsa -C "2421102982@qq.com" 一路回车。
$ ssh-keygen -t rsa -C "2421102982@qq.com" Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/cjs/.ssh/id_rsa): Created directory '/c/Users/cjs/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/cjs/.ssh/id_rsa. Your public key has been saved in /c/Users/cjs/.ssh/id_rsa.pub. The key fingerprint is: SHA256:sy7dhF+1quDvAoKBKcOiGPnPkiNxx65xGd9bAnoMZVU 2421102982@qq.com The key's randomart image is: +---[RSA 2048]----+ | ..E | | . | |.+ o | |O.. o . | |=+ +o . S. . . | |+ + +B.o.o. . . | | o.*+.+o=+.. . | |. +o+..oo=o . | | ..+ .+++. | +----[SHA256]-----+
可以看到这里生成了两个文件
可以看到这里有两个是SSH Key的秘钥对,id_rsa:私钥,不能泄露出去,id_rsa.pub:公钥;两个是SSH Key的秘钥对,id_rsa:私钥,不能泄露出去,id_rsa.pub:公钥,我们把id_rsa.pub内容放到GitHub里,这样GitHub就知道是你推送的数据。
点击SSH keys,Title填写一个主题名称,自己取一个,Key粘贴id_rsa.pub文件内容。可以提交多个Key。在GitHub免费托管代码,任何人都可以看到,如果要私密,除非交钱,或者自己搭建GitHub。
八:操作远程库
1:本地添加远程库
登陆GitHub,在右上角+选择New repository
我们刚才在本地创建的叫phpchina,所以在Repository name填入phpchina,其他不管,点击“Create repository”按钮,这样就创建了一个远程Git仓库。
GItHub这里有提示,可以把远程库克隆下来,也可以关联本地库,我们做一下关联。
$ git remote add origin https://github.com/cjs5202001/phpchina.git无提示,表示成功,这样就可以推送数据了,这里的cjs5202001是我账号!!!
接下来我们弄一下推送,把本地仓库的文件推送过去,执行:git push -u origin master
$ git push -u origin master Counting objects: 10, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (10/10), 3.06 KiB | 104.00 KiB/s, done. Total 10 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), done. To https://github.com/cjs5202001/phpchina.git * [new branch] master -> master Branch 'master' set up to track remote branch 'master' from 'origin'.推送的时候可能会弹出GitHub登陆框,填写一下即可,上述画面表示已经成功推送。
查看GitHub,1.txt已经上去了。
第一次推送master分支时,加上-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。以后只要:git push origin master 即可
2:远程库克隆到本地
找到项目地址,点击Clone or download
Git使用多种如https,ssh,ssh速度最快,命令:
$ git clone https://github.com/cjs5202001/phpchina.git #如果是https方式 $ git clone git@github.com:cjs5202001/phpchina.git #ssh方式
这样就OK了!
九:Git分支操作
1:什么是分支?比如自己开发某个功能,一时半会儿开发不完,如果每天都提交,代码不完整,可能会影响别人开发;但如果开发完后再提交,可能会有丢失的风险。那么怎么办呢?这时候就创建一个分支,这个分支只有自己知道,或者只限于参与此功能开发的其他几个人知道,等全部开发完毕后,再合并到主干(master)上去。
#合并分支 #比如从 dev 到 test #1:提交dev的代码 git add git commit -m 'dev' git push -u origin dev #2:切换到test git checkout test #切换到test git pull origin test # 同步一下代码 git merge dev #把dev代码合并 #3:提交到test git push -u origin test
十:使用小技巧
#1:git 中忽略提交指定文件或目录 在根目录创建 .gitignore 文件,打开写入 /target/ #过滤文件设置,表示过滤这个文件夹 *.mdb ,*.ldb ,*.sln #表示过滤某种类型的文件 #2:git删除服务器上的文件或者目录,分三步,比如这里删除a目录 git commit -m a/ #删除缓存和本地的文件 git rm -r --cached a/ #删除缓存文件 git push #推送过去 ,这样远程以及本地都删除了,其他人在git pull的时候也会相应删除本地文件
强制覆盖本地,更新
git fetch --all git reset --hard origin/master git pull #可以省略