目录
BASE INFORMATION
安装
创建版本库【repository】
添加文件到缓存区
掌握仓库当前状态
版本回退
git中的三个区
撤销修改
删除文件
添加到远程库
克隆一个本地库
分支管理
bug分支:
feature分支
多人协作
优化
打标签
PS:
创始人--Linux
竞品--cvs、svn 两者都是集中式版本控制系统,需要中央服务器集中存放版本库
git为分布式版本控制系统
学习网站 https://www.liaoxuefeng.com/wiki/896043488029600
安装:
1、安装完成先设置名字和Email地址
$ git config --global user.name "your name"
$ git config --global user.email "your email"
注:config【配置】 --global【表示这台机器所有仓库都用这个config】
创建版本库【repository】
1、创建空目录
$ mkdir 目录名 --创建一个目录
$ cd 目录名 --将当前目录移到新建的目录名下
$ pwd --显示当前目录
2、将创建的目录变成git可以管理的仓库:
$ git init -- init :初始化
添加文件到缓存区
$ git add 文件名 --预提交,可以写多个add,然后最后一起用一个commit,看注b
$ git commit -m "提交说明"
注:a.-m 后面接这次提交的说明,也是这个版本的描述信息
b. $ git add a.txt
$ git add b.txt
$ commit -m "提交了两个文件a和b"
掌握仓库当前状态
$ git status【状态】 -- 包括:是否有添加到缓存区的改动、是否有改动的文件。如果目录增加了文本文件也会有提示,但是如果是文件夹则没有任何提示
$ git diff <文件名> -- 比较现在的文件和缓存区或者仓库里相同的文件有什么改动(若缓存区有相同文件则比较缓存区的否则比较仓库的;如果在文件的最后一行添加换行符(包括在后面增加另一行句子)则最后一句也视为被改动过)
版本回退
$ git log --pretty=oneline -- 查看所有版本历史,其中head指示的是当前版本。参数--pretty=oneline表示美化输出的信息,可以去掉
$ git reset --hard HEAD^ 或者 commit id 前几位 -- 回退到上一个版本或者commit id 对应的版本,并且工作区的内容也会跟着改变
$ git reflog -- 查看命令历史,可以找到所有版本的commit id
注:git log 与 git reflog 的区别:
1、git log查到的是每个commit id 的形成日期和作者,且只能看到当前版本往前的版本id,版本回退后,是看不到当前版本之后的版本信息的
2、git reflog 可以查看每一次commit id 的变动情况,且所有版本id都能查得到。
git中的三个区

工作区就是我们版本库所在的电脑的目录
stage是缓存区,$ git add . 文件就是添加到这里,有时也被称为index区
master是最终区,也是放置所有分支的区
$ cat <文件名> -- 展示的是工作区文件的内容
撤销修改
$ git checkout -- <文件名> -- 将工作区的文件恢复为跟缓存区或者版本库的一样(缓存区优先)
$ git reset HEAD <文件名> -- 把对应文件暂存区的修改撤销掉(unstage),工作区内容不改变(例如在reset之前你还在工作区添加了句子,该句子还依然存在)
删除文件
$ rm <文件名> -- 删除工作区中的文件 (此时库文件不会改变)
$ git rm <文件名> ,然后再 $ git commit -m "描述" -- 将删除提交到缓存区,然后再commit到master,把master中的对应文件也删除
$ git checkout -- <文件名> -- 工作区文件被误删时,可以用来还原( 将工作区的文件恢复为跟缓存区或者版本库的一样)
猜想:$ cat 和 $ rm 都是对工作区的操作,$ git rm 是对版本库的操作,所以~~~
添加到远程库
1、创建、添加SSH Key(有了这个才可以推送东西到远程库)
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
秘钥生成后复制id_rsa.pub(公钥)里面的内容到Github对应ssh秘钥的对应位置
2、链接到远程库
$ git remote add origin <远程库地址> -- 关联到远程库
$ git push -u origin master -- 将当前分支master推送到远程(第一次推送master时要加上-u参数,以后推送更改时直接写$ git push origin master便可)
remote -- 遥远地
克隆一个本地库
$ git clone 远程库ssh地址或者http地址 -- 将一个远程库完整地克隆到本地当前目录(此时本地库master与该远程库master已经自动关联了)
分支管理
$ git checkout -b dev -- 创建一个冰切换到名为dev的分支(注意与命令$ git checkout -- <文件名> 的区别),该命令相当于下面两个:
$ git branch dev
$ git checkout dev
$ git branch -- 查看分支列表
$ git merge dev -- 将dev分支合并到当前分支
$ git branch -d dev -- 删除dev分支
转换分支的另一种写法(这种最好):
$ git switch -c dev -- 创建并切换dev分支
$ git switch dev -- 切换分支
查看分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit ------ graph 曲线图 abbrev 缩写,--abbrev-commit 就是让commit id 缩写的意思
注意:如果合并分支产生冲突时,并不会生成一个新的提交,但是工作区的文件会有改变,提示那里冲突了
禁用fast forward模式合并
$ git merge --no-ff -m "新提交的描述信息" <分支名字>

fast forward 模式的分支合并

也就是说禁用fast forward 模式会生成一个新的提交,新的commit id
在dev分支的时候add,切换到master分支时可以commit,也就是说dev分支add的内容可以到master分支commit
bug分支:
$ git stash -- 将工作区的改动以及缓存区的东西先用一个地方保存起来,保持working tree的干净(可多次stash)
$ git stash list -- 查看stash列表
$ git stash apply stash@{0}-- 将stash的对应内容(stash@{0})恢复到工作区以及缓存区(如果不加参数stash@{}默认是恢复最近一条)
$ git stash drop -- 删除 stash储存的东西
$ git stash pop -- 上面两个命令的合体
$ git cherry-pick <commit id> -- 将commit id 提交所做的修改直接复制到当前分支(一般用在在master修复bug之后快速修复分支上相同的bug)
feature分支
$ git branch -D feature-valcan -- 强制删除还未被合并的名为feature-valcan的分支
多人协作
$ git push origin dev -- 将分支dev推送到远程库origin
$ git checkout -b dev origin/dev 创建远程origin的dev到本地
$ git pull -- 抓去远程库对应的文件
$ git branch --set-upstream-to=origin/dev dev -- 制定本地dev与远程dev间的链接
优化
$ git rebase -- 减少log分叉线
$ git config --global color.ui true -- 让git显示颜色,使输出更醒目
忽略特殊文件
1、在git工作区的根目录下创建一个.gitignore文件,然后把要忽略的文件名字填进去,然后把.gitignore提交到git就行了
2、可以对.gitignore 做版本管理
$ git add -f <文件名> -- 强制添加被忽略的文件
$ git check-ignore -v <文件名> -- 检查.gitignore中的<文件名>规则
配置别名
$ git config --global alias.st status -- 以后st就表示status
常用别名:
co==checkout
ci==commit
br==branch
$ git config --global alias.unstage 'reset HEAD'
$ git unstage test.py 就相当于 $ git reset HEAD test.py
$ git config --global alias.last 'log -1' ,此时 $ git last 就显示最近的一次提交了
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
每个仓库的Git配置文件都放在.git/config 文件中,而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig 中,配置别名也可以直接修改这个文件。
打标签
1、切换到需要打标签的分支上
2、标签和commit挂钩
3、创建标签
$ git tag v1.0 -- 将标签1.0打到最新提交的commit 上
$ git tag -a v2.0 -m "version 0.1 released" f52c633 -- 将标签2.0打到id为f52c633的commit上。-a后面接标签名,-m后面接标签说明
4、标签操作
$ git tag -- 查看标签
$ git show v1.0 -- 查看标签1.0的信息
$ git tag -d v1.0 -- 删除标签1.0
删除远程标签
$ git tag -d v1.0
$ git push origin :refs/tags/v1.0
$ git push origin v1.0 -- 推送标签1.0到远程
$ git puh origin --tags -- 一次推送所有还没推送的本地标签到远程
PS:
a、不要用window自带的记事本编辑文件,因为在保存utf-8编码的文件时会自动在文件的开头添加0xefbbbf(十六进制的)字符
b、中汉互译
on branch master -- 在分枝主主枝上
modified -- 修改
insertion -- 添加的东西
deletion -- 减少的东西
commit -- 版本 n. (head指示的是当前版本)
commit id -- 可以翻译成版本号
untracked files -- 未追踪的文件 (应该是指还没有提交给仓库的文件)
master -- 主要的
pretty=oneline -- 美化=一条线
reflog -- 回流
working tree clean -- 表示工作区的更改已经commit到了分支上(如果仅仅只是add到缓存区,则还不能提示working tree clean)
Q:如何比较现在版本与上一个版本的不同? |