一、Git 基本配置

1、配置

命令:git config --global  prop_name prop_value

如配置git用户名与邮箱:

git config --global user.name 'matt cheng'  
git config --global user.email 'chjunlm@126.com'

2、查看配置

查看所有配置命令:git config --list --global

查看单项配置命令:git config --global user.name

3、配置的级别

git config --local    只对某个仓库有效(此为缺省配置)
git config --global 对当前用户所有仓库有效
git config --system 对系统所有登录用户有效

优先级:local > global > system

4、其他命令

git --version    查看版本
git command -h 查看命令帮助
git command --help 查看命令帮助(web页面)

二、Git 工作流

  说明:

     Workspace:     工作区
Index/Stage: 暂存区
Repository: 仓库区(或本地仓库)
Remote: 远程仓库

1、远程仓库与本地仓库的互操作

git clone url    从远程仓库clone到当前目录,仓库名与远程仓库相同
git clone url dir_name 从远程仓库clone到当前目录,仓库名为dir_name git fetch remote_name 将远程分支代码同步到本地远程分支
git fetch remote_name remote_branch_name 将远程指定分支代码同步到本地远程分支 git push remote_name local_branch:remote_branch 将本地分支同步到远程分支,可不同名
git push remote_name local_branch 将本地分支同步到远程同名分支,如远端不存在同名分支,则新建一个
git push 将本地当前分支同步到关联远端同名分支,如关联分支不同名,则报错
git push remote_name --all 同步所有分支到远端 git merge remote_name/remote_branch_name 将本地远程分支代码合并到本地当前分支,如出现错误:fatal: refusing to merge unrelated histories,使用--allow-unrelated-histories,如git merge --allow-unrelated-histories github/master,详细加帮助说明 git pull remote_name remote_branch:local_branch 将远程仓库的指定分支的代码同步到本地仓库指定分支,若本地分支不存在则新建一个
git pull remote_name remote_branch 将远程仓库的指定分支的代码同步到本地仓库当前分支(HEAD)
git pull 将关联的远程仓库指定分支的代码同步到本地仓库当前分支,无关联分支则报提示信息
pull = fetch + merge git branch -vv 查看分支关联信息
git branch --set-upstream-to=origin/remote_branch local_branch 设置分支关联信息 git remote -v 查看关联的远端(远端包括备份、github、gitlab等)
git remote add remote_name remote_url 添加关联的远端,remote_name:远端名,可自定义;remote_url:远端地址,如https、ssh等

补充说明

  • 从远端clone出来的项目,remote_name默认为orgin
  • push操作需要满足fast-forwards,详见:git push --help -> help page -> NOTE ABOUT FAST-FORWARDS

在github或gitlab创建完项目后,可使用以下命令同步本地文件

# Git global setup
git config --global user.name "cheng jun"
git config --global user.email "chjunlm@126.com"
# Push an existing folder
cd existing_folder
git init
git remote add origin http://gitlab.saicstack.com/open_api/openapi-console.git
git add .
git commit -m "Initial commit"
git push -u origin master # Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin http://gitlab.saicstack.com/open_api/openapi-console.git
git push -u origin --all
git push -u origin --tags # Ctreate a new repository
git clone http://gitlab.saicstack.com/open_api/openapi-console.git
cd openapi-console
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

2、本地仓库

可以将本地目录纳入git管理

git init    将已有项目纳入git管理:
git init project_name 创建新项目,会在当前路径下新建同名目录

3、本地备份

操作流程如下:

备份端
、mkdir -back 创建备份目录,设为666-back
、git clone --bare file:///git_learning/.git zhineng.git 从远端备份到当前目录, --bare表示无工作区,创建的目录zhineng.git与正常的.git目录相似 工作端
、git remote -v 查看远程备份,此时无远端备份记录
、git remote add zhineng file:///d/666-backup/zhineng.git 建立远程备份关联,此时使用git remote -v可查看
、git push zhineng 同步当前分支到远端备份

本地备份本质是在本地建立远端仓库,同步操作与远端仓库相同

三、Git 本地操作

1、分支操作

git branch -v    查看本地分支
git branch -va 查看所有分支(包括本地、远端)
git checkout branch_name 切换工作分支
git checkout -b new_branch_name commit_no/branch_name 根据某次提交版本或分支,创建新分支
git branch -d branch_name 在删除前判断在该分支上开发的功能是否被merge的其它分支。如果没有,不能删除。如果merge到其它分支,但之后又在其上做了开发,使用-d还是不能删除
git branch -D branch_name 强制删除
git branch -m local_branch1 local_branch2 本地分支重命名
git push origin --delete remote_branch_name 删除远程分支

2、文件基本操作

git status  查询工作区状态
git add file1 file2 dir1 工作目录 -> 暂存区:提交新增或修改的文件或目录
git add -u 工作目录 -> 暂存区:提交所有修改
git commit -m'message' 暂存区 -> 本地仓库:提交版本
git mv file1 file2 改名文件,并且将这个改名放入暂存区
git rm filename 删除工作区文件,并且将这次删除放入暂存区

注意:git 不能提交空的文件夹

3、文件恢复

git checkout -- filename    缓存区 -> 工作区: 重置指定文件
git reset --hard HEAD 缓存区 -> 工作区: 重置全部文件
git reset HEAD 本地仓库 -> 缓存区: 重置全部文件
git reset HEAD -- file1 file2 本地仓库 -> 缓存区: 重置部分文件
git reset --hard commit_no/branch_name 删除最近几次提交,并重置缓存区、工作区
git revert commit_no/branch_name 撤销最近几次修改,与git reset不同的是,在原有提交记录上新增回退记录,而非删除提交记录

4、文件比较

git diff --cached    暂存区与Head所含文件差异
git diff 显示暂存区与工作区的差异
git diff HEAD  显示工作区与HEAD的差异
git diff -- file1 file2 显示指定文件差异
git diff branch_name1/commit_no1 branch_name2/commit_no2 两个分支或提交间的比较
git diff branch_name1/commit_no1 branch_name2/commit_no2 -- file1 file2 两个分支或提交间特定文件比较

5、日志查看

git log    显示当前分支的日志
git log --all 查看所有分支提交记录
git log --oneline 单行显示
git log --graph 查看分支演进层次
git log -n5 / git log - 显示最近5行 gitk 查看当前分支
gitk --all 查看所有分支

补充:--oneline、 -n5、 --all、 --graph 可一起使用

四、多人协作与文件合并

1、不同文件或同文件不同区域,git通过如下命令自动合并

git merge
git pull

2、同文件同区域

git status    查看冲突的文件,可通过vim编辑冲突
git commit -m'msg' 冲突编辑完后提交,从而解决冲突
git merge --abort 取消合并,再次合并可使用git merge

3、同时变更文件名与文件内容,git自动合并

4、图形化冲突合并

git mergetool    常见配置为beyond compare,使用体验较差
TortoiseGit 图像化方式使用git,与svn操作一致,代码合并使用体验较好
SourceTree 图像化方式使用git,待尝试

TortoiseGit使用介绍:TortoiseGit安装、配置

五、Git 探秘

1、目录结构

.git -> HEAD    记录当前工作分支,内容指向 .git -> refs -> heads 下某个分支
.git -> config 记录当前配置,git confit --local 设置结果存储在该文件中
.git -> refs -> heads 记录仓库分支列表,对象类型为commit
.git -> refs -> tags 记录仓库tag,对象类型为tag
.git -> objects 记录仓库对象,对象id=子目录名+子目录中文件名,该对象类型为tree git cat-file -t object_id 查看对象类型
git cat-file -p object_id 查看对象内容

2、三种对象(commit、tree、blob)之间的关系

commit    提交对象,内容包括一个到tree的引用,表示该次提交的快照
tree 目录对象,内容可以包含tree、blob
blob 文件对象

新建的Git仓库,有且仅有1个commit,仅仅包含 /doc/readme,,请问内含多少个tree,多少个blob? 具体操作如下:

、仓库初始化,添加doc目录及readme文件后,使用命令find .git/objects -type f 查找对象个数为0
、使用git add doc添加到仓库后,生成1个blob对象
、使用git commit -m'add readme',对象数为4:1个blob、2个tree、1个commit

对象间的关系如下:

3、HEAD

head可指向分支和分离头,无论哪种情况,最终都指向某次提交,因此head可代指某次提交,用法如下:

git diff HEAD HEAD^
git diff HEAD HEAD^^
git diff HEAD HEAD~ 其中 :
HEAD^ <=> HEAD^ <=> HEAD~
HEAD^^ <=> HEAD^^ <=> HEAD~

六、忽略文件

新增.gitignore文件,忽略规则如下:

空格不匹配任意文件,可作为分隔符,可用反斜杠转义
# 开头的文件标识注释,可以使用反斜杠进行转义
! 开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义
/ 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
/ 开始的模式匹配项目跟目录
如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
** 匹配多级目录,可在开始,中间,结束
? 通用匹配单个字符
[] 通用匹配单个字符列表

匹配示例:

bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 忽略根目录下的bin文件
/*.c: 忽略 cat.c,不忽略 build/cat.c
debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
**/foo: 忽略/foo, a/foo, a/b/foo等
a/**/b: 忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件
*.log: 忽略所有 .log 文件
config.php: 忽略所有 config.php 文件

github/gitignore项目包含各语言默认ignore设置

补充:

  • .gitignore也可放置在各子目录下,根目录(/)指.gitignore所在当前目录
  • .gitignore只作用于没有被track的文件,对于已经纳入git管理的文件,修改.gitignore是无效的
  • 可设置本地与全局忽略文件配置,详细可参考Git 忽略提交 .gitignore

七、其他

1、分离头(detached head)

git checkout  commit_no 创建分离头,可在分离头上提交版本
git checkout -b branch_name / git branch branch_name commit_no 这两个命令均可将分离头创建为分支

分离头创建和离开操作均有详细提示,请留意

2、修改提交历史

git commit --amend    修改最近一次提交的备注
git rebase -i parent-commit-no 修改历史某次提交的备注,交互式编辑器中,修改命令为reword,parent-commit-no为待修改提交的前一次提交id
git rebase -i parent-commit-no 合并多个相邻commit,交互式编辑器中,修改命令为squash 合并多个不相邻commit
、执行git rebase -i parent-commit-no,与2.4相同,若合并项包含第一项,则parent-commit-no为第一个commit的id,此时需在交互式编辑器中第一行添加pick first_commit-no message,message可为空
、若合并项包含第一项,结果提示失败,此时可执行git status,根据提示执行git rebase --continue即可

3、加塞临时任务

git stash     隐藏当前工作区任务
git stash list 查看隐藏列表
git stash apply 恢复工作区隐藏任务,隐藏列表不消除
git stash pop 恢复工作区隐藏任务,隐藏列表消除

参考:

pull & push的使用

常用 Git 命令清单

Git 忽略提交 .gitignore

Git 操作命令的更多相关文章

  1. git操作命令

    参考:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 git 分布式版本控制系统. ...

  2. 总结的git操作命令小抄集

    .gitignore 本地仓库主目录下,用于定义提交时忽略的文件   git add <file-name> 将修改或新增的文件存入暂存区   git reset HEAD <fil ...

  3. git 操作命令详解

    git 什么是git 开源的分布式版本控制系统, 用于高效的管理大小项目和文件 代码管理工具 防止代码丢失, 做备份 代码版本管控, 设置节点, 多版本切换 建立分支各自开发, 互不影响, 方便合并 ...

  4. 常用git操作命令

     查看远程仓库 ->$ git remote -v    如果你本地有一个项目,想把他放到远程git服务器上,那就用上面的命令把项目 add 到远程服务器 ->$ git remote a ...

  5. [Git] Git操作命令

    基础操作 git配置 git config --global user.name "Your Name" git config --global user.email " ...

  6. Linux系统下Git操作命令整理

    1.显示当前的配置信息 git config --list 2. 创建repo从别的地方获取 git clone git://git.kernel.org/pub/scm/git/git.git 自己 ...

  7. git操作命令行

    前言 git操作各种软件五花八门,懒得研究,用最原始的方法敲命令行. 操作 1.网上下载git 网上百度一下好多直接下载就好 2.配置用户名邮箱 $ git config --global user. ...

  8. 常用的git操作命令

    整理来源于廖雪峰的git教程https://www.liaoxuefeng.com git: 分布式版本控制系统  本地有完整的代码库,还有远程代码库 svn: 集中式版本控制系统 必须联网时才可提交 ...

  9. 应小姐姐要求,整理常用Git操作命令,她都学会了,你确定不收藏

    前言 因为个人原因,转化了部门之后已经很久没有接触过开发层级的东西了,好多东西基本都忘记了,但是新的部门有时候会用到相应的研发部的代码和文档手册,所以耳边就充斥这一句话 这个为什么下载不了?这个为什么 ...

随机推荐

  1. mysql_8.0.12环境配置

    1. 官网下载mysql_8.0.12免安装包,解压到你存放的地方: 2. 配置环境变量(把bin的文件夹弄进系统path里面): 3. 在解压的根路径中,查看是否含有my.ini文件,没有就新建一个 ...

  2. SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

  3. Centos7+lnmp+zabbix4+分离mysql实验

    一.简介 1.什么是zabbix zabbix是一个企业级的.开源的.分布式的监控套件. zabbix可以对网络和服务进行完整性,健康性的监控.zabbix利用灵活的告警机制,可以实验微信,短信和邮件 ...

  4. vue学习记录③(路由)

    上篇文章我们用vue-cli脚手架工具做了个简单的hello world页面,但是我们破坏了原来的流程,而正常的访问页面应该是通过路由来实现的. 那么什么是路由呢? 路由就是通过不同的url来访问不同 ...

  5. 关于TCP的握手与挥手-----简单解释

    所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.在socket编程中,这一过程由客户端执行conn ...

  6. HTML页面转换为Sharepoint母版页(实战)

    分享人:广州华软 极简 一. 前言 SharePoint有母版页.布局页.母版页存放着如头部(顶部菜单.导航),底部等比较通用部分,通常网站只需一套即可:而布局页,则存放着主要内容部分,根据页面需要, ...

  7. android - TextView单行显示...或者文字左右滚动(走马灯效果)

    条件 TextView单行显示,文字左右滚动(走马灯效果)实现条件: 实现单行设置固定宽度或者设置权重都行 代码 TextView滚动必须写下面几个属性 android:singleLine=&quo ...

  8. 基于django的视频点播网站开发

    项目名称 基于django的视频点播网站开发 项目背景 学习完毕python和django之后,想找个项目练练手,本来想写个博客项目练手,无奈别人已经写过了,所以笔者就打算写一个视频点播网站,因为笔者 ...

  9. 测者的测试技术手册:分清Java的Override和Overload

    Java的Override和OverloadOverride重写:子类对父类的允许访问的方法实现过程重新编写,但是 不可改变返回值和入参.重弄写的规则: 参数列表必须完全与被重写方法的相同: 返回类型 ...

  10. python-重载

    重载概念 重载是对继承的父类方法进行重新定义.重载可以重新定义方法还可以重新定义运算符.因为通过继承的类不一定能满足当前类的需求.在当前类中只需要修改部分内容而达到自己的需求. 重载特点 减少代码量和 ...