0101 - 常用开发工具
2021-04-18 10:27:37 0 举报
AI智能生成
架构师常用的开发工具总结
作者其他创作
大纲/内容
项目版本控制工具
Git
参考文档
https://git-scm.com/book/en/v2
起步
什么是版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统
Git与其它版本控制系统的重要区别
在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,<br>如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
优点
几乎所有操作都是在本地执行
举个例子,要浏览项目的历史,Git 不需外连到服务器去获取历史,然后再显示出来——它只需直接从本地数据库中读取。<br>你能立即看到项目历史。如果你想查看当前版本与一个月前的版本之间引入的修改, Git 会查找到一个月前的文件做一次本<br>地的差异计算,而不是由远程服务器处理或从远程服务器拉回旧版本文件再来本地处理。
Git 保证完整性
Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 <br>这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。
Git 一般只添加数据
你执行的 Git 操作,几乎只往 Git 数据库中 添加 数据。 你很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。<br>同别的 VCS 一样,未提交更新时有可能丢失或弄乱修改的内容。但是一旦你提交快照到 Git 中, 就难以再丢失数据,特别<br>是如果你定期的推送数据库到其它仓库的话。
三种状态
已修改(modified)
已修改表示修改了文件,但还没保存到数据库中。
已暂存(staged)
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交(committed)
已提交表示数据已经安全地保存在本地数据库中。
Git项目拥有三个阶段
工作区
工作区是对项目的某个版本独立提取出来的内容。 <br>这些从 Git 仓库的压缩数据库中提取出来的文件,<br>放在磁盘上供你使用或修改。
暂存区
暂存区是一个文件,保存了下次将要提交的文件列表信息,<br>一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,<br>不过一般说法还是叫“暂存区”。
Git目录
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 <br>这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就<br>是这里的数据。
基本的 Git 工作流程
1、在工作区中修改文件。<br>2、将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。<br>3、提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。
Git的安装部署
初次运行 Git 前的配置
Git 自带一个 git config 的工具来帮助<br>设置控制 Git 外观和行为的配置变量
/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上 --system 选项,<br>那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)
~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 你可以传递 <br>--global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。
当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库。 你可以传递 <br>--local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入<br>某个 Git 仓库中才能让该选项生效。)
你可以通过以下命令查看所有的配置以及它们所在的文件
$ git config --list --show-origin
配置用户信息
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。<br> 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入<br>到你的每一次提交中,不可更改。
$ git config --global user.name "John Doe"<br>$ git config --global user.email johndoe@example.com
配置默认文本编辑器
当 Git 需要你输入信息时会调用它。 如果未配置,<br>Git 会使用操作系统默认的文本编辑器。
$ git config --global core.editor emacs<br>$ git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"<br>
检查配置信息
$ git config --list<br>
由于 Git 会从多个文件中读取同一配置变量的不同值,因此你可能会在其中看到意料之外的值而不知道为什么。<br> 此时,你可以查询 Git 中该变量的 原始 值,它会告诉你哪一个配置文件最后设置了该值。
$ git config --show-origin rerere.autoUpdate<br>file:/home/johndoe/.gitconfig false<br>
若你使用 Git 时需要获取帮助,有三种等价的方法可以找到 Git 命令的综合手册
$ git help <verb><br>$ git <verb> --help<br>$ man git-<verb><br>
基础
获取 Git 仓库<br>
将尚未进行版本控制的本地目录转换为 Git 仓库
$ git init<br>$ git add *.c<br>$ git add LICENSE<br>$ git commit -m 'initial project version'<br>
从其它服务器克隆一个已存在的 Git 仓库
$ git clone https://github.com/libgit2/libgit2
在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹, <br>从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。<br>
$ git clone https://github.com/libgit2/libgit2 mylibgit
如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名<br>
记录每次更新到仓库
检查当前文件状态
$ git status
跟踪新文件
$ git add README
暂存已修改的文件
$ git add CONTRIBUTING.md<br>$ git status
状态简览
git status -s 命令或 git status --short 命令
$ git status -s<br> M README<br>MM Rakefile<br>A lib/git.rb<br> M lib/simplegit.rb<br>?? LICENSE.txt
?? 标记:新添加的未跟踪文件<br>A 标记:新添加到暂存区中的文件<br>M 标记:修改过的文件,输出中有两栏,左栏指明了暂存区的状态,右栏指明了工作区的状态。<br> -------例如,上面的状态报告显示: README 文件在工作区已修改但尚未暂存,而 lib/simplegit.rb 文件已修改且已暂存。 <br> -------Rakefile 文件已修,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。
忽略文件
可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式
$ cat .gitignore<br><br># 忽略所有的 .a 文件<br>*.a<br># 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件<br>!lib.a<br># 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO<br>/TODO<br># 忽略任何目录下名为 build 的文件夹<br>build/<br># 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt<br>doc/*.txt<br># 忽略 doc/ 目录及其所有子目录下的 .pdf 文件<br>doc/**/*.pdf<br>
查看已暂存和未暂存的修改
修改之后还没有暂存起来的变化内容
$ git diff
已暂存文件与最后一次提交的文件差异
$ git diff --staged 或者 $ git diff --cached
提交更新
$ git commit
跳过使用暂存区域
$ git commit -a -m 'added new benchmarks'
移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。
$ git rm PROJECTS.md<br>
如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f(译注:即 force 的首字母)
$ git rm -f
把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中
$ git rm --cached README
移动文件
$ git mv file_from file_to
$ mv file_from file_to<br>$ git rm file_from<br>$ git add file_to
查看提交历史
其中一个比较有用的选项是 -p 或 --patch ,它会显示每次提交所引入的差异(按补丁的格式输出)。 <br>你也可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交。
$ git log -p -2<br>
每次提交的简略统计信息
$ git log --stat
会将每个提交放在一行显示,在浏览大量的提交时非常有用
$ git log --pretty=oneline<br>
定制记录的显示格式
$ git log --pretty=format:"%h - %an, %ar : %s"
%H:提交的完整哈希值<br>%h:提交的简写哈希值<br>%T:树的完整哈希值<br>%t:树的简写哈希值<br>%P:父提交的完整哈希值<br>%p:父提交的简写哈希值<br>%an:作者名字<br>%ae:作者的电子邮件地址<br>%ad:作者修订日期(可以用 --date=选项 来定制格式)<br>%ar:作者修订日期,按多久以前的方式显示<br>%cn:提交者的名字<br>%ce:提交者的电子邮件地址<br>%cd:提交日期<br>%cr:提交日期(距今多长时间)<br>%s:提交说明
显示ASCII字符串
$ git log --pretty=format:"%h %s" --graph
其它
$ git log --pretty xxxxxxxx
-p:按补丁格式显示每个提交引入的差异。<br>--stat:显示每次提交的文件修改统计信息。<br>--shortstat:只显示 --stat 中最后的行数修改添加移除统计。<br>--name-only:仅在提交信息后显示已修改的文件清单。<br>--name-status:显示新增、修改、删除的文件清单。<br>--abbrev-commit:仅显示 SHA-1 校验和所有 40 个字符中的前几个字符。<br>--relative-date:使用较短的相对时间而不是完整格式显示日期(比如“2 weeks ago”)。<br>--graph:在日志旁以 ASCII 图形显示分支与合并历史。<br>--pretty:使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format(用来定义自己的格式)。<br>--oneline:--pretty=oneline --abbrev-commit 合用的简写。
限制输出长度
$ git log --since=2.weeks
另一个非常有用的过滤器是 -S(俗称“pickaxe”选项,取“用鹤嘴锄在土里捡石头”之意),<br> 它接受一个字符串参数,并且只会显示那些添加或删除了该字符串的提交
$ git log -S function_name<br>
要在 Git 源码库中查看 Junio Hamano 在 2008 年 10 月其间, 除了合并提交之外的<br>哪一个提交修改了测试文件,可以使用下面的命令:
$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \<br> --before="2008-11-01" --no-merges -- t/
-<n>:仅显示最近的 n 条提交。<br>--since, --after:仅显示指定时间之后的提交。<br>--until, --before:仅显示指定时间之前的提交。<br>--author:仅显示作者匹配指定字符串的提交。<br>--committer:仅显示提交者匹配指定字符串的提交。<br>--grep:仅显示提交说明中包含指定字符串的提交。<br>-S:仅显示添加或删除内容匹配指定字符串的提交。
撤消操作
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 <br>此时,可以运行带有 --amend 选项的提交命令来重新提交:
$ git commit --amend<br>
取消暂存的文件
$ git reset HEAD CONTRIBUTING.md
git reset 确实是个危险的命令,如果加上了 --hard 选项则更是如此。 然而在上述场景中,工作目录中的文件尚未修改,因此相对安全一些。
撤消对文件的修改
$ git checkout -- CONTRIBUTING.md
请务必记得 git checkout -- <file> 是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 <br>除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。
远程仓库的使用
列出你指定的每一个远程服务器的简写
$ git remote -v
查看远程仓库
$ git remote<br>--------------<br>origin<br>--------------<br>$ git remote add pb https://github.com/paulboone/ticgit<br>$ git remote -v<br>-----------------------------------------------------<br>origin https://github.com/schacon/ticgit (fetch)<br>origin https://github.com/schacon/ticgit (push)<br>pb https://github.com/paulboone/ticgit (fetch)<br>pb https://github.com/paulboone/ticgit (push)
添加远程仓库
$ git remote add pb https://github.com/paulboone/ticgit
从远程仓库中抓取与拉取
$ git fetch <remote>
必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
推送到远程仓库
$ git push origin master
远程仓库的重命名与移除<br>
$ git remote rename pb paul
移除一个远程仓库
$ git remote remove paul<br>
打标签
列出标签
列出所有标签
$ git tag
列出指定的标签
$ git tag -l "v1.8.5*"
创建标签
轻量标签(lightweight)<br>
$ git tag v1.4-lw
附注标签(annotated)
$ git tag -a v1.4 -m "my version 1.4"
后期打标签
$ git tag -a v1.2 9fceb02
共享标签
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 <br>在创建完标签后你必须显式地推送标签到共享服务器上。这个过程<br>就像共享远程分支一样——你可以运行 git push origin <tagname>
一次只推送一个标签
$ git push origin v1.5
一次性推送多个标签
$ git push origin --tags
删除标签
删除本地仓库上的标签
$ git tag -d v1.4-lw<br>
从远程仓库中移除标签
$ git push origin :refs/tags/v1.4-lw
$ git push origin --delete <tagname>
检出标签
$ git checkout 2.0.0
在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交<br>将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。因此,如果你需要进行<br>更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支。<br>
$ git checkout -b version2 v2.0.0
别名
$ git config --global alias.unstage 'reset HEAD --'
$ git unstage fileA<br>$ git reset HEAD -- fileA
分支
分支创建<br>
$ git branch testing
分支切换
$ git checkout testing
存储结构
首次提交对象及其树结构
提交对象及其父对象
分支及其提交历史
分支的新建与合并<br>
第一步:先切换到需要合并的分支;第二步:使用merge命令合并。
$ git checkout master<br>$ git merge hotfix
如果你想使用图形化工具来解决冲突,你可以运行 git mergetool,该命令会为你启动<br>一个合适的可视化合并工具,并带领你一步一步解决这些冲突:
$ git mergetool
分支管理
$ git branch<br> iss53<br>* master<br> testing
注意 master 分支前的 * 字符:它代表现在检出的那一个分支(也就是说,当前 HEAD 指针所指向的分支)。 <br>这意味着如果在这时候提交,master 分支将会随着新的工作向前移动。 如果需要查看每一个分支的最后一次<br>提交,可以运行 git branch -v 命令。
查看每一个分支的最后一次提交
$ git branch -v
查看哪些分支已经合并到当前分支
$ git branch --merged
查看所有包含未合并工作的分支
$ git branch --no-merged
远程分支
获得远程引用的完整列表
$ git ls-remote <remote>
获得远程分支的更多信息
$ git remote show <remote>
与给定的远程仓库同步数据
$ git fetch <remote>
推送
$ git push origin serverfix
拉取
git pull 都会查找当前分支所跟踪的服务器与分支,<br> 从服务器上抓取数据然后尝试合并入那个远程分支。
当 git fetch 命令从服务器上抓取本地没有的数据时,<br>它并不会修改工作目录中的内容。它只会获取数据然<br>后让你自己合并。
删除远程分支
$ git push origin --delete serverfix
变基
在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase。
$ git rebase --onto master server client
变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。
准则
如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。
服务器上的Git
在服务器上搭建 Git
生成 SSH 公钥
$ cd ~/.ssh
配置服务器
使用 authorized_keys 方法来对用户进行认证
首先,创建一个操作系统用户 git,并为其建立一个 .ssh 目录。
$ sudo adduser git<br>$ su git<br>$ cd<br>$ mkdir .ssh && chmod 700 .ssh<br>$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys<br>
接着,我们需要为系统用户 git 的 authorized_keys 文件添加一些开发者 SSH 公钥。 <br>假设我们已经获得了若干受信任的公钥,并将它们保存在临时文件中。 与前文类似,<br>这些公钥看起来是这样的:
$ cat /tmp/id_rsa.john.pub<br><br>ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L<br>ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k<br>Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez<br>Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv<br>O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq<br>dAv8JggJICUvax2T9va5 gsg-keypair
将这些公钥加入系统用户 git 的 .ssh 目录下 authorized_keys 文件的末尾
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys<br>$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys<br>$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
新建一个空仓库,初始化仓库时不会创建工作目录<br>
$ cd /srv/git<br>$ mkdir project.git<br>$ cd project.git<br>$ git init --bare<br>Initialized empty Git repository in /srv/git/project.git/
Git 守护进程
$ git daemon --reuseaddr --base-path=/srv/git/ /srv/git/
--reuseaddr 选项允许服务器在无需等待旧连接超时的情况下重启,而 --base-path 选项允许用户在未完全指定路径的条件下克隆项目, <br>结尾的路径将告诉 Git 守护进程从何处寻找仓库来导出。 如果有防火墙正在运行,你需要开放端口 9418 的通信权限。
Smart HTTP
GitWeb
GitLab
分布式Git
分布式工作流程
1、项目维护者推送到主仓库。<br>2、贡献者克隆此仓库,做出修改。<br>3、贡献者将数据推送到自己的公开仓库。<br>4、贡献者给维护者发送邮件,请求拉取自己的更新。<br>5、维护者在自己本地的仓库中,将贡献者的仓库加为远程仓库并合并修改。<br>6、维护者将合并后的修改推送到主仓库。<br>
Git工具
Git的内部原理
底层命令与上层命令
由于 Git 最初是一套面向版本控制系统的工具集,而不是一个完整的、用户友好的版本控制系统, 所以它还包含了一部分用于完成底层工作的子命令。 这些命令被设计成能以 UNIX 命令行的风格连接在一起,抑或藉由脚本调用,来完成工作。 这部分命令一般被称作“底层(plumbing)”命令,而那些更友好的命令则被称作“上层(porcelain)”命令。
SVN
开发工具
Hosts文件工具
SwitchHosts
https://oldj.github.io/SwitchHosts/
二进制查看器
Binary Viewer
https://binary-viewer.en.softonic.com
Idea插件jclasslib Bytecode viewer
https://github.com/ingokegel/jclasslib
操作系统
Linux
项目管理和构建工具
Maven
Gradle
0 条评论
下一页