git 笔记

官方文档: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 '[email protected]'
// 全局配置
git config --global user.name 'xxxx'
git config --global user.email '[email protected]'
// 本地配置,如果在仓库目录下,可以不带--local参数
git config --local user.name 'xxx'
git config --local user.email '[email protected]'

设置文本编辑器

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 
git restore --staged 

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

git checkout -- ...

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

例如, a

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

远程仓库管理

查看远程仓库

git remote -v

添加一个新的远程 Git 仓库

git remote add   

打标签

列出标签

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  :refs/tags/ // 更新远程仓库
git push origin --delete 
//示例
git push origin :refs/tags/v1.1;

命令别名

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

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

git 分支

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

创建分支

git branch testing // 创建名为testing 的分支
git checkout -b  //创建并切换分支
git switch -c  //创建并切换分支  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 
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 

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

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 命令可以直接将主题分支变基到目标分支

git rebase master server

疑问:

git fetch 与 git pull 有什么区别

git fetch 从远程分支抓取数据,不自动merge

git pull 自动merge

你可能感兴趣的:(git 笔记)