道者编程

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 #Centos
2: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 ..." to unstage)

        new file:   1.txt
 以上说明已经添加到缓冲区,我们在运行 git commit -m "new" 提交

$ 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 ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   1.txt
提示modified:   1.txt修改过,可以add,我们add一下,add没有任何提示,表明添加成功,再status查看状态

$ 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: 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

我们在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 
Date:   Sun May 6 14:40:45 2018 +0800

    newg
刚才有两个log,我们回退了一次,就只有一个了。

如果我们上次回退了一个,后面忘记了,但又想撤销回退怎么办?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 ..." 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")
显示 2.txt已经在工作区中被删除, use有两个命令可以用,一个是在版本库中也删除,一个是把版本库的文件恢复过来,可能我们发现删错了,我们先恢复一下

$ 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 ..." to unstage)

        deleted:    2.txt
 看见了吧,如果不执行commit,还可以恢复过来。

$ 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 #可以省略
 


最新评论:
1楼 广东省深圳市 电信ADSL 发表于 2018-05-07 15:48:29
666666666
2楼 广东省深圳市 电信 发表于 2018-05-07 16:28:43
老陈,骚的可以
共有 2 条记录  首页 上一页 下一页 尾页 1
我要评论:

看不清楚