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文件,已经有各种现成的种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接

在线浏览

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

忽略文件规则

#.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

配置别名

  1. 配置 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."
  1. 配置 git reset HEAD file
#暂存区的修改撤销掉(unstage)
git config --global alias.unstage 'reset HEAD'
  1. 配置 git log -1
#git last 显示最后一次提交信息
git config --global alias.last 'log -1'
  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"

配置文件

  1. 全局配置文件
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
  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 合并失败的文件手动编辑为我们希望的内容,再提交

分支管理基本原则:

  1. 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
  2. 其次,干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,并在master分支发布1.0版本;
  3. 你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

cherry pick 一个分支转移到另一个分支

  1. 你需要另一个分支的所有代码变动,那么就采用合并git merge
  2. 你只需要部分代码变动(某几个提交),这时可以采用 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

总结:

  1. rebase操作可以把本地未push的分叉提交历史整理成直线
  2. 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



  1. 命令 git tag 用于新建一个标签,默认为HEAD,也可以指2定一个commit id
  2. 命令 git tag -a -m “message” 可以指定标签信息
  3. 命令 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)

总结一下:

  1. 命令git push origin 可以推送一个本地标签;
  2. 命令git push origin --tags可以推送全部未推送过的本地标签;
  3. 命令git tag -d 可以删除一个本地标签;
  4. 命令git push origin :refs/tags/可以删除一个远程标签
  5. 命令git tag -a -m 'messages’可以创建一个带附注的标签
  6. 命令git tag -s -m 'messages’可以创建一个带 gpg 签名的标签
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值