Git&Github的使用

    科技2024-11-06  12

    版本控制工具拥有的功能

    协同修改

    多人并行不悖的修改服务器端的同一个文件

    数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态 版本管理

    在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空 间,提高运行效率。这方面SVN 采用的是增量式管理的方式,而Git 采取了文件系统快照的方式

    权限控制 对团队中参与开发的人员进行权限控制 对团队外开发者贡献的代码进行审核——Git 独有

    历史记录 查看修改人、修改时间、修改内容、日志信息 将本地文件恢复到某一个历史状态

    分支管理 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率

    集中式版本控制工具: 可能会出现单点故障 CVS、SVN、VSS……

    分布式版本控制工具: Git、Mercurial、Bazaar、Darcs……

    Git 的优势

    大部分操作在本地完成,不需要联网 完整性保证 尽可能添加数据而不是删除或修改数据 分支操作非常快捷流畅 与Linux 命令全面兼容

    Git结构

    Git的安装

    一直点击next 然后安装即可

    Git和代码托管中心

    代码托管中心的任务:维护远程库

    局域网环境下:GitLab 服务器

    外网环境下:GitHub 、码云

    本地库和远程库

    跨团队协作

    将代码上传到Github

    先在我的电脑 找到一个路径,右键 点击 Git Bash here 输入代码

    生成 .git隐藏文件 git init

    工作区文件添加到暂存区 git add a.txt

    将暂存区的文件提交到本地库 git commit -m “first commit” a.txt first commit是本次提交的 信息,相当于代码里的注释

    新建远程库地址的名字 git remote add test https://github.com/xx/Test.git test为远程库地址的名字,https://github.com/xx/Test.git这个地址在GitHub上有,在 you repositories 里面,

    点击code HTTPS 里的地址 就是远程库地址

    推送到远程库 git push test master

    然后自动弹出的窗口 输入GitHub的账号和密码 只需输入一次

    设置签名

    目的:区分开发人员身份 建议使用系统用户级别的签名 能省事 用户名: Email: 这里的签名和 远程库(Github)的不一样的

    命令: 项目级别/仓库级别:仅在当前本地库范围内有效 git config user.name tom git config user.email xx@xx.com

    系统用户级别:登陆当前操作系统的用户范围 (自己 x) git config --global user.name tom git config --global user.eamil xx@xx.com 优先级:项目级别优先于系统用户级别,二者都有 用项目级别;没有项目级别,用系统用户级别

    项目级别 签名被 设置到 .git/config下 系统用户级别 ~/.gitconfig 下 ~为Windows用户的主目录,打开c盘,用户,找到自己的账户

    git status 查看工作区,暂存区的状态 git add 将工作区的 新建/修改 添加到 暂存区 git commit -m “commit message” 将暂存区的文件提交到本地库 新建的文件 要先git add,能撤回,修改的文件可以直接 commit 但是不能撤回

    初始化本地库

    生成 .git隐藏文件

    x@x-x MINGW64 /e/Download/bbb $ git init Initialized empty Git repository in E:/Download/bbb/.git/

    查看工作区/暂存区状态

    x@x-x MINGW64 /e/Download/bbb (master) $ git status On branch master 在master分支上

    No commits yet 还没有提交,即本地库里没有东西 (提交 是到本地库里)

    nothing to commit (create/copy files and use “git add” to track) 没有文件可提交(即暂存区没有东西),(创建或复制文件,使用 git add 去追踪)

    x@x MINGW64 /e/Download/bbb (master) $ vim a.txt

    x@x-x MINGW64 /e/Download/bbb (master) $ git status On branch master

    No commits yet

    Untracked files: 没有追踪的文件 (use “git add …” to include in what will be committed) 使用git add 去把要提交的文件包含进去到暂存区 a.txt 红色字体

    nothing added to commit but untracked files present (use “git add” to track)

    工作区文件添加到暂存区

    x@x-x MINGW64 /e/Download/bbb (master) $ git add a.txt warning: LF will be replaced by CRLF in a.txt. The file will have its original line endings in your working directory

    x@x-x MINGW64 /e/Download/bbb (master) $ git status On branch master

    No commits yet

    Changes to be committed: (use “git rm --cached …” to unstage) 删除添加到暂存区的文件 new file: a.txt 绿色

    暂存区文件提交到本地库

    x@x-x MINGW64 /e/Download/bbb (master) $ git commit a.txt warning: LF will be replaced by CRLF in a.txt. The file will have its original line endings in your working directory [master (root-commit) c578dbe] first commit 根提交, 1 file changed, 4 insertions(+) create mode 100644 a.txt

    x@x-x MINGW64 /e/Download/bbb (master) $ git status On branch master nothing to commit, working tree clean

    x@x-x MINGW64 /e/Download/bbb (master) $ vim a.txt

    x@x-x MINGW64 /e/Download/bbb (master) $ git status On branch master Changes not staged for commit: (use “git add …” to update what will be committed) 更新 将要提交的文件 (use “git restore …” to discard changes in working directory)取消在工作目录的修改 modified: a.txt 红色字体

    no changes added to commit (use “git add” and/or “git commit -a”) 修改的文件 可以先add 再commit ,也可以直接commit

    命令git restore readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

    第一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

    第二种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态

    x@x-x MINGW64 /e/Download/bbb (master) $ git add a.txt warning: LF will be replaced by CRLF in a.txt. The file will have its original line endings in your working directory

    x@x-x MINGW64 /e/Download/bbb (master) $ git status On branch master Changes to be committed: (use “git restore --staged …” to unstage) modified: a.txt

    x@x-x MINGW64 /e/Download/bbb (master) $ git commit -m “second commit” a.txt

    查看历史记录

    git log 太多了 ,多屏显示,空格键 往下看,q退出,b向上翻页 git log --pretty=oneline 只能显示当前版本和之前版本 git log --oneline 只能显示当前版本和之前版本 git reflog 显示所有的版本

    x@x-x MINGW64 /e/Download/bbb (master) $ git log --pretty=oneline d4c15cc8cdcf32cf43faddabafc60e58303f2d40 (HEAD -> master) second commit c578dbed28226b9dc7861689a877f5ace1a948b1 first commit 索引值

    x@x-x MINGW64 /e/Download/bbb (master) $ git log --oneline d4c15cc (HEAD -> master) second commit c578dbe first commit

    x@x-x MINGW64 /e/Download/bbb (master) $ git reflog d4c15cc (HEAD -> master) HEAD@{0}: commit: second commit ,指针(HEAD)在此位置 c578dbe HEAD@{1}: commit (initial): first commit 需要指针移动一步 到此版本 局部索引值

    前进后退历史版本

    基于索引值操作(推荐使用) git reset --hard c578dbe

    使用^符号 只能往后(之前的版本) git reset --hard HEAD^ 往后一步 git reset --hard HEAD^^ 往后两步

    使用~符号 只能往后(之前的版本) git reset --hard HEAD~2 往后两步

    git help reset 查看命令 index file(暂存区) ,working tree(工作区) soft 参数 仅仅在本地库移动HEAD指针,不变 mixed 参数 在本地库移动HEAD指针,重置暂存区,不变 hard 参数 在本地库移动HEAD指针,重置暂存区,重置工作区,变了 所以一般 直接用hard就好了

    永久删除文件后 找回

    先提交 git add aaa.txt git commit -m “del” aaa.txt git reflog git reset --hard xxx 再回到之前没删除的版本 即可

    或者 没commit 直接用 git reset --hard HEAD 或者 git reset --hard 指针的位置(被删除文件存在的版本)

    工作区的文件与暂存区的文件比较

    x@x-x MINGW64 /e/Download/bbb (master) $ git diff a.txt diff --git a/a.txt b/a.txt index f68a1c0…935d5bf 100644 — a/a.txt +++ b/a.txt @@ -1,4 +1,4 @@ sss sss sss -abc +abccccccc

    删除(红色) ,+ 增加(绿色) ,在原来行的后面加上文字, 即先 - 后 +

    git diff HEAD a.txt 工作区文件与本地库的当前版本比较 git diff HEAD^ a.txt 工作区文件与本地库当前版本的前一个版本比较 git diff HEAD[指针位置] 工作区文件与本地库历史版本比较 git diff 不加文件名,比较多个文件

    分支管理

    多条线同时推进多个任务 某个分支开发失败了,删除该分支 分支彼此独立 hot_fix 热修复,服务器不停

    git branch -v 查看分支 git branch hot_fix 创建分支 git checkout hot_fix 切换分支 合并分支 切换到被合并的分支上,然后 git merge hot_fix, 把hot_fix的修改 合并到master上,hot_fix是先提交了的

    解决冲突

    master的修改和hot_fix的修改的地方一致,但改的内容不一样,然后合并 ,就产生冲突了 自己手动 修改即可 然后 git add 文件名 然后 git commit -m “xx” ,后面不能带文件名

    Hash算法

    验证文件 git 用这种机制来保证数据的完整性 git底层采用SHA-1算法

    不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定 输入数据确定,输出数据能够保证不变 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大 哈希算法不可逆

    Git文件管理机制

    快照, 提交对象 有一个hash值,里面有tree的hash值,tree里面有多个文件的hash值 文件没有修改,则保存链接指向之前的文件,有修改,对完整的文件进行快照 每个快照 有父节点

    Git 把数据看作是小型文件系统的一组快照。每次提交更新时Git 都会对当前 的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改, Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git 的 工作方式可以称之为快照流

    Git分支管理机制

    切换分支 相当于切换了 指针,效率高 不同分支在推进

    集中式版本控制工具的文件管理机制

    Filec中需要版本3的时候直接将 deta2 和deta1 和Filec合并一起即可

    Git 的“提交对象”

    提交对象及其父对象形成的链条

    Github

    创建远程库 new repository

    新建远程库别名(origin) $ git remote add origin https://github.com/Chuang2-Hchen/Test.git

    $ git remote -v 查看远程库的别名 origin https://github.com/x-x/Test.git (fetch) 取回 origin https://github.com/x-x/Test.git (push) 用来推送

    $ git push test master Enumerating objects: 3, done. Counting objects: 100% (3/3), done. Writing objects: 100% (3/3), 225 bytes | 225.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

    To https://github.com/x-x/Test.git

    [new branch] master -> master

    推送master git push origin master

    克隆

    git clone 远程库地址

    x@x-x MINGW64 /e/Download/cc $ git clone https://github.com/x-x/Test.git Cloning into ‘Test’… remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 205 bytes | 0 bytes/s, done.

    x@x MINGW64 /e/Download/cc/Test (master) $ vim a.txt

    x@x-x MINGW64 /e/Download/cc/Test (master) $ git add a.txt

    x@x-x MINGW64 /e/Download/cc/Test (master) $ git commit -m “cc commit” a.txt [master 4be3f13] cc commit 1 file changed, 1 insertion(+)

    邀请别人进入团队 此时 cc 不能push 到远程库,要先加入团队,才能push

    git push test master 然后cc的GitHub账户登陆, 在bb的GitHub上的 repository -> Settings -> Collaborators 输出你要邀请的人的GitHub的账号, 点击 Add collaborator 然后点击 Copy invite link 发给对方,对方登陆GitHub后 ,访问该链接, 点击Accept invitation 就ok了

    拉取

    bb账户 抓取 远程库 git fetch test master cat a.txt 但此时本地库的内容没有变化 然后 git checkout test/master cat a.txt 内容变化了 git checkout master cat a.txt 先看抓取下来的内容,然后再去合并起来 git merge test/master 然后 cat a.txt 内容变了

    或者 直接 git pull test master 拉取 pull=fetch抓取+merge 合并

    tors 输出你要邀请的人的GitHub的账号, 点击 Add collaborator 然后点击 Copy invite link 发给对方,对方登陆GitHub后 ,访问该链接, 点击Accept invitation 就ok了

    拉取

    bb账户 抓取 远程库 git fetch test master cat a.txt 但此时本地库的内容没有变化 然后 git checkout test/master cat a.txt 内容变化了 git checkout master cat a.txt 先看抓取下来的内容,然后再去合并起来 git merge test/master 然后 cat a.txt 内容变了

    或者 直接 git pull test master 拉取 pull=fetch抓取+merge 合并

    协同开发 冲突

    如果不是基于GitHub的最新版所做的修改,不能推送,要先拉取pull

    bb账户 在a.txt第二行做了修改,提交文件,然后push到远程库。此时,cc账户也对a.txt第二行做了修改,提交文件,然后就发生冲突了。

    所以cc应该先 git pull test master,然后再进入a.txt此时就能看到 有bb和cc的修改,然后根据实际,给出最后的修改即可。git add a.txt ,git commit -m “com” 这里同样也不能加文件名

    跨团队协作

    SSH免密登陆

    为每一个账号设置一个

    c -> 用户 -> 你的账户 -> 打开git bash here

    输入代码 ssh-keygen -t rsa -C x@x.com ,C是大写的,后面是你GitHub的邮箱 然后一直按回车 ,进入 cd .ssh , cat id_rsa.pub ,复制下面的内容

    ssh-rsa xxxxxx…

    然后 重新新建一个远程库地址

    git remote add origin_ssh git@github.com:x.git 这个地址是

    点击 add deploy key,titles 随便写,key填写 之前复制的内容,勾上Allow write access 。 push推送文件后,输入yes

    然后 就ok了

    Processed: 0.070, SQL: 8