Git 概要
Git 是一种分布式控制技术版控制控制技术,它能不受数据传输的管制,加之其他为数众多缺点,目前已经成为软件开发者做工程项目版管理工作时的必选,非开发者也能用 Git 来做自己的文件格式版管理工作辅助工具。
2013年,淘宝网后端项目组已经开始全面性选用 Git 来做工程资金管理工作,我也是这个这时候已经开始碰触和选用,从一已经开始的零碰触到现在的轻度倚赖,啊感慨 Git 的强悍。
Git 的api许多,但只不过平常工程项目中90%的市场需求都只需要加进两个基本上的机能方可,所以责任编辑将从 理性主义 和 深入细致积极探索 2个方面去聊聊怎样在工程项目中选用 Git,一般而言,看完 理性主义 这四节就能已经开始在工程项目中亲自动手用。
表明:责任编辑的操作方式都是如前所述 Mac 控制技术
预备期
步入 Git官方中文网站浏览最合适你的发行版,现期我浏览到的版是 2.11.0,责任编辑也将在这个版上模拟效用。
加装好 Git 后,关上配置文件辅助工具,步入工作配置文件(为的是易于认知我们在控制技术桌上模拟),创建两个捷伊demo配置文件。
步入 Github中文网站 注册登记两个帐号并登入,步入:
https://github.com/gafish/gafish.github.com
点选 Clone or download ,再点选 Use HTTPS,拷贝工程项目门牌号 :
https://github.com/gafish/gafish.github.com.git 可供使用。
再返回配置文件辅助工具,所有人预备就绪,接下去步入责任编辑的重点项目。
常用操作方式
所谓理性主义,就是掌握了以下知识就能玩转 Git,轻松应对90%以上的市场需求。以下是理性主义型的Git命令列表,先大致看一下
git clone
git config
git branch
git checkout
git status
git add
git commit
git push
git pull
git log
git tag
接下去,将通过对:https://github.com/gafish/gaf…
仓库进行实例操作方式,讲解怎样选用 Git 拉取代码到提交代码的整个流程。
git clone
从git服务器拉取代码
git clone https://github.com/gafish/gafish.github.com.git
代码浏览完成后在现期配置文件中会有两个 http://gafish.github.com 的目录,通过 cd http://gafish.github.com 命令步入目录。
git config
配置开发者用户名和邮箱
每次代码提交的这时候都会生成一条提交记录,其中会包含现期配置的用户名和邮箱。
git branch
建立、重命名、查看、删除工程项目分支,通过 Git 做工程项目开发时,一般都是在开发分支中进行,开发完成后合并分支到主干。
git branch daily/0.0.0
建立两个名为 daily/0.0.0 的日常开发分支,分支名只要不包括特殊字符方可。
git branch -m daily/0.0.0 daily/0.0.1
如果觉得之前的分支名不最合适,能为新建的分支重命名,重命名分支名为 daily/0.0.1
git branch
通过不带参数的branch命令能查看现期工程项目分支列表
git branch -d daily/0.0.1
如果分支已经完成使命则能通过 -d 参数将分支删除,这里为的是继续下一步操作方式,暂不执行删除操作方式
git checkout
切换分支
git checkout daily/0.0.1
切换到 daily/0.0.1 分支,后续的操作方式将在这个分支上进行
git status
查看文件变动状态
通过任何你喜欢的编辑器对工程项目中的 README.md 文件做一些改动,保存。
git status
通过 git status 命令能看到文件现期状态 Changes not staged for commit: (改动文件未提交到暂存区)
On branch daily/0.0.1
Changes not staged for commit:
(use “git add <file>…” to update what will be committed)
(use “git checkout — <file>…” to discard changes in working directory)
modified: README.md
no changes added to commit (use “git add” and/or “git commit -a”)
git add
添加文件变动到暂存区
git add README.md
通过指定文件名 README.md 能将该文件添加到暂存区,如果想添加所有文件可用 git add . 命令,这这时候可通过 git status 看到文件现期状态 Changes to be committed: (文件已提交到暂存区)
On branch daily/0.0.1
Changes to be committed:
(use “git reset HEAD <file>…” to unstage)
modified: README.md
git commit
提交文件变动到版库
git commit -m 这里写提交原因
通过 -m 参数可直接在配置文件里输入提交描述文本
git push
将本地的代码改动推送到服务器
git push origin daily/0.0.1
origin 指代的是现期的git服务器门牌号,这行命令的意思是把 daily/0.0.1 分支推送到服务器,当看到配置文件返回如下字符表示推送成功了。
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 267 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
To https://github.com/gafish/gafish.github.com.git
* [new branch] daily/0.0.1 -> daily/0.0.1
现在我们返回Github中文网站的工程项目首页,点选 Branch:master 下拉按钮,就会看到刚才推送的 daily/00.1分支了
git pull
将服务器上的最新代码拉取到本地
git pull origin daily/0.0.1
如果其他工程项目成员对工程项目做了改动并推送到服务器,我们须要将最捷伊改动更新到本地,这里我们来模拟一下这种情况。
步入Github中文网站的工程项目首页,再步入 daily/0.0.1 分支,在线对 README.md 文件做一些修改并保存,然后在命令中执行以上命令,它将把刚才在线修改的部分拉取到本地,用编辑器关上 README.md ,你会发现文件已经跟线上的内容同步了。
如果线上代码做了变动,而你本地的代码也有变动,拉取的代码就有可能会跟你本地的改动冲突,一般情况下 Git 会自动处理这种冲突合并,但如果改动的是同一行,那就须要手动来合并代码,编辑文件,保存最捷伊改动,再通过 git add . 和 git commit -m xxx 来提交合并。
git log
查看版提交记录
git log
通过以上命令,我们能查看整个工程项目的版提交记录,它里面包含了提交人、日期、提交原因等信息,得到的结果如下:
commit c334730f8dba5096c54c8ac04fdc2b31ede7107a
Author: gafish <
[email protected]>
Date: Wed Jan 11 09:44:13 2017 +0800
Update README.md
commit ba6e3d21fcb1c87a718d2a73cdd11261eb672b2a
Author: gafish <
[email protected]>
Date: Wed Jan 11 09:31:33 2017 +0800
test
…..
提交记录可能会非常多,按 J 键往下翻,按 K 键往上翻,按 Q 键退出查看
git tag
为工程项目标记里程碑
git tag publish/0.0.1
git push origin publish/0.0.1
当我们完成某个机能市场需求预备发布上线时,应该将此次完整的工程项目代码做个标记,并将这个标记好的版发布到线上,这里我们以 publish/0.0.1 为标记名并发布,当看到配置文件返回如下内容则表示发布成功了
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/gafish/gafish.github.com.git
* [new tag] publish/0.0.1 -> publish/0.0.1
.gitignore
设置哪些内容不须要推送到服务器,这是两个配置文件
touch .gitignore
.gitignore 不是 Git 命令,而在工程项目中的两个文件,通过设置 .gitignore 的内容告诉 Git 哪些文件应该被忽略不须要推送到服务器,通过以上命令能建立两个 .gitignore 文件,并在编辑器中关上文件,每一行代表两个要忽略的文件或目录,如:
demo.html
build/
以上内容的意思是 Git 将忽略 demo.html 文件 和 build/ 目录,这些内容不会被推送到服务器上
小结
通过掌握以上这些基本上命令就能在工程项目中已经开始用起来了,如果追求实用,那关于 Git 的学习就能到此结束了,偶尔遇到的问题也基本上上通过 Google 也能找到答案,如果想深入细致积极探索 Git 的高阶机能,那就继续往下看 深入细致积极探索 部分。
深入细致积极探索
基本上概念工作区(Working Directory) 就是你在电脑里能看到的目录,比如上文中的http://gafish.github.com 配置文件就是两个工作区本地版库(Local Repository) 工作区有两个隐藏目录 .git,这个不算工作区,而是 Git 的版库。暂存区(stage) 本地版库里存了许多东西,其中最重要的就是称为 stage(或者叫index)的暂存区,还有 Git 为我们自动建立的第两个分支 master,以及指向 master 的两个指针叫 HEAD。远程版库(Remote Repository) 一般指的是 Git 服务器上所对应的仓库,责任编辑的示例所在的github仓库就是两个远程版库
以上概念之间的关系:工作区、暂存区、本地版库、远程版库之间两个常用的 Git 操作方式流程如下图所示:
分支(Branch)
分支是为的是将修改记录的整个流程分开存储,让分开的分支不受其他分支的影响,所以在同两个数据库里能同时进行多个不同的修改
主分支(Master)前面提到过 master 是 Git 为我们自动建立的第两个分支,也叫主分支,其他分支开发完成后都要合并到 master
标签(Tag)
标签是用于标记特定的点或提交的历史,通常会用来标记发布版的名称或版号(如:publish/0.0.1),虽然标签看起来有点像分支,但打上标签的提交是固定的,不能随意的改动,参见上图中的1.0 / 2.0 / 3.0
HEAD
HEAD 指向的就是现期分支的最新提交
以上概念了解的差不多,那就能继续往下看,下面将以具体的操作方式类型来讲解 Git 的高阶用法
操作方式文件
git add
#添加文件到暂存区
git add -i
#通过此命令将关上交互式子命令控制技术,你将看到如下子命令
***Commands***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
通过输入序列号或首字母能选择相应的机能,具体的机能解释如下:
status:#机能上和 git add -i 相似,没什么鸟用
update:#详见下方 git add -u
revert:#把已经添加到暂存区的文件从暂存区剔除,其操作方式方式和 update 类似
add untracked:#能把新增的文件添加到暂存区,其操作方式方式和 update 类似
patch:#详见下方 git add -p
diff:#比较暂存区文件和本地版库的差异,其操作方式方式和 update 类似
quit:#退出 git add -i 命令控制技术
help:#查看帮助信息
git add -p
直接步入交互命令中最有用的 patch 模式
这是交互命令中最有用的模式,其操作方式方式和 update 类似,选择后 Git 会显示这些文件的现期内容与本地版库中的差异,然后您可以自己决定是否添加这些修改到暂存区,在配置文件 Stage deletion [y,n,q,a,d,/,?]? 后输入 y,n,q,a,d,/,? 其中一项选择操作方式方式,具体机能解释如下:
y:接受修改n:忽略修改q:退出现期命令a:添加修改d:放弃修改/:通过正则表达式匹配修改内容?:查看帮助信息git add -u
直接步入交互命令中的 update 模式
它会先列出工作区 修改 或 删除 的文件列表,新增 的文件不会被显示,在配置文件 Update>> 后输入相应的列表序列号表示选中该项,回车继续选择,如果已选好,直接回车返回命令主界面
git add –ignore-removal .
#添加工作区 修改 或 新增 的文件列表, 删除 的文件不会被添加
git commit
#把暂存区的文件提交到本地版库
git commit -m 第一行提交原因 -m 第二行提交原因
#不关上编辑器,直接在配置文件中输入多行提交原因
git commit -am 提交原因
#将工作区 修改 或 删除 的文件提交到本地版库, 新增 的文件不会被提交
git commit –amend -m 提交原因
#修改最新一条提交记录的提交原因
git commit -C HEAD
#将现期文件改动提交到 HEAD 或现期分支的历史ID
git mv
#移动或重命名文件、目录
git mv a.md b.md -f
#将 a.md 重命名为 b.md ,同时添加变动到暂存区,加 -f 参数能强制重命名,相比用 mv a.md b.md 命令省去了 git add 操作方式
git rm
#从工作区和暂存区移除文件
git rm b.md
#从工作区和暂存区移除文件 b.md ,同时添加变动到暂存区,相比用 rm b.md 命令省去了 git add 操作方式
git rm src/ -r
#允许从工作区和暂存区移除目录
git status
git status -s
#以简短方式查看工作区和暂存区文件状态,示例如下:
M demo.html
?? test.html
git status –ignored
#查看工作区和暂存区文件状态,包括被忽略的文件
操作方式分支
git branch
#查看、建立、删除分支
git branch -a
#查看本地版库和远程版库上的分支列表
git branch -r
#查看远程版库上的分支列表,加之 -d 参数能删除远程版库上的分支
git branch -D
#分支未提交到本地版库前强制删除分支
git branch -vv
#查看带有最后提交id、最近提交原因等信息的本地版库分支列表
git merge
#将其他分支合并到现期分支
git merge –squash
#将待合并分支上的 commit 合并成两个捷伊 commit 放入现期分支,适用于待合并分支的提交记录不须要保留的情况
git merge –no-ff
#默认情况下,Git 执行”快进式合并”(fast-farward merge),会直接将 Master 分支指向 Develop 分支,选用 –no-ff 参数后,会执行正常合并,在 Master 分支上生成两个新节点,保证版演进更清晰。

git merge –no-edit
#在没有冲突的情况下合并,不想手动编辑提交原因,而是用 Git 自动生成的类似 Merge branch test的文字直接提交
git checkout
#切换分支
git checkout -b daily/0.0.1
#建立 daily/0.0.1 分支,同时切换到这个新建立的分支
git checkout HEAD demo.html
#从本地版库的 HEAD(也能是提交ID、分支名、Tag名) 历史中检出 demo.html 覆盖现期工作区的文件,如果省略 HEAD 则是从暂存区检出
git checkout –orphan new_branch
#这个命令会建立两个全捷伊,完全没有历史记录的新分支,但现期源分支上所有的最新文件都还在,啊强迫症患者的福音,但这个新分支必须做一次 git commit 操作方式后才会真正成为两个新分支。
git checkout -p other_branch
#这个命令主要用以比较两个分支间的差异内容,并提供交互式的界面来选择进一步的操作方式,这个命令不仅能比较两个分支间的差异,还能比较单个文件的差异。
git stash
#在 Git 的栈中保存现期修改或删除的工作进度,当你在两个分支里做某项机能开发时,接到通知把昨天已经测试完没问题的代码发布到线上,但这时你已经在这个分支里加入了其他未提交的代码,这个这时候就能把这些未提交的代码存到栈里。
git stash
#将未提交的文件保存到Git栈中
git stash list
#查看栈中保存的列表
git stash show stash@{0}
#显示栈中其中一条记录
git stash drop stash@{0}
#移除栈中其中一条记录
git stash pop
#从Git栈中检出最新保存的一条记录,并将它从栈中移除
git stash apply stash@{0}
#从Git栈中检出其中一条记录,但不从栈中移除
git stash branch new_banch
#把现期栈中最近一次记录检出并建立两个新分支
git stash clear
#清空栈里的所有记录
git stash create
#为现期修改或删除的文件建立两个自定义的栈并返回两个ID,此时并未真正存储到栈里
git stash store xxxxxx
#将 create 方法里返回的ID放到 store 后面,此时在栈里真正建立了两个记录,但现期修改或删除的文件并未从工作区移除
$ git stash create
09eb9a97ad632d0825be1ece361936d1d0bdb5c7
$ git stash store 09eb9a97ad632d0825be1ece361936d1d0bdb5c7
$ git stash list
stash@{0}: Created via “git stash store”.
操作方式历史
git log
#显示提交历史记录
git log -p
#显示带提交差异对比的历史记录
git log demo.html
#显示 demo.html 文件的历史记录
git log –since=”2 weeks ago”
#显示2周前已经开始到现在的历史记录,其他时间能类推
git log –before=”2 weeks ago”
#显示截止到2周前的历史记录,其他时间能类推
git log -10
#显示最近10条历史记录
git log f5f630a..HEAD
#显示从提交ID f5f630a 到 HEAD 之间的记录,HEAD 能为空或其他提交ID
git log –pretty=oneline
#在一行中输出简短的历史记录
git log –pretty=format:”%h”
#格式化输出历史记录
Git 用各种 placeholder 来决定各种显示内容,我挑两个常用的显示如下:
%H: #commit hash
%h: #缩短的commit hash
%T: #tree hash
%t: #缩短的 tree hash
%P: #parent hashes
%p: #缩短的 parent hashes
%an: #作者名字
%aN: #mailmap的作者名
%ae: #作者邮箱
%ad: #日期 (–date= 制定的格式)
%ar: #日期, 相对格式(1 day ago)
%cn: #提交者名字
%ce: #提交者 email
%cd: #提交日期 (–date= 制定的格式)
%cr: #提交日期, 相对格式(1 day ago)
%d: #ref名称
%s: #commit信息标题
%b: #commit信息内容
%n: #换行
git cherry-pick
#合并分支的一条或几条提交记录到现期分支末梢
git cherry-pick 170a305
#合并提交ID 170a305 到现期分支末梢
git reset
#将现期的分支重设(reset)到指定的 <commit> 或者 HEAD
git reset –mixed <commit>
#–mixed 是不带参数时的默认参数,它退返回某个版,保留文件内容,回退提交历史
git reset –soft <commit>
#暂存区和工作区中的内容不作任何改变,仅仅把 HEAD 指向 <commit>
git reset –hard <commit>
#自从 <commit> 以来在工作区中的任何改变都被丢弃,并把 HEAD 指向 <commit>
git rebase
#重新定义分支的版库状态
git rebase branch_name
#合并分支,这跟 merge 很像,但还是有本质区别,看下图:
合并过程中可能须要先解决冲突,然后执行 git rebase –continue
git rebase -i HEAD~~
#打开文本编辑器,将看到从 HEAD 到 HEAD~~ 的提交如下
pick 9a54fd4 添加commit的表明
pick 0d4a808 添加pull的表明
# Rebase 326fc9f..0d4a808 onto d286baa
#
# 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 commits log message
# x, exec = run command (the rest of the line) using shell
#
将第一行的 pick 改成 Commands 中所列出来的命令,然后保存并退出,所对应的修改将会生效。
如果移动提交记录的顺序,将改变历史记录中的排序。
git revert
#撤销某次操作方式,此次操作方式之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最捷伊提交
git revert HEAD
#撤销前一次提交操作方式
git revert HEAD –no-edit
#撤销前一次提交操作方式,并以默认的 Revert “xxx” 为提交原因
git revert -n HEAD
#须要撤销多次操作方式的这时候加 -n 参数,这样不会每次撤销操作方式都提交,而是等所有撤销都完成后一起提交
git diff
#查看工作区、暂存区、本地版库之间的文件差异,用一张图来解释
git diff –stat
#通过 –stat 参数能查看变更统计数据
test.md | 1 –
1 file changed, 1 deletion(-)
git reflog
#reflog 能查看所有分支的所有操作方式记录(包括commit和reset的操作方式、已经被删除的commit记录,跟 git log 的区别在于它不能查看已经删除了的commit记录
远程版库连接
如果在GitHub工程项目初始化之前,文件已经存在于本地目录中,那能在本地初始化本地版库,再将本地版库跟远程版库连接起来
git init
#在本地目录内部会生成.git配置文件
git remote -v
#不带参数,列出已经存在的远程分支,加之 -v 列出详细信息,在每两个名字后面列出其远程url
git remote add origin https://github.com/gafish/gafish.github.com.git
#添加两个捷伊远程仓库,指定两个名字,以便引用后面带的URL
git fetch
#将远程版库的更新取返回本地版库
git fetch origin daily/0.0.1
#默认情况下,git fetch 取回所有分支的更新。如果只想取回特定分支的更新,能指定分支名。
问题排查
git blame
#查看文件每行代码块的历史信息
git blame -L 1,10 demo.html
#截取 demo.html 文件1-10行历史信息
git bisect
#二分查找历史记录,排查BUG
git bisect start
#已经开始二分查找
git bisect bad
#标记现期二分提交ID为有问题的点
git bisect good
#标记现期二分提交ID为没问题的点
git bisect reset
#查到有问题的提交ID后返回原分支
更多操作方式
git submodule
#通过 Git 子模块能跟踪外部版库,它允许在某一版库中再存储另一版库,并且能够保持2个版库完全独立
git submodule add https://github.com/gafish/demo.git demo
#将 demo 仓库添加为子模块
git submodule update demo
#更新子模块 demo
git gc
#运行Git的垃圾回收机能,清理冗余的历史快照
git archive
#将加了tag的某个版打包提取
git archive -v –format=zip v0.1 > v0.1.zip
#–format 表示打包的格式,如 zip,-v 表示对应的tag名,后面跟的是tag名,如 v0.1。
总结
责任编辑只是对 Git 的所有机能中的部分实用机能做了一次探秘,Git非常强悍,还有许多机能有待我们去发现,限于责任编辑篇幅,咱就此打住吧,预知更多好用机能,请善用谷歌。
转自:gafish 链接:https://github.com/gafish/gaf…
阮一峰在 GitHub 又一开源力作!抓紧浏览
《史上最全、最详细的Docker学习资料》快浏览!PanDownload复活了!60MB/s这里给大家再分享一些技术资料,建议收藏!超全96页!《阿里云ECS运维:linux控制技术诊断》免费浏览升职加薪必备!运维工程师打怪升级进阶成神之路全网最新、最全Linux面试题(2020版)!史上最全、最捷伊Redis面试题(2020最新版)!赞!7000 字学习笔记,MySQL 从进阶到放弃12800字!SQL 语法速成手册(干货满满,建议收藏!)
如有错误或其他问题,欢迎小伙伴留言评论、指正。如有帮助,欢迎点赞+转发分享。
更多相关开源技术文章,请持续关注民工哥知乎技术专栏。
我是民工哥,两个爱折腾的IT技术老司机,欢迎关注我,我们一起学习,共同成长!!