• Git 操作命令


    一、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、本地备份

    操作流程如下:

    备份端
    1mkdir 666-back    创建备份目录,设为666-back
    2、git clone --bare file:///git_learning/.git zhineng.git   从远端备份到当前目录, --bare表示无工作区,创建的目录zhineng.git与正常的.git目录相似
         
    工作端
    1、git remote -v    查看远程备份,此时无远端备份记录
    2、git remote add zhineng  file:///d/666-backup/zhineng.git    建立远程备份关联,此时使用git remote -v可查看
    3、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    显示最近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? 具体操作如下:

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

    对象间的关系如下:

             

    3、HEAD

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

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

    六、忽略文件

    新增.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
    1、执行git rebase -i parent-commit-no,与2.4相同,若合并项包含第一项,则parent-commit-no为第一个commit的id,此时需在交互式编辑器中第一行添加pick first_commit-no message,message可为空
    2、若合并项包含第一项,结果提示失败,此时可执行git status,根据提示执行git rebase --continue即可

    3、加塞临时任务

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

    参考:

    pull & push的使用

    常用 Git 命令清单

    Git 忽略提交 .gitignore

  • 相关阅读:
    前端性能优化:Add Expires headers
    HTTP请求header信息讲解
    虚拟机的三种网络模式
    loadrunner中pacing设置01
    loadrunner中pacing的设置
    mysql安全策略
    Linux安装配置apache
    同步加载、异步加载、延迟加载
    monitorix(linux)系统和网络监控公工具
    HTTP与HTTPS对访问速度(性能)的影响
  • 原文地址:https://www.cnblogs.com/MattCheng/p/10348493.html
Copyright © 2020-2023  润新知