当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息。
git config --global user.name "Bandits"
git config --global user.email "[email protected]"
检查当前的设置
git config --list
git config user.name
注意:
通过上面的命令设置的信息会保存在~/.gitconfig文件中。
git init
小提示:
git init 命令会在上述目录中创建一个名为 .git 的隐藏目录,并在其中创建一个版本库。该目录为文件,查看->显示隐藏目录。
注意:
Git不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。
未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制.通过git add 状态变为Staged.
被纳入版本控制
Unmodified
文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified,如果使用git rm移出版本库, 则成为Untracked文件。
Modified
文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout则丢弃修改过,返回unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改。
Staged
暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存,文件状态为Modified。
注意:
- 新建文件—>Untracked
- 使用add命令将新建的文件加入到暂存区—>Staged
- 使用commit命令将暂存区的文件提交到本地仓库—>Unmodified
- 如果对Unmodified状态的文件进行修改—> modified
- 如果对Unmodified状态的文件进行remove操作—>Untracked
git status
参数:
-s: 简洁输出
git add 文件名
git reset 文件名
如果仅是通过git add命令把移动加到暂存区,还不算是完成整个流程。如果想让暂存区的内容永久保存下来,就要使用git commit命令。
语法结构:
git commit -m "提交信息"
参数:
- -m : 本次提交做了什么事,只要简单、清楚的文本说明即可,中英文都可以重点是说清楚,能让自己和别人很快明白就行。
如果不加m参数,会进入类似vim编辑。
要改动Commit记录有几种方式。
(1)把.git目录整个删除(不建议)。
(2)使用git rebase命令来改动历史记录。
(3)先把 Commit用git reset命令删除,整理后再重新Commit。
(4)使用–amend参数改动最后一次的Commit。
首先先查看一下我们的提交记录
git log --oneline
此时最后一次提交的记录 写的提交信息不合理,只需要在Commit命令后面加上–amend即可
git commit --amend -m " new message "
git rm 文件名
这将删除指定文件并将删除操作添加到暂存区中,然后你可以通过提交来永久删除该文件(删除掉本地仓库中文件)。
想要删除远程仓库中的文件就需要进行推送当前的分支
git push origin 分支名
一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为 .gitignore的文件(文件名称固定),列出要忽略的文件模式。
# / 表示 当前文件所在的目录
# 忽略public下的所有目录及文件
/public/*
#不忽略/public/assets,就是特例的意思,assets文件
不忽略
!/public/assets
# 忽略具体的文件
index.class
# 忽略所有的class
*.class
# 忽略 a.class b.class
[ab].class
注意:
- #匹配规则和linux文件匹配一样
- #以斜杠“/”开头表示目录
- #以星号“*”通配多个字符
- #以问号“?”通配单个字符
- #以方括号“[]”包含单个字符的匹配列表
- #以叹号“!”表示不忽略(跟踪)匹配到的文件或目录
语法结构:
git log
参数:
–graph : 查看分支合并图
–oneline : 标记把每一个提交压缩到了一行中
语法结构
git reflog
diff是指的是两个事物的不同。例如在Linux系统中,diff命令会逐行比较两个文本的差异然后显示出来。
语法结构:
git diff
Git技术中显示暂存区和工作区文件的差异
git diff --cached
Git技术中对比暂存区和版本库文件的差异
对于恢复修改的文件,就是将文件从仓库中拉到本地工作区,即 仓库区 ----> 暂存区 ----> 工作区。
只是修改了文件,没有任何 git 操作,直接一个命令就可回退
git checkout -- 文件名
修改了文件,并提交到暂存区(即编辑之后,git add但没有gitadd但没有 git commit )
git reset 文件名 # 回到当前版本只是 修改未添加到暂缓区
git checkout -- 文件名 # 恢复到本地仓库中的版本
修改了文件,并提交到本地仓库区
git log --oneline
git reset HEAD^
git checkout -- 文件名
注意:
git reset 版本号 ---- 将暂缓区回退到指定版本,根据 $ git log --oneline 显示的版本号,可以回退到任何一个版本,也可通过HEAD 来指定版本。
- HEAD 当前版本
- HEAD^ 上一个版本
- HEAD^^ 上上一个版本
我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。
注册完成可以使用刚刚注册的邮箱进行登录(地址:www.gitee.com/login)
添加一个新的远程Git仓库,同时指定一个可以引用的简写。
git remote add <shortname><url>
注意:
- shortname :远程的名字(可以随意取名)
- url : 远程仓库地址
git remote
git clone 远程仓库地址url
git remote rm 远程仓库名字
注意:
此命令只是从本地移除远程仓库的记录,并不会真正影响到远程仓库。
git push 仓库名 要推送的分支名称
git fetch
git pull
注意:
- git fetch是从远程仓库获取最新版本到本地仓库,不会自动merge,想看见文件就需要手动进行合并文件 git merge origin/master 。
- git pull是从远程仓库获取最新版本到本地仓库,会自动merge
SSH为Secure Shell(安全外壳协议)的缩写,由IETF的网络小组(Network Working Group)所制定。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。
1.使用命令ssh-keygen -t rsa生成公钥和私钥
ssh-keygen -t rsa
注意:
执行完成后在window本地用户.ssh目录(C:\Users\用户名.ssh)下生成如下名称的公钥和私钥。
git branch
参数:
git branch 分支名字
参数:
git checkout 分支名字
git push 远程仓库名字 分支名字
创建并切换分支
git checkout -b 分支名称
语法结构
git merge 要合并的分支名称
语法结构:
git branch -d 要删除的分支名称
参数:
- -d 删除本地分支
注意:
如果要删除的分支中进行了一些开发动作,此时执行上面的删除命令并不会删除分支,如果坚持要删除此分支,可以将命令中的-d参数改为-D 。
如果不小心把还没合并的分支删除了,救得回来吗
cat分支是从master分支出去的,当前领先master分支两次Commit,而且还没有合并过。这时如果试着删掉cat分支,它会提醒:“这个分支还没全部合并哦”。
$ git branch -d cat
error: The branch 'cat' is not fully merged.
If you are sure you want to delete it, run 'git branch -D cat'.
虽然Git这么贴心的提醒了,但这里仍然把它删除了
git branch -D cat
Deleted branch cat(was b1729234)
分支只是一个指向某个Commit的指标,删除这个指标并不会使那些Commit消失。
我们可以根据这个ID创建回来这个分支
git branch new_cat b2323b
git push origin -d 分支名称
标签与分支的区别是,分支会随着Commit而移动,但标签不会。之前介绍过当Git往前推,进一个Commit时,它所在的分支会跟着向前移动。而标签一旦贴上去不管Commit怎么前进,标签都会留在原来贴的那个位置上。因此,分支可以看成是“会移动的标签”。
语法结构
git tag
语法结构
git tag 标签名字
语法结构
git show 标签名
语法结构
git push 远程仓库名 标签名
新建一个分支,指向某个tag
git checkout -b 新的分支名 已有的标签名
语法结构
git tag -d 标签名
语法结构
git push origin :refs/tags/标签名字
注意:
:refs/tags/是固定写法。
在使用Git的过程中如果没有清晰流程和规划,否则,每个人都提交一堆杂乱无章的commit,项目很快就会变得难以协调和维护。GitFlow工作流通过为功能开发、发布准备和维护分配独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
master 主干分支,开发完成的上线的项目版本
hotixes 热部署分支,进行主干分支的补丁操作
release 预部署分支,测试工程师的调用的分支
develop 开发分支,开发源代码分支
feature 功能分支,你们调用分支
Master/Devlop 分支
所有在Master分支上的Commit应该打上Tag,一般情况下Master不存在Commit,Devlop分支基于Master分支创建
Feature 分支
Feature分支做完后,必须合并回Develop分支, 合并完分支后一般会删点这个Feature分支,但是我们也可以保留。
Release 分支
Release分支基于Develop分支创建,打完Release分之后,我们可以在这个Release分支上测试,修改Bug等。同时,其它开发人员可以基于开发新的Feature 发布Release分支时,合并Release到Master和Develop, 同时在Master分支上打个Tag记住Release版本号,然后可以删除Release分支了。
注意:
一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支。