本文主要总结自菜鸟教程,感谢
Git安装配置
- linux系统安装git如下(图片来自菜鸟教程)
- Git配置
- git config命令: 用于配置或读取相应的工作环境变量
- 如Git安装后,要配置用户名和电子邮件地址:
- $ git config --global user.name “your user name”
- $ git config --global user.email “your email”
- $ git config --global core.editor emacs (可选的-配置编辑器)
- $ git config --global merge.tool vimdiff(可选的-配置差异化分析工具)
- 上述–global指定命令后续配置的使用范围,各配置范围如下:
- 查看配置信息:git config --list
http.postbuffer=2M
user.name=your user name
user.email=your email- 直接查阅某个环境变量的设定:
- $ git config user.name
Git工作流程
-
一般工作流程如下(图片来自菜鸟教程):
- 克隆 Git 资源作为工作目录(不能直接改别人的代码)
- 在克隆的资源上添加或修改文件(根据自己需要修改)
- 如果其他人修改了,你可以更新资源(源代码有更新再次拉取)
- 在提交前查看修改(自己修改好后,查看一下是否有错)
- 提交修改(没错就可以提交到特定仓库)
- 在提交完成后,如果发现错误,可以撤回提交并再次修改并提交(有需要可撤回)
-
Git工作区、暂存区、版本库(重要!!!)
- 工作区:workspace/ws,一般clone别人的代码后,得到的目录就是工作目录/工作区,你在该目录写自己的代码;
- 版本库:工作区下有个 .git 目录,称为Git的版本库
- 暂存区:官方英文术语叫stage/index;一般在 工作区/.git/index,即版本库里面的一个文件夹;也叫索引区
- 基本工作机制
- 如上图,左侧工作区、右侧版本库,版本库中有文件夹stage/index,即暂存区;HEAD->master(类似指针),master代表master分支/目录树;objects是Git的对象库,用于存储对象的更改操作以及暂存区目录树,用于回退操作;
- git add:工作区变动的文件内容更新到 stage/index目录树,同时被写入到objects中的一个new object,new object的ID又被记录到stage中的索引文件;
- git commit:stage中目录树写到objects,master分支指向该目录树(即与stage目录树保持一致)
- git reset HEAD:把HEAD/master指向的目录树还原到stage中,不影响工作区;
- git rm --cached anyFile:从stage中删除特定文件,不影响工作区;
- git checkout . 或者git checkout --anyFile:用stage中的全部或特定文件替换工作区的文件【危险!!!会清除工作区中未添加到stage的改动,努力就白费了】
- git checkout HEAD . 或者 git checkout HEAD anyFile:用HEAD/master分支的全部/部分文件替换 stage 以及 工作区 相应文件【危险!!!会清除工作区和stage为提交的改动,努力就白费了】
-
Git创建仓库([*]表示可选参数)
- git init [dir]:使用特定目录dir作为Git仓库,我们只需使它初始化
- git clone
other_repo
[new name]:从别人的Git仓库拷贝项目到自己目录; - git config -e [–global]:编辑配置文件,–global指定对当前用户所有仓库有效;
- 几种等价的git clone写法,常用SSH协议,较快,且可以配置公钥免密:
git clone git@github.com:fsliurujie/test.git --SSH协议
git clone git://github.com/fsliurujie/test.git --GIT协议
git clone https://github.com/fsliurujie/test.git --HTTPS协议
git clone http://github.com/CosmosHua/locate [new_name]
git clone http://github.com/CosmosHua/locate.git [new_name] -
Git基本操作(命令介绍)
- Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比
- Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull
- 几个术语介绍
- workspace:工作区;
- staging area:暂存区/缓存区;
- local repository:本地仓库;
- remote repository:远程仓库;
- 一些命令(图片来自菜鸟教程)
Git分支管理
- 分支相关命令:
- git branch [-b]
branch_name
:创建分支,没有参数则列出本地分支,加上-b选项则为创建并立即切换到新分支; - git checkout
branch_name
:切换分支(Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录) - git merge:合并分支
- git branch [-b]
- 一个例子-开始(来自菜鸟教程)
> $ mkdir gitdemo
> $ cd gitdemo/
> $ git init # 初始化一个仓库
> $ touch README # 创建一个文件
> $ git add README # add 把改动添加到stage,版本库对象objects创建新obj_new保存改动,obj_new的ID保存到stage中的索引文件
> $ git commit -m '第一次版本提交' # stage的目录树保存到objects,HEAD/master指向该目录树
> ### 分支操作介绍 ###
> $ git branch # 显示本地分支
>>> * master # *表示当前工作分支
> git branch testing # 创建testing分支,若已存在则切换
> git branch # 再次显示本地分支
>>> * master
>>> testing # 结果显示新增了一个分支
> ### 一个tip介绍如下 ###
> ls # 显示当前分支的文件
>>> README
> echo 'runoob.com' > test.txt # 新建文件test.txt
> git add . # 添加所有文件到stage
> git commit -m 'add test.txt' #
>>> [master 3e92c19] add test.txt # 注意是添加到master分支
> ls # 当前分支为master,因此能看到test.txt
>>> README test.txt
> git checkout testing # 切换到testing分支
> ls
>>> README # 没有test.txt,因为test.txt是master分支创建的;但是有README,也就是创建testing分支时,共享了master已有的文件;
> ### 创建分支命令介绍2 ###
> git checkout -b newtest # 该命令创建新分支newtest并立即切换到该分支下
>>> Switched to a new branch 'newtest'
> git rm test.txt # 删除当前分支的test.txt文件
> touch runoob.php # 新建文件
> git add .
> git commit -am 'removed test.txt and add runoob.php'
> ls
>>> README runoob.php # newtest分支的所有文件
> git checkout master
> ls
>>> README test.txt # newtest分支的操作不会影响master分支
> git branch -d testing # 新命令,删除testing分支
> git branch # 查看本地所有分支
>>> * master # 只剩下master/newtest分支
>>> newtest
> ### 分支合并命令介绍 ###
> git branch master # 切换到master分支
> ls
>>> README test.txt # master分支所有文件
> git merge newtest # 合并newtest分支到master分支
>>> Updating 3e92c19..c1501a2
>>> Fast-forward
>>> runoob.php | 0 # 合并会把newtest的操作带到master,因此新增runoob.php
>>> test.txt | 1 - # 去除test.txt
>>> 2 files changed, 1 deletion(-)
>>> create mode 100644 runoob.php
>>> delete mode 100644 test.txt
> ls # 显示当前master分支内容
>>> README runoob.php # test.txt文件被删除
> git branch -d newtest # 合并后可以删除newtest分支
> ### 合并冲突介绍 ###
> git branch
>>> * master
> cat runoob.php # 显示为空,即此时没有内容
> git checkout -b change_site # 创建冲突测试分支并切换到该分支
> vim runoob.php # 修改该分支的runoob.php文件,添加如下内容
>>> <?php
>>> echo 'runoob';
>>> ?>
> git commit -am 'change the runoob.php in change_site' # 提交
> git checkout master # 切换回master分支
> cat runoob.php # 显示仍然为空,change_site分支变动不影响master分支
> vim runoob.php # 修改当前master分支的runoob.php文件,添加如下内容
>>> <?php
>>> echo 1;
>>> ?>
> git diff # 差异化分析命令,查看目前变动,会看到runoob.php增加上面3行(此处不另外展示输出结果)
> git commit -am 'change the runoob.php in master' # 提交
> git merge change_site # !!!开始合并change_site分支到master分支
>>> Auto-merging runoob.php
>>> CONFLICT (content): Merge conflict in runoob.php
>>> Automatic merge failed; fix conflicts and then commit the result.
>>> # 报错如上,提示合并冲突:因为两个分支对同一个文件同一个地方做了修改,git不知道要采用哪一个分支的结果,注意没有默认采用当前分支的说法;
>>> # 此时可手动处理冲突文件(IDE会提供更好的修改方式),也可abort(暂略)
> cat runoob.php # git会把冲突部分在要合并的文件上展示出来,如下
>>> <?php
>>> <<<<<<<<< HEAD # 冲突提示符:master此处是echo 1;
>>> echo 1;
>>> ========= # 冲突提示符
>>> echo 'runoob';
>>> >>>>>>>>> change_site # 冲突提示符:change_site 此处是 echo ’runoob';
>>> ?>
> # 手动处理冲突,保留自己想要的内容,并删除冲突提示符,修改后演示结果如下:
> cat runoob.php
>>> <?php
>>> ehco 1;
>>> echo 'runoob';
>>> ?>
> git status -s # 冲突修改后查看状态,-s表示 简写short
>>> UU runoob.php # UU表示新添加未跟踪,此时冲突已解决
> git commit # 提交结果
Git查看提交历史
- 常用两个命令
- git log:查看提交历史记录
- git blame file:以列表形式查看指定文件的历史修改记录
- git log
> git log --oneline # --oneline选项指定查看历史记录的简洁版本
>>> d5e9fc2 (HEAD -> master) Merge branch 'change_site'
>>> c68142b 'change the runoob.php in master'
>>> (change_site) 'change the runoob.php in change_site'
>>> ...
> git log --oneline --graph # --graph选项以图形是查看历史中出现的分支、合并
>>> * d5e9fc2 (HEAD -> master) Merge branch 'change_site'
>>> |\
>>> | * 7774248 (change_site) change the runoob.php in change_site
>>> * | c68142b change the runoob.php in master
>>> |/
>>> ...
> git log --author=xxx --oneline # --author 指定查看提交作者的历史记录
> git log --oneline --before={2.weeks.ago} --after={2020-10-10} # before、after指定查看日期范围
- git blame your_file:列表形式查看特定文件的修改记录
> git blame README
>>> ^d2097aa (tianqixin 2020-08-25 14:59:25 +0800 1) # Runoob Git 测试(直接copy菜鸟教程的输出结果,大家知道就好)
>>> db9315b0 (runoob 2020-08-25 16:00:23 +0800 2) # 菜鸟教程
Git标签
- 开发进行到特定节点,可能希望记住这个提交节点(提交快照),可以用git tag打标签;
> git tag -a v1.0 # 给最新一次提交(HEAD)打上'v1.0'标签,-a表示可以注解,类似commit -m提供提交说明
> git tag -a v0.9 85fc7e7 # 给某个提交追加标签
> git tag # 查看所有标签
>>> v0.9
>>> v1.0
> git tag -d v1.0 # 删除标签
>>> Deleted tag 'v1.0' (was 91388f0)
> git show v0.9 # 查看标签对应版本的修改内容
git 标签介绍–菜鸟教程@宋某人c
1、发布一个版本时,我们通常先在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。
所以,标签也是版本库的一个快照。
Git 的标签虽然是版本库的快照,但其实它就是指向某个 commit 的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的
2、Git有commit,为什么还要引入tag?
“请把上周一的那个版本打包发布,commit号是6a5819e…”
“一串乱七八糟的数字不好找!”
如果换一个办法:
“请把上周一的那个版本打包发布,版本号是v1.2”
“好的,按照tag v1.2查找commit就行!”
所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
Git远程仓库(Github)
- 参见菜鸟教程