Git版本控制和上传GitHub(一)(增删改查,及远程同步)

如果多人做一个项目,那就要用到版本控制。
SVN是集中式控制,GIt是分布式控制 这里说Git
SVN是都在服务器管理(断网传不了),Git是服务器有一份仓库,本地有一份仓库(断网还能存本地的)
第一,防止项目崩掉,可以退回之前版本
第二,每次上传都有个信息,你改了什么代码
第三,保存是改变差异,而不是重新再来一份,不会占硬盘
第四,还有改了同一脚本代码,会进行自动合并,改到同一代码就需要手动合并,选择去用哪一个版本。(冲突是传不上去的)

GitHub是全球最大的代码托管仓库
不过在国外网速上传可能有点感人 之前有用过码云
教程看的是廖雪峰的Git 其实还有MySQL教程
虽然人家是Java Python大神但是不影响我们学习
https://www.liaoxuefeng.com/wiki/896043488029600
因为Git一开始是在Linux上开发的所以少不了命令行,需要下一定的学习成本去用命令行控制
然后开始下载Git 这个是官网
https://git-scm.com/downloads
选择系统第二个就是Windows系统 然后开始下载

image.png

国外网网速感人 停停走走 网速为0我建议删了重新下载 这个是网盘 不过是2.15版本,我现在最新的是2.21
https://pan.baidu.com/s/1kU5OCOB#list/path=%2Fpub%2Fgit
然后选择一个安装目录之后一路Next

配置Git添加文件

安装完毕 在桌面右键


image.png

就会有这两个
点击Bash有个小黑窗口


image.png

然后设置名字邮箱,改一改自己敲上去,好像复制不太行
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

--global参数表示你电脑上所有Git仓库都会用这个配置

然后创建版本库

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

pwd命令用于显示当前目录 但是不要有中文
然后用 git init 把这个目录改变为Git可管理的目录

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

然后我们创建的目录多了个这个


image.png

桌面自动多了个这个文件件


image.png

现在我们试着吧Text文件添加到仓库
创建一个ReadMe.txt 然后放在learngit目录下外面的目录Git找不到
用这个添加命令

$ git add readme.txt

什么都不报就是成功了
然后用命令git commit把文件提交到仓库

$ git commit -m'readMeFile'
[master (root-commit) 783b9ec] readMeFile
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 ReadMe.txt

-m后是本次提交说明
成功了会告诉后两句
1个文件发生改变,插入0行,删除0行
然后发现我们Add是分别多个Add,提交就是一起提交

Git修改

然后我们在txt多写几行别的东西
用git 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:   ReadMe.txt

no changes added to commit (use "git add" and/or "git commit -a")

上面输出说文件被改过了
然后用git diff(diff就是difference差别)查看怎么修改的这个文件信息

$ git diff ReadMe.txt
diff --git a/ReadMe.txt b/ReadMe.txt
index e69de29..85476a8 100644
--- a/ReadMe.txt
+++ b/ReadMe.txt
@@ -0,0 +1 @@
+sdfsdfsdfsdf
\ No newline at end of file

下面的+1就是我们改了一行

然后我们用命令git add

$ git add ReadMe.txt

然后再git status查看状态

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        modified:   ReadMe.txt

将要被提交的修改包括ReadMe.txt
用git commit提交

$ git commit -m'change'
[master 42158b4] change
 1 file changed, 1 insertion(+)

再用git status查看仓库状态

$ git status
On branch master
nothing to commit, working tree clean

告诉我们没有什么可以提交的,工作目录是干净的

Git 版本退回

用git log查看一共多少个版本

$ git log
commit 42158b41256749a880ad58bb191bd64470eed1cc (HEAD -> master)
Author: Corn <[email protected]>
Date:   Sun Jun 2 15:02:37 2019 +0800

    change

commit 783b9ec203536a24a34d44f5dfd7ad1f114f28b6
Author: Corn <[email protected]>
Date:   Sun Jun 2 14:48:52 2019 +0800

    readMeFile

如果嫌比较多可以后面加上--pretty=oneline

$  git log --pretty=oneline
42158b41256749a880ad58bb191bd64470eed1cc (HEAD -> master) change
783b9ec203536a24a34d44f5dfd7ad1f114f28b6 readMeFile

前面是版本号 后面是你的注释 版本为毛不用123呢 那多人在一个版本里不就冲突了
用git reset退回 HEAD是当前版本 HEAD是上一版本,上上版本是HEAD^,如果100个版本呢,就有了HEAD~100

$ git reset --hard HEAD~1
HEAD is now at 783b9ec readMeFile

然后我们用cat 函数查看内容

$ cat ReadMe.txt

什么都没有 因为第一版我们就没写
然后我们用git log查看版本

$ git log
commit 783b9ec203536a24a34d44f5dfd7ad1f114f28b6 (HEAD -> master)
Author: Corn <[email protected]>
Date:   Sun Jun 2 14:48:52 2019 +0800

    readMeFile

发现之前的未来被抹去了,就像平行世界里的世界线一样。
怎么回到未来呢,只要你没关窗口往上找到id,


image.png

写前几位就行了 Git会自动帮你找

$ git reset --hard 42158b
HEAD is now at 42158b4 change

然后再看看内容

$ cat ReadMe.txt
sdfsdfsdfsdf

回来了!
Git版本回退速度非常快,他只是把HEAD指针指向不同版本

但是你关了电脑 之后再打开想回到未来怎么办
git reflog这个记录了你每一次命令

$ git reflog
42158b4 (HEAD -> master) HEAD@{0}: reset: moving to 42158b
783b9ec HEAD@{1}: reset: moving to HEAD~0
783b9ec HEAD@{2}: reset: moving to HEAD~1
42158b4 (HEAD -> master) HEAD@{3}: commit: change
783b9ec HEAD@{4}: commit (initial): readMeFile

然后不就知道id号了

工作区和暂存区

Git和SVN不同之一就在于有个缓存区

工作区就是这个


image.png

里面的.git是版本库


image.png

stange是缓存区,master是Git自动为我们创建的第一个分支,还有个HEAD指向第一个版本
image.png

image.png

就是add的时候东西会加入stage缓存区,在我们commit时候把所有修改提交到分支
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的


image.png

管理修改

第一次修改 -> git add -> 第二次修改 -> git commit只会修改第一次的属性,
第一次修改 -> git add -> 第二次修改 -> git add -> git commit 相当于把两次修改合并提交,所以先Add完所有修改在提交

撤销修改

checkout撤销工作区的修改 就是丢弃工作区的修改

$ git checkout -- ReadMe.txt

这个 -- 很重要 如果没有就成了切换到另一个分支的命令了

如果是Add之后用git reset HEAD丢弃暂存区修改,然后再checkout丢弃工作区修改

$ git reset HEAD ReadMe.txt
Unstaged changes after reset:
M   ReadMe.txt

如果已经提交了想撤销可以用版本退回,但是起码没有推送到远程库

删除文件

$ rm ReadMe.TXT

我发现Git好像找文件不区分大小写
查看发现文件被删了 版本库告诉你工作区不一样了
这个rm -rf /慎用https://www.zhihu.com/question/29438735这是车祸惨案现场

$ 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:    ReadMe.txt

no changes added to commit (use "git add" and/or "git commit -a")

然后有两个选择
git rm删掉,并且git commit提交
或者删错了 撤销恢复到最新版本 因为版本库有数据 但是只能回到最近一次最后提交到的位置

$ git checkout -- ReadMe.txt

远程仓库

一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交
因为没有服务器所以链接GitHub
由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的所以要设置。
后面写你的邮箱 然后一路回车

$ ssh-keygen -t rsa -C '[email protected]'
$ ssh-keygen -t rsa -C '[email protected]'
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa):
Created directory '/c/Users/Administrator/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa.
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:XOf1g0shqkpFfD58BkWoXNee5GHV9uSstZGY9afpu7E [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|          oo. ...|
|      .  o.. = .+|
|      .oooo.*.B=+|
|      .++.oo.Bo+B|
|       .S= o.o *=|
|      . . + . =..|
|     . .     o.  |
|    . .       .o |
|     .        Eo |
+----[SHA256]-----+

这个就是生成的位置


image.png

一个私钥一个共钥 公钥可以告诉别人


image.png

这个是GitHub官网
https://github.com/
登录自己账号 没有就注册
英文的话可以用浏览器自行翻译

image.png

image.png

点击new新的
起一个标题还有把公钥粘贴过来
image.png

然后你每在一个电脑都往上添加一个公钥就可以每台电脑都提交了,别人只能看不能改
如果不想别人看就掏钱成私有仓库,要不然就自己搭一个Git服务器
公钥私钥就是防止,万一连接的是假冒服务器或者中间人攻击,核对数据安全性。
流程大概是客户端请求服务器,客户端要求验证,服务器找你在服务器放的公钥,然后找到与你本地公钥核对,公钥一致,服务器用公钥加密发送给你,你用私钥解密,然后再上传

远程仓库与本地同步(GitHub)

找到GitHub左上角 找到


image.png

起一个名字创建其他默认
然后送你一个链接,让你要么与远程仓库关联,要么创建


image.png

我的就是选择SSH协议的第二条照着打,你们要打自己生成的不然就关联到我的了,之后因为你公钥不在手中所以推不上去。

然后因为之前的被我们删了 我们要找回来


image.png

image.png

image.png

然后文件回来了

然后
第二条不要选他的复制!!大坑
把他给的这两边空格去掉 不然一直
git remote add []

image.png

用http的就不会这样放心的复制
然后输入push推送 又挂了


image.png

然后又是个大坑!!!复制过来的 即使不是复制
点后的空格也不能要!!


image.png

如果添加过远程连接
先git remote rm origin取消连接
再添加

image.png

终于好了
这个是GitHub的SSH连接第一次验证GitHub确认你的Key信息是否对,是不是你想连接的地址
Yes就对了
这个警告是永久添加key到已知主机列表中,以后就不用来回输密码了
image.png

如果你怕不是真的GitHub 这个地址可以去核对 不过一般没人看
https://help.github.com/en/articles/githubs-ssh-key-fingerprints
然后
image.png

网站就出现了我们本地的库
从现在开始 只用这个命令就可以提交了

$ git push origin master

从远程仓库克隆

创建一个库


image.png

最下面勾上克隆 然后自动多了个ReadMe


image.png

下面使用命令git clone克隆出来一个本地库
image.png

老夫以身试毒 看看能不能粘贴 这个是可以的,还有别忘了前面加克隆命令


image.png

这样好像可以查看这个目录有什么
image.png

如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。
你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
这个是引用人家的原话

你可能感兴趣的:(Git版本控制和上传GitHub(一)(增删改查,及远程同步))