git 学习网站推荐 https://learngitbranching.js.org/?locale=zh_CN
git 配置文件
/etc/gitconfig 文件:
包含系统上每一个用户及他们仓库的通用配置。 如果在执行 git config 时带上–system 选项,那么它就会读写该文件中的配置变量。
~/.gitconfig 或 ~/.config/git/config 文件
只针对当前用户。 你可以传递 --global 选项让Git读写此文件,这会对你系统上所有的仓库生效。
当前使用仓库的 Git 目录中的 config 文件(即 .git/config)
针对该仓库。 你可以传递 --local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选
项生效。)
每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量
git config --list --show-origin
查看所有的配置以及它们所在的文件
用户信息
git config --global user.name “name”
git config --global user.email xiaqiu@qq.com
使用了–global 选项,那么该命令只需要运行一次
文本编辑器
git config --global core.editor vscode
检查配置信息
git config --list
git config 获取某一项配置
git config --show-origin user.email 获取配置项的文件夹
获取帮助
git help config
git add -h
Git 基础
repository(仓库),track(开始或停止跟踪文件),stage(暂存),commit(提交),push(推送),pull(拉取)
在已存在目录中初始化仓库
git init
git add 命令来指定所需的文件来进行追踪
git add *.c
git add LICENSE
git commit -m ‘initial project version’
克隆现有的仓库
git clone https://gitee.com/mrxiao_com/gtest.git
git clone https://github.com/libgit2/libgit2 mylibgit 可以额外指定目录
文件的状态变化
git add 会把文件加入到tracked,之后文件修改进入Modified 状态,未被修改进入Unmodified状态,Commit 之后进入Unmodified 状态,Remove进入Untracked状态。
git status 检查当前文件的状态
这说明你现在的工作目录相当干净,已跟踪文件在上次提交后都未被更改过。
项目下创建一个新的 README 文件,之前并不存在这个文件,使用 git status 命令
README 属于Untracked files,未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件,Git 不会自动将之纳入跟踪范围,这样的处理让你不必担心将生成的二进制文件或其它不想被跟踪的文件包含进来
跟踪新文件
在 Changes to be committed 这行下面的,就说明是已暂存状态。如果此时提交,那么该文件在你运行 git add 时的版本将被留存在后续的历史记录中。
暂存已修改的文件
修改了已被跟踪的文件,然后运行 git status 命令,会出现下面的内容
Changes not staged for commit 这行下面的test.md,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。要暂存这次更新,需要运行 git add 命令。
git add 把修改的内容放入暂存区
Changes to be committed 下的暂存区的文件
对暂存区的文件修改
现在test.md 同时出现在暂存区和非暂存区,git 只会暂存git add后面的那个版本,而不是git commit时在工作目录中的当前版本。要继续进行git add
状态简览git status -s
??:新添加的未跟踪文件
A:新添加到暂存区中的文件
M:修改过的文件
MM:文件已修,暂存后又作了修改
忽略文件.gitignore
有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表
git diff 查看已暂存和未暂存的修改
工作目录中当前文件和暂存区域之间的差异,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动
用 git diff --staged 命令。 这条命令将比对已暂存文件与最后一次提交的文件差异
提交更新git commit
在此之前,请务必确认还有什么已修改或新建的文件还没有git add过, 否则提交的时候不会记录这些尚未暂存的变化, 所
以,每次准备提交前,先用 git status 看下,你所需要的文件是不是都已暂存起来了, 然后再运行提交命令git commit:
这样会启动你选择的文本编辑器来输入提交说明。
可以通过 git config --global core.editor命令来修改编辑器
跳过使用暂存区域
git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add
移除文件git rm git commit -a 之后文件就被删除
从暂存区域移除,会出现在“Changes not staged for commit“ 未暂存清单中
移动文件git mv
相当于
mv test.md test1.md
git rm test.md
git add test1.md
查看提交历史git log
git log -p 或–patch 输出每次提交的差异
git log --stat 列出所有被修改过的文件,和被修改的行
git log --pretty=oneline 展示提交历史
git log --pretty=format:“%h - %an, %ar : %s” 定制输出提交历史的格式
撤消操作 git commit --amend
git commit --amend 修改提交的comment 或者添加文件重新提交,编辑后保存会覆盖原来的提交信息
取消暂存的文件
修改test1.md, git add test1.md之后
撤消对文件的修改git checkout
查看远程仓库
git clone 默认的是origin 分支
添加远程仓库
添加一个新的远程 Git 仓库到本地,test branch
git fetch test 从远程仓库获取最新的更新,并将其合并到本地仓库中
从远程仓库中抓取与拉取
git fetch
该git fetch命令将从远程存储库的提交导入到本地存储库中
生成的提交存储为远程分支,而不是我们一直使用的常规本地分支.这使您有机会在将更改集成到项目副本之前查看更改.
推送到远程仓库
git push
想要将 master 分支推送到 origin 服务器时
git push origin master
当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。
查看某个远程仓库
git remote show
远程仓库的重命名与移除
git remote rename
创建标签
轻量标签
另一种给提交打标签的方式是使用轻量标签。 轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字:
后期打标签
对过去的历史未打标签的打标签
git show v0.5 会打印修改的信息
共享标签
git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签到共享服务器上
git push origin --tags 要一次性推送很多标签
删除标签
git tag -d
git push :refs/tags/
git push origin --delete
检出标签
仓库处于“分离头指针(detached HEAD)”的状态
当前的 HEAD 指向的不是某个分支,而是某个提交记录的状态。这种状态下,你可以在不影响任何分支的情况下进行开发,但是你的改动不会被追踪,也不会被提交到任何分支上。
git 别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
Git 分支
- 分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线
- Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照
- 在进行提交操作时,Git 会保存一个提交对象(commit object),提交对象会包含一个指向暂存内容快照的指针
- 该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针
- 首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象, 而由多个分支合并产生的提交对象有多个父对象
添加一个目录gitobject里面存三个对象README test.rb LICENSE,把这个目录和三个文件提交到仓库
查看Git中的对象
分析对象的类型和内容
可以看出生成了三个blob 对象,两个tree 对象,一个commit
添加两次commit
第一次commit:
第二次commit:
也可以通过git log --online --decorate 查看提交信息
分支
分支其实就是一个指针,当前master分支是指向fa527b 就是Snapshot C, 如果从当前创建一个分支testing 的话,testing 和master 一样同时指向fa527b即Snapshot C
Head指针指向当前分支的最新提交,master指针指向主分支的最新提交,分支指针指向某个分支的最新提交。创建分支时,会在当前分支的最新提交上创建一个新的指针,指向新分支的最新提交;提交时,会更新当前分支的指针,指向新提交。
分支创建
分支切换
目前当前分支的情况
commit
在testing 分支commit
分支分叉
切换到test 分支commit
分支合并
现在假如到testing分支修改内容合并到test分支
分支冲突
遇到冲突输入git status 查看冲突的信息,包含合并冲突而有待解决的文件,都会以未合并状态标识出来
//添加 VSCode 为 git difftool 可使用的工具
git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"
git config --global diff.tool vscode
//添加 VSCode 为 git mergetool 可使用的工具
git config --global mergetool.vscode.cmd "code --wait $MERGED"
git config --global merge.tool vscode
//看配置列表,检查是否配置成功
git config --global -l
配置好工具之后
使用图形化工具来解决冲突,运行 git mergetool
会弹出vscode的界面
点击合并的按钮选择合并后提交
撤销commit
git reset --soft HEAD^
git reset --hard HEAD^ 这个会撤销add