编程工具演练

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
2
3
4
5
# left.c -> right.c
patch left.c diff.txt

# right.c -> left.c
patch -R right.c diff.txt

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
2
git diff # 查看工作区修改内容
git status # 查看工作区状态
git diff

https://git-scm.com/docs/git-diff

1
2
3
4
5
6
7
8
9
10
11
# 比较两个节点的差异  
git diff [节点1] [节点2]

# 比较两个分支的差异
git diff [分支1]..[分支2]

# 当前索引与上次提交的差异
git diff --cached

# 只看文件列表,列表前的大写字母M表示Modified,A表示Added,D表示Deleted
git diff [分支1]..[分支2] --name-status

1.4.3 文件修改后提交推送

1
2
3
git add/rm/mv # 新增/删除/移动文件到暂存区
git commit # 提交更改的文件
git push # 推送到远端仓库
新增/删除/移动

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
2
3
4
5
# 将test.conf文件移动config目录
git mv test.conf config

# 将test.conf文件重命名为abc.conf
git mv config/test.conf config/abc.conf
commit提交

git commit是将暂存区的文件改动提交到本地版本库,远端服务器是不受影响的。

1
2
3
4
5
6
7
8
# 指定文件
git commit [file_name] -m "提交的说明"

# 所有暂存区文件
git commit -am "提交的说明"

# 修改最近一次提交的信息,执行后进入VIM即可修改message信息并保存
git commit --amend
push推送
注意:windows上分支的大小写是不敏感的。
1
git push origin [分支名]

1.4.5 查看日志

1
2
git log # 查看当前分支上的提交日志
git reflog # 查看最近使用了哪些git指令操作

1.4.6 分支管理

1
2
3
4
5
6
7
8
9
10
git branch # 列出本地分支
git branch -r # 列出远端分支
git branch -r # 列出本地及远端分支
git branch -b [branch_name] # 新建分支
git branch -d [branch_name] # 删除分支
git branch -D [branch_name] # 强制删除分支
git checkout [branch_name] # 切换分支
git checkout -f [branch_name] # 强制切换分支
git pull origin [remote_branch]:[local_branch] # 更新分支(一般远程与本地分支相同,可以省略local_branch)
git merge [source_branch_name] [destination_branch_name] # 合并分支
git branch 与 git checkout -b新建分支的区别

新建的分支是继承了原来的所有内容的  

git branch [branch_name] git checkout -b [branch_name]
新建后不切换分支 新建后切换到新分支
如何删除远端分支
1
2
git branch -d -r [branch_name] # 删除远端分支
git push origin:[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
2
3
4
5
git checkout feature
git merge master

# 或者
git merge master feature
  • 合并后,会在目的分支生成新的commit,也即merge commit.

rebase示意

遇到冲突,需要先修改冲突部分,然后git add,然后git rebase --continue

优点: 得到更简洁的项目历史,去掉了merge commit
缺点:如果合并出现代码问题不容易定位,因为破坏了之前commit的历史

1
2
git checkout feature
git rebase master

1.4.7 撤销操作(谨慎使用)

1
2
3
git reset [commit_id] # 强制回退到历史节点
git checkout . # 回退本地所有修改而未提交的文件内容
git checkout [file_name] # 回退某个文件的修改未提交的内容

2 IDEA

快捷键 作用
Alt + Insert 新建文件
Alt + 上下箭头 以函数为单位移动
Ctrl + G 定位


----------- 本文结束 -----------




0%