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 '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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容

  • 目录 Git 笔记系列(一)—— Git简介 Git 笔记系列(二)—— Git工作流程 Git 笔记系列(三)—...
    吃蘑菇De大灰狼阅读 512评论 0 5
  • 一.Git简介 Git是世界上最先进的分布式版本控制系统,相对于SVN这样的集中式版本控制系统,Git不需要“中央...
    ahuustcly阅读 717评论 0 0
  • 对于一个新的包括submodule的项目调用以下命令即可 或者 配置 首先是配置帐号信息 ssh -T git@g...
    brownfeng阅读 469评论 0 0
  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,409评论 0 7
  • 仅自学复习之用 date:2019/4/13 . git是什么. github及名词概念. git常用命令. 软件...
    passerbyzjn阅读 123评论 0 0