美文网首页
git 笔记

git 笔记

作者: 切磋琢磨_FE | 来源:发表于2020-11-25 10:06 被阅读0次

    官方文档:https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA%8E%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6

    git 直接记录快照,svn是基于差异(delt-based)

    三种状态: committed(已提交)、modified(已修改)、staged(已暂存)

    三个阶段: working Directory, Staging Area , .git directory

    工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

    暂存区 理解暂存区

    Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。

    基本工作流程:

    1. 在工作区中修改文件。
    2. 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
    3. 提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。

    基本配置

    配置分三个层级,分别有system, global, local。
    local配置是仓库本地配置,每个git仓库都有一个local配置,local配置对应的配置文件是仓库目录下的.git/config文件

    local配置会覆盖global配置, global配置会覆盖system配置

    git config --list  // 列出所有配置
    git config --list --show-origin // 查看所有配置及所在文件
    

    设置 用户名和邮件:

    // 系统配置
    git config --system user.name 'xxxx'
    git config --system user.email 'aaaa@bbb.com'
    // 全局配置
    git config --global user.name 'xxxx'
    git config --global user.email 'asdf@asdf.com'
    // 本地配置,如果在仓库目录下,可以不带--local参数
    git config --local user.name 'xxx'
    git config --local user.email 'xxx@xxx.com'
    

    设置文本编辑器

    git config --global core.editor xxx
    

    设置编码

    git config --global core.quotepath false
    

    帮助

    获取对应指令的帮助

    git help xxx
    git xxx --help
    man git-xxx
    

    例如:
    git help config

    初始化

    通常有两种获取 Git 项目仓库的方式:

    1. 将尚未进行版本控制的本地目录转换为 Git 仓库;
    2. 从其它服务器 克隆 一个已存在的 Git 仓库。

    初始化一个仓库

    cd dirName
    git init
    

    克隆现有仓库

    git clone https://xxxx
    git clone httpx://xxxx  dirName // 指定目录名称
    
    记录更新

    检察文件状态

    git status
    git status -s // 精简打印
    // MM 已暂存并修改
    // M  已暂存
    // A  新增到暂存区的文件
    

    追踪(track)/暂存文件
    git add fileName

    忽略文件,只需要在 .gitignore中进行配置即可。

    文件 .gitignore 的格式规范如下:

    1. 所有空行或者以 # 开头的行都会被 Git 忽略。
    2. 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
    3. 匹配模式可以以(/)开头防止递归。
    4. 匹配模式可以以(/)结尾指定目录。
      5.要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

    ==什么是glob?==

    查看diff

    git diff // 未暂存的修改,对比工作区和暂存区的文件,与版本库没关系。
    
    // 查看已暂存的修改,对比暂存区和已提交的文件
    git diff --staged    // --staged 和 --cached 是同义词
    git diff --cached    // --staged 和 --cached 是同义词
    
    // 使用可视化工具查看diff(几乎用不到,vscode自带的diff可视化很好用)
    git difftool
    

    提交更新

    git commit  // 不指定描述会直接打开命令行编辑器让你输入描述内容。
    git commit -m '描述'
    

    从工作区直接commit

    git commit -a 
    
    移除(已跟踪)文件

    移除文件的笨办法是先手动删除文件,再将删除的操作add到stage 目录,最后commit。这里分三步走

    移除文件分两种方式,一是删除工作区的文件并移除stage的记录

    git rm fileName  // 删除工作区文件,并将该删除操作添加到暂存区
    git commit  // 提交
    // git rm 其实是 合并了删除文件和git add两步操作,一次性将删除操作记录到暂存区
    

    另外一种方式是只移除git对文件的跟踪,而文件保留在工作目录

    gir rm --stage fileName  // 这里相当于在保留工作区文件的同时,将删除操作提交到了暂存区,
    git commit 
    

    ⚠️ -f 命令 : 如果文件在工作区被修改,使用-f指令强制删除

    git rm -f filename // 强制删除文件,不保留
    git rm -f  --staged filename // 强制删除文件,工作区保留。
    

    git rm 只能处理tracked文件

    移动文件

    git mv fileFrom fileTo
    
    查看历史
    git log
    

    列出差异

    git log -p 
    git log -p -2 // 查看最近两次提交记录
    

    列出统计

    git log -stat
    

    美化

    git log --pretty=oneline
    

    具体pretty值的可选项: https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86%E5%8F%B2

    图形显示分支

    git log --pretty=format:"%h %s" --graph
    

    还有其他log方法具体看文档

    撤销操作

    修补提交,修补上一次的提交内容及message,不会产生新的提交。

    git commit --amend
    

    取消暂存,将指定文件在暂存区的状态恢复到已提交的状态。

    git reset HEAD <file>
    git restore --staged <file>
    

    撤销修改,⚠️此操作会覆盖工作区,容易造成工作内容丢失。

    git checkout -- <file>...
    

    如果 file 在暂存区有记录,会从暂存区恢复file的内容。

    例如, a

    如果暂存区没有记录,会从将工作区内容恢复到版本库中上一次提交的状态。

    远程仓库管理

    查看远程仓库

    git remote -v
    

    添加一个新的远程 Git 仓库

    git remote add <shortname> <url> 
    

    打标签

    列出标签

    git tag
    

    创建标签

    git tag -a v1.1 -m '描述'
    git show // 查看标签信息及对应的提交信息
    

    轻量标签

    git tag v1.4-lw // 不提供任何选项,直接跟版本好 ,就是轻量标签
    

    对某个提交版本打标签

    git tag -a v1.xxx md5
    

    本地创建的标签需要推送到远程仓库

    git push origin v1.xx;
    git push origin --tags // 推送全部本地标签,会把所有不在远程仓库的标签都推送上去
    

    删除标签

    git tag -d v1.xx 
    git push <remote> :refs/tags/<tagname> // 更新远程仓库
    git push origin --delete <tagname>
    //示例
    git push origin :refs/tags/v1.1;
    

    命令别名

    通过git config 为 git命令设置别名

    git config --global alias.co checkout
    // alias.<name> 这里的name 就是别名
    示例:
    git config --global alias.unstage 'reset HEAD --'
    git config --global alias.last 'log -1 HEAD'
    

    git 分支

    点击这里阅读官方教程文档。

    创建分支

    git branch testing // 创建名为testing 的分支
    git checkout -b <newbranchname> //创建并切换分支
    git switch -c <newbranchname> //创建并切换分支  switch 命令2.24.1才支持
    

    查看各个分支的指向

    git log --oneline --decorate 
    git log --oneline  // 在高版本git不需要 --decorate 操作了。
    

    切换分支

    git checkout branchName
    git switch master // 切换到master switch 命令2.24.1才支持
    

    查看当前分支结构

    git log --graph --all // --all是用来显示所有分支,
    

    合并分支

    git merge <newbranchname>
    git merge --no-ff -m "merge with no-ff" dev // 禁用Fast forward 合并
    

    分支管理

    git branch // 列出分支
    git branch -v //列出所有分支的上次提交
    
    git branch -d testing //删除分支,
    git branch -D testing //当 testing分支中有未合并的提交时,强制删除分支
    

    远程分支

    git ls-remote origin    //获取远程分支列表
    

    与给定的远程仓库同步数据

    git fetch <remote>
    

    在远程跟踪分支之上建立分支

    git checkout -b serverfix origin/serverfix
    

    跟踪远程分支

    git checkout --track origin/develop // 本地新增 develop分支并跟踪远程 develop分支
    git checkout serverfix // 如果远程有serverfix分支,且本地无此分支,会自动跟踪
    

    查看设置的所有跟踪分支

    git branch -vv
    

    清理无效的远程分支

    git remote prune origin
    

    变基(rebase)

    文档
    你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

    rebase是用来合并分支的,当在两个不同的分支上都做了修改,可以使用rebase将一个分支上的修改合并到另外一个分支上。

    将experiment rebase 到 master上

    git checkout experiment
    git rebase master 
    

    过滤部分分支

    git rebase --onto master server client // client中过滤掉 server的部分,rebase到master
    

    一句话 rebase:使用 git rebase <basebranch> <topicbranch> 命令可以直接将主题分支变基到目标分支

    git rebase master server
    

    疑问:

    git fetch 与 git pull 有什么区别
    
    git fetch 从远程分支抓取数据,不自动merge
    
    git pull 自动merge

    相关文章

      网友评论

          本文标题:git 笔记

          本文链接:https://www.haomeiwen.com/subject/exigiktx.html