协同修改
多人并行不悖的修改服务器端的同一个文件
数据备份 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态 版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空 间,提高运行效率。这方面SVN 采用的是增量式管理的方式,而Git 采取了文件系统快照的方式
权限控制 对团队中参与开发的人员进行权限控制 对团队外开发者贡献的代码进行审核——Git 独有
历史记录 查看修改人、修改时间、修改内容、日志信息 将本地文件恢复到某一个历史状态
分支管理 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率
集中式版本控制工具: 可能会出现单点故障 CVS、SVN、VSS……
分布式版本控制工具: Git、Mercurial、Bazaar、Darcs……
大部分操作在本地完成,不需要联网 完整性保证 尽可能添加数据而不是删除或修改数据 分支操作非常快捷流畅 与Linux 命令全面兼容
一直点击next 然后安装即可
代码托管中心的任务:维护远程库
局域网环境下:GitLab 服务器
外网环境下: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” ,后面不能带文件名
验证文件 git 用这种机制来保证数据的完整性 git底层采用SHA-1算法
不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定 输入数据确定,输出数据能够保证不变 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大 哈希算法不可逆
快照, 提交对象 有一个hash值,里面有tree的hash值,tree里面有多个文件的hash值 文件没有修改,则保存链接指向之前的文件,有修改,对完整的文件进行快照 每个快照 有父节点
Git 把数据看作是小型文件系统的一组快照。每次提交更新时Git 都会对当前 的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改, Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git 的 工作方式可以称之为快照流
切换分支 相当于切换了 指针,效率高 不同分支在推进
Filec中需要版本3的时候直接将 deta2 和deta1 和Filec合并一起即可
创建远程库 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” 这里同样也不能加文件名
为每一个账号设置一个
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了