1 Git基操
1.1 diff与patch
(1) diff用于比较两个文件或目录的差异
1 | diff -u left.c right.c |
其中-u
是指以合并的方式来显示文件内容的不同。
(2) patch可以根据diff产生的结果diff.txt,根据left.txt生成right.c,反之亦然
1 | left.c -> right.c |
1.2 版本控制工具的发展
1.2.1 最早期的本地版本控制
RCS(Revision Control System) 只适合本地的版本控制
1.2.2 集中式版本控制
CVS(Concurrent Versions System) 不支持原子化操作,会导致客户端提交的数据出现不完整的情况,同时效率也比较低
SVN(Subversion) 优化了服务器上内容的存储,也实现了原子化操作。当然,SVN也存在一些问题,比如提交是要排队的,不能同时修改;缺乏代码门禁,提交的过程缺少检查防护(一种解决方案是旁路检查);在面临单点故障或者黑客攻击时,可能会存在数据丢失的问题。
1.2.3 分布式版本控制 Git
集中式 | 分布式 | |
---|---|---|
记录形式 | 记录差异 | 记录快照 |
权限配置 | 可以精确到目录 | 只能对整体进行配置 |
分布式版本控制,如果文件被修改,则在每次提交更新时都会把当时的全部文件制作成一个快照;如果文件没被修改,则不再重新存储该文件,而是保留一个链接指向之前存储的文件。
1.3 Git的工程区域与文件状态
1.3.1 工程区域
类型 | 描述 |
---|---|
版本库Repository | 在.git中,存放了版本数据 |
工作区Working Directory | 代码或文档所在目录 |
暂存区stage | 在.git/index中 |
1.3.2 文件状态
状态 | 描述 |
---|---|
已提交committed | 已保存到本地仓库 |
已修改modified | 修改了但未提交保存 |
已暂存staged | 把已修改的文件放在下次提交时要保存的清单中 |
1.4 Git常用命令
1.4.1 工作准备
1 | git clone [URL]# 工程克隆 |
注意:如果项目git服务器已经支持git-lfs,对二进制文件做了区别管理,那么克隆时需要使用
1 | git lfs clone [URL] |
否则无法下载二进制文件,工程不完整
1.4.2 查看工作区
1 | git diff # 查看工作区修改内容 |
git diff
https://git-scm.com/docs/git-diff
1 | 比较两个节点的差异 |
1.4.3 文件修改后提交推送
1 | git add/rm/mv # 新增/删除/移动文件到暂存区 |
新增/删除/移动
https://git-scm.com/docs/git-add
https://git-scm.com/docs/git-rm
https://git-scm.com/docs/git-mv
- 新建文件未被git跟踪的,需要先执行
git add
把文件添加到暂存区再提交。如果曾经提交过,在较新的git版本中,不需要add可以直接提交。 - 如果想在工作区删除一个文件,从此不再纳入git管理,可以通过
git rm [文件名]
,然后提交;也可以在磁盘上删除文件然后提交,效果是一样的。 git mv
可以移动文件,也可以重命名。
1 | 将test.conf文件移动config目录 |
commit提交
git commit
是将暂存区的文件改动提交到本地版本库,远端服务器是不受影响的。
1 | 指定文件 |
push推送
注意:windows上分支的大小写是不敏感的。1 | git push origin [分支名] |
1.4.5 查看日志
1 | git log # 查看当前分支上的提交日志 |
1.4.6 分支管理
1 | git branch # 列出本地分支 |
git branch 与 git checkout -b新建分支的区别
新建的分支是继承了原来的所有内容的
git branch [branch_name] |
git checkout -b [branch_name] |
---|---|
新建后不切换分支 | 新建后切换到新分支 |
如何删除远端分支
1 | git branch -d -r [branch_name] # 删除远端分支 |
fetch与pull的区别
git fetch |
git pull |
---|---|
获取远程的更新到本地,但不合并(合并需要手动merge) | 获取远程更新,并自动与本地合并 |
merge与rebase的区别
merge不会破坏原有的commit节点信息,记录了真实的commit情况;rebase会合并之前的commit历史.
因此不要在公共分支上使用rebase
merge示意
如果合并的时候遇到冲突,仅需要修改后重新add并commit
优点: 记录了真实的commit情况,包括每个分支的详情
缺点: 因为每次merge会自动产生一个merge commit,所以在使用一些git 的GUI tools,特别是commit比较频繁时,看到分支很杂乱
- 在feature分支上开发新特性
- 执行merge命令
1 | git checkout feature |
- 合并后,会在目的分支生成新的commit,也即merge commit.
rebase示意
遇到冲突,需要先修改冲突部分,然后git add
,然后git rebase --continue
优点: 得到更简洁的项目历史,去掉了merge commit
缺点:如果合并出现代码问题不容易定位,因为破坏了之前commit的历史
1 | git checkout feature |
1.4.7 撤销操作(谨慎使用)
1 | git reset [commit_id] # 强制回退到历史节点 |
2 IDEA
快捷键 | 作用 |
---|---|
Alt + Insert | 新建文件 |
Alt + 上下箭头 | 以函数为单位移动 |
Ctrl + G | 定位 |