文章目录
git是开源的分布式文件管理系统,具有最优的存储能力、非凡的性能、开源的、很容易做备份、支持离线操作、很容易定制工作流程等优点。在Git的基础上衍生出GitHub和GitLab这两个非常流行的代码托管平台,很多公司包括阿里云、去哪儿、携程等都在GitLab平台的基础上做自己的二次开发。
中文文档地址为https://git-scm.com/book/zh/v2,内容非常好,包含介绍、安装等。
1. 初始配置
1.1 安装配置
git --version
git config --global user.name yushengjun
git config --global user.email xxx@163.com
git config --global list 查看global下git的所有配置
建Git仓库:
- 把已有的项目代码纳入Git管理
进入项目代码所在的文件夹,git init - 新建的项目直接用Git管理
git init your_project 会在当前路径下创建和项目名称同名的文件夹
1.2 基本命令
Git命令 | 描述 |
---|---|
git add readme.txt | 从工作区添加到暂存区 |
git commit readme.txt -m ‘add readme.txt’ | 将暂存区的改变提交到本地仓库 |
git mv readme.txt readme.md | 重命名文件,然后提交即可 |
git rm readme.txt readme.md | 从工作区和暂存区删除文件,然后提交即可 |
git status | 查看本地文件的状态(是否纳入管理,是否提交,是否修改等) |
git log | 查看本地提交历史 |
git log --oneline --all -n4 --graph | oneline简略显示提交历史,all查看所有分支 ,n4最近4次的提交历史 graph 图形化查看 |
gitk --all | 打开图形化工具 |
git checkout -b temp 732b217 | 从732b217 创建temp分支 |
git branch -d test | 删除test分支,注意要在别的分支下去删除test ;如果报错且确定可删除改为 -D(会忽略test分支某些更改还没merge到其他分支的情况) |
git branch -av | 查看所有分支详细情况 带有*的表示是当前所在分支 |
1.3 Git对象间的关系
每次提交,会生成一个commit对象指向一个tree对象(我理解tree是提交时所有文件的一个快照);tree按文件夹的结构来排列,每个文件夹又是一个tree,每个文件指向一个blob对象;注意blob对象和文件并不完全等价,Git认为即使文件名不同只要文件内容相同就是同一个blob,这样节省了存储空间。
2. 常用操作
2.1 HEAD
会指向当前的分支 或者最新的提交
分离头指针 指的是操作没有关联任何一个commit。
2.2 修改提交信息
git commit --amend
修改最近一次提交的message 会打开一个文档让你修改
那么如何修改之前某次提交的message呢?
git commit -i 77de453e
修改77de453e 之后的修改信息。把要修改的某次的提交的pick改为r保存,然后在弹出的对话框中修改提交message即可。
```
pick 08c4cfa add index and
pick 988098e update readme
pick 8dc72e1 mv readme.md
pick 3f79e47 delete
# Rebase dde6fb8..f3482f6 onto dde6fb8 (5 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
```
如何将多次提交合并为一次提交呢?
同样的git commit -i 77de453e
使用s(use commit, but meld into previous commit)。注意要使用想要合并的提交的上一次提交。
可以合并连续的commit,也可以合并不连续的commit
2.3 比较工作区、暂存区、本地仓库之间的差异
git diff --cached
比较暂存区和本地仓库之间的差异(因此文件必须先加到暂存区)
git diff
是比较工作区和暂存区之间的差异,亦可以要比较的指定文件
git diff temp master -- 1.txt
比较1.txt这个文件temp分支和master分支最新一次提交之间的差异。其实这里分支也指向提交,所以我们也可以比较不同commit之间的差异(换成commit的唯一标识值即可)。
git diff HEAD HEAD~2 -- 1.txt
比较1.txt和前两次提交时的不同
2.4 如何恢复暂存区和工作区的改变,甚至已经commit的内容?
-
我们有时把文件加到暂存区后又想取消这次变更,怎么办呢?
git reset head -- 2.txt 1.txt
把2.txt和1.txt恢复成head,也可以不指定文件即复原所有文件 -
同样的如果我们想恢复工作区的内容和暂存区一样,怎么操作呢?
git checkout 3.txt
恢复3.txt的内容和暂存区一样
简单总结就是:恢复暂存区使用reset命令,恢复工作区内容使用checkout(注意这个命令比较危险,会丢失你在工作区做的变更!!)。而 git reset --hard HEAD
则就是将暂存区和工作区都恢复成最新一次提交的内容,这个比较常用。
- 如果进一步想消除最近的几次提交,即恢复本地仓库的内容到之前的某个版本该怎么办呢?
git reset --hard 44f921d
恢复到44f921d 提交时的内容,此时head指针就会指向此次commit,44f921d 提交之后的提交都会消失,并且暂存区和工作区的内容都会复原。因此此命令是相当危险的!
2.5 临时加塞紧急任务怎么办
我们正在开发中,突然来了bug要修复,但是当前的变更又不想丢弃,这时可以先保存起来。
git stash
: stash会将变更添加到一个栈里,可以使用git stash list来查看。
如果临时任务提交完又要回头来开发怎么办?
这时可以使用git stash pop
或者git stash apply
。这两个的区别就是pop 是会弹出并删除栈中的保存记录,apply只会取出保存的记录而不会删除。
2.6 如何指定git忽略文件
在.gitignore 文件中
doc 指的是忽略doc文件或者doc文件夹下的内容
doc/ 指的是忽略doc文件夹下的内容 ,而不忽略doc文件
在window下需要先创建一个文件如1.txt,然后 ren 1.txt .ignore
来生成.ignore 文件。
2.7 如何备份仓库
从本地仓库,github,gitlab上复制仓库的方法为:
git clone /user/git_learning
使用哑协议,传输速度不可见,且相较于智能协议更慢。
git clone file:///user/git_learning
使用智能协议 传输速度可见,更快。
http、https、ssh都是使用的智能协议。