Git笔记——筑梦之路
Git 笔记
配置用户信息
#全局的配置
git config --global user.name "李老师"
git config --global user.email li@csdn.net
#特定项目
git config user.name "李老师"
git config user.email li@csdn.net
#检查配置
git config user.name
#git命令显示有颜色配置
git config --global color.ui true
#验证
git status
有些时候,你必须把某些文件放到 Git 工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件等等,每次git status都会显示Untracked files ...,这种情况下,就可以实用忽略特殊文件 .gitignore 来很方便的解决这个问题。
首先我们在 Git 工作区的根目录下创建一个特殊的 .gitignore文件,然后把要忽略的文件名填进去,Git 在每次进行提交的时候就会自动忽略这些文件。
忽略文件的规则
日常使用中,我们一般不需要从头开始编辑.gitignore文件,已经有各种现成的种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
忽略文件规则
#.gitignore文件示例
# Windows:
Thumbs.db
ehthumbs.db
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
# My configurations:
db.ini
deploy_key_rsa
最后一步就是把.gitignore也提交到 Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean。
有些时候,你想添加一个文件到 Git,但发现添加不了,原因是这个文件被.gitignore忽略了
#强制添加被忽略的文件
##添加失败
git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.
#强制添加
git add -f App.class
#检查忽略规则git check-ignore
git check-ignore -v App.class
#添加例外规则
# 排除所有.开头的隐藏文件:
.*
# 排除所有.class文件:
*.class
# 不排除.gitignore和App.class:
!.gitignore
!App.class
配置别名
- 配置 git status/commit/checkout/branch
#配置git status 别名 git st
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
#使用示例
git ci -m "sth."
- 配置 git reset HEAD file
#暂存区的修改撤销掉(unstage)
git config --global alias.unstage 'reset HEAD'
- 配置 git log -1
#git last 显示最后一次提交信息
git config --global alias.last 'log -1'
- 配置 git lg
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置文件
- 全局配置文件
cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@codechina.csdn.net:codechina/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1
- 用户配置文件
cat .gitconfig
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com
[color]
ui = true
操作命令
#初始化仓库
git init
#查看初始化后的仓库.git
ls -alh
#克隆现有仓库
git clone https://codechina.csdn.net/codechina/help-docs
#自定义本地仓库名称
git clone https://codechina.csdn.net/codechina/help-docs mydocs
#Git 支持多种数据传输协议。 上面的例子使用的是 https:// 协议,不过你也可以使用 git:// 协议或者使用 SSH 传输协议,比如 user@server:path/to/repo.git
#把文件添加到仓库
git add readme.md
#把文件提交到仓库
git commit -m "wrote a readme file"
#-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录
#修改文件后检查
git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
#git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
#比较暂存区修改的内容
git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
(END)
#git diff顾名思义就是查看 difference,显示的格式正是 Unix 通用的 diff 格式,可以从上面的输出看到,我们在第一行添加了一个distributed单词
#查看commit记录
git log
commit e55063ad7f97dd979e4f94e12d2bc44a25a0fd55 (HEAD -> master)
Author: Miykael_xxm <xiongjiamu@gmail.com>
Date: Fri Nov 27 16:08:04 2020 +0800
add distributed
commit 50ed06bd62fd34afbe501e6f2a4af73ccbe187f0
Author: Miykael_xxm <xiongjiamu@gmail.com>
Date: Fri Nov 27 16:06:11 2020 +0800
wrote a readme file
(END)
#git log命令显示从最近到最远的提交日志,我们可以看到2次提交,最近的一次是add distributed,最早的一次是wrote a readme file
#一行显示
git log --pretty=oneline
e55063ad7f97dd979e4f94e12d2bc44a25a0fd55 (HEAD -> master) add distributed
50ed06bd62fd34afbe501e6f2a4af73ccbe187f0 wrote a readme file
(END)
#查看提交时间线 git lg 自定义配置
git lg
#版本回退
#上一个版本 HEAD^
#上上一个版本 HEAD^^
#上100个版本 HEAD~100
git reset --hard HEAD^
#检查
cat readme.md
#版本恢复
git reflog #查看记录
50ed06b (HEAD -> master) HEAD@{0}: reset: moving to HEAD~
e55063a HEAD@{1}: reset: moving to HEAD
e55063a HEAD@{2}: commit: add distributed
50ed06b (HEAD -> master) HEAD@{3}: commit (initial): wrote a readme file
ESC
#恢复版本
git reset --hard e55063a
#漏掉文件没提交 提交信息写错处理
git commit --amend
#这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。
###举例 你提交后发现忘记了暂存某些需要的修改
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
#最终你只会有一个提交——第二次提交将代替第一次提交的结果
#当你在修补最后的提交时,并不是通过用改进后的提交 原位替换 掉旧有提交的方式来修复的, 理解这一点非常重要。从效果上来说,就像是旧有的提交从未存在过一样,它并不会出现在仓库的历史中。
#修补提交最明显的价值是可以稍微改进你最后的提交,而不会让“啊,忘了添加一个文件”或者 “小修补,修正笔误”这种提交信息弄乱你的仓库历史。
#取消暂存
git reset HEAD readme.txt
#git reset 确实是个危险的命令,如果加上了 --hard 选项则更是如此。 然而在上述场景中,工作目录中的文件尚未修改,因此相对安全一些
#取消文件的修改
git checkout -- readme.txt
#请务必记得 git checkout -- <file> 是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令
#删除文件的操作
#1.版本库中删除
git rm readme.md
git commit -m "remove test.txt"
#2.误删恢复
git checkout -- readme.md
####总结
'''场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,可以用命令git reset --hard commit_id,不过前提是没有推送到远程库'''
#分支管理
#创建分支 -b参数表示创建并切换
git checkout -b dev
#查看分支 git branch命令会列出所有分支,当前分支前面会标一个*号
git branch
#切换分支
git checkout master
#合并分支
git merge dev
Updating 599dbdb..4aac6c7
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
#Fast-forward信息,Git 告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
#删除分支
git branch -d dev
#switch 切换分支 创建并切换 新版支持
git switch -c dev
#切换master
git switch master
##合并分支时,如果可能,Git 会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
#如果要强制禁用Fast forward模式,Git 就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
git merge --no-ff -m "merge with no-ff" dev
#本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
#查看分支历史
git log --graph --pretty=oneline --abbrev-commit
#解决合并过程中的冲突
#当 git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
#解决冲突就是把 git 合并失败的文件手动编辑为我们希望的内容,再提交
分支管理基本原则:
- 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
- 其次,干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,并在master分支发布1.0版本;
- 你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
cherry pick 一个分支转移到另一个分支
- 你需要另一个分支的所有代码变动,那么就采用合并git merge
- 你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick
git cherry-pick命令的作用,就是将指定的提交commit应用于其他分支
git cherry-pick
git cherry-pick命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交
git cherry-pick feature
Cherry pick 支持一次转移多个提交
git cherry-pick
转移一系列的连续提交,可以使用下面的简便语法
git cherry-pick A…B
上面的命令可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。
注意,使用上面的命令,提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的语法
git cherry-pick A^…B
Cherry pick 也支持转移另一个代码库的提交,方法是先将该库加为远程仓库。
#添加远程仓库
git remote add target git://gitUrl
#抓取到本地
git fetch target
#检查一下要从远程仓库转移的提交,获取它的哈希值
git log target/master
#使用git cherry-pick命令转移提交
git cherry-pick <commitHash>
git多人协作
#获取最新的远程仓库
git pull
#把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了
git rebase
总结:
- rebase操作可以把本地未push的分叉提交历史整理成直线
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
git标签
注意,标签不是按时间顺序列出,而是按字母排序的
#切换分支
git branch
git checkout master
git tag v1.0
git tag
#指定某次提交打标签
git tag v0.9 fb8b190
#查看标签信息
git show v0.9
#创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a v0.1 -m "version 0.1 released" 187f963
#查看说明
git show v0.1
#删除tag
git tag -d v0.1
#推送tag
git push origin v1.0
#一次性推送所有tag
git push origin --tags
#删除已经推送的tag
git tag -d remove
#删除远程的tag
git push origin :refs/tags/remove
- 命令 git tag 用于新建一个标签,默认为HEAD,也可以指2定一个commit id
- 命令 git tag -a -m “message” 可以指定标签信息
- 命令 git tag 可以查看所有标签
其实,在上面介绍到的标签都只是 git 标签中的一种,叫轻量级的标签(lightweight),轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。 另外一种 git 标签叫含附注的标签(annotated),附注标签实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
#创建喊附注类型的tag
git tag -a v1.1 -m 'my version 1.1'
# -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。
#查看
git show v1.1
# GPG 来签署标签
git tag -s v1.2 -m 'my signed 1.2 tag'
#查看
git show v1.2
tag v1.2
Tagger: Miykael_xxm <xiongjiamu@gmail.com>
Date: Tue Dec 22 18:06:23 2020 +0800
my signed 1.2 tag
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEHOy0Yk8t45g6ChHzlteTkFPbAvoFAl/prh8ACgkQlteTkFPb
AvpPDRAAk1j6zhHCpGfDR9e+0mmm0UTd2DxkMrgNDfnOur4Lap6vRBDGo2IOHisq
PFOhvTWEEKVVyDqeNgKm7ABu8IJvHLEgG2jSlsTEB5CpNzgkeZh84bfH3eKUW/o2
H/Gtn4nR1f7r+BfVVHAnfXimt263RNTnIa3nePGItwM+cB5eV9WRsS2zIhEd/4Ab
qlMKvEBD15+s567RYVN3q89Greur2jA+xVf0uYRLLl1iOzmtMDh6fMUK/i76oFa+
OJpfDog+otmg4jUvahG3hWUZBaZ6dDQ447SKT3siuoF+lZNPE4TSSKDyhe+BVD1o
19Xjn3+gYVvSlb/lPJ2i3x/tZbWX0wntFCb+CKlguryDg7lcDvl0L9cWMHKNTzGP
E1SGc2DMx4asXN6EbceEVZABAk79IWz73+1XU3CWHKhBrjWeWUDsshljO3oGI4Zt
ZvGVkATEvzZN+LC+AOxTDsL8KzeSncb38hWcB6IyRG8hLEVu3EjnvmZfMkwdRFad
n+xHzvNuiPAcAOLYhOUTWsdp2rmr5ZLkX4V+XFPZbLvAwoy+ngU/FVsaT2nWNZWf
JF6t6ZbMeKp+hzh+aZoUhh6ZTKazmPYg5b2AxIRhWEowXrKCYvWCWrv1NYp0M4xz
D0IJmmuL5L+noDi7U8crrnan/Sn8hD2veeYaFlypchZR2OKsPC8=
=fbHC
-----END PGP SIGNATURE-----
commit b6b8fb1fe3f11c1120840dc9237b7453fa882a62 (HEAD -> master, tag: v1.2, origin/master)
Author: Miykael_xxm <xiongjiamu@gmail.com>
Date: Tue Dec 22 14:35:20 2020 +0800
signed tag
diff --git a/LICENSE b/LICENSE
index 213a814..30c750f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1 +1,2 @@
This is a LICENSE file.
+With a signed tag.
(END)
总结一下:
- 命令git push origin 可以推送一个本地标签;
- 命令git push origin --tags可以推送全部未推送过的本地标签;
- 命令git tag -d 可以删除一个本地标签;
- 命令git push origin :refs/tags/可以删除一个远程标签
- 命令git tag -a -m 'messages’可以创建一个带附注的标签
- 命令git tag -s -m 'messages’可以创建一个带 gpg 签名的标签
相关文章
- SpringCloud笔记:配置Eurake注册中心与高可用集群
- Splay平衡树 学习笔记
- 隔板法 学习笔记
- git使用教程之创建本地库并关联远程库(笔记整理篇一)
- Git笔记
- Git的下载方法+版本控制器以及SVN与GIT的区别
- c++之数据处理笔记(一)
- 《CLR via C#》笔记:第5部分 线程处理(3)(完结)
- 数据结构与算法笔记
- GIT详细基础笔记(1)
- GIT详细笔记(2)
- Git笔记——基本功能(下)
- Git删除本地分支_idea删除git分支
- git拉取代码如何解决冲突_Git工具-git pull拉取代码时冲突的解决办法[通俗易懂]
- 如何自建一个git服务器,搭建Git服务器,真的很简单
- 贝塞尔方程与贝塞尔函数学习笔记
- 【高效笔记】云开发者HCCDA-Cloud Euler认证快速通关解析
- Vue学习笔记之ElementUI的区间设置
- Git命令——学习笔记1
- 生信技能树数据挖掘笔记
- HTML&CSS精选笔记_列表与超链接详解编程语言
- Spring AOP 简单入门笔记详解编程语言
- Git与Linux结合:创造无限可能(git和linux)
- 学习Linux下的Git版本控制(linux上使用git)
- 使用Git在Linux系统中管理代码(linux中的git命令)
- 使用Git来升级你的Linux系统(git升级linux)
- Git实现Linux内核快速下载(git下载linux内核)
- 极速学习:Linux下使用Git的基础知识(linux如何使用git)
- 轻松玩转Git:Linux环境下的版本管理(linux下使用git)
- 让Oracle支持Git(oracle中的git)
- 开创自动化Redis集群Git部署(redis集群git)
- python笔记(2)
- js中回调函数的学习笔记