Git教程

Git教程

Git简介

Git是一个分布式版本管理系统,是为了更好地管理Linux内核开发而创立的

Git可以在任何时间点,把文档的状态作为更新记录保存起来。因此可以把编辑过的文档复原到以前的状态,也可以显示编辑前后的内容差异。

使用Git管理文件的话,更新的历史会保存在Git

安装Git

Git - Downloads:https://git-scm.com/downloads

配置Git

在使用 git 提交前需要配置用户名和邮箱

配置全局
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
配置当前仓库

移除 --global 参数执行


创建版本库

版本库又叫仓库,Git的仓库分为远程仓库和本地仓库两种

  • 远程仓库:配有专用的服务器,为了多人共享而建立的仓库。
  • 本地仓库:为了方便用户个人使用,在自己的机器上配置的仓库。

平时用手头上的机器在本地仓库上操作就可以了。如果想要公开在本地仓库中修改的内容,把内容上传到远程仓库就可以了。另外,通过远程仓库还可以取得其他人修改的内容。

创建仓库的方式有两种:一种是创建全新的本地仓库,另一种是复制远程仓库。

创建本地仓库

在合适的位置创建一个空目录

mkdir learngit
cd learngit

初始化 git 仓库

git init

image-20220702132548948

文件添加到版本库

新建文件 readme.txt ,填写内容

Git is a version control system.
Git is free software.

用命令 git add 将文件添加到仓库

git add readme.txt

命令 git commit 提交到仓库

git commit -m "readme file"
[master (root-commit) 6bba314] readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

-m 后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

# 提交所以修改文件
git add .
# 提交指定文件
git add src/file1.txt
# 提交多个文件
git add file1.txt file2.txt

只添加已经提交过的文件到暂存区

git add -u
查看修改的文件

提交一个文件后继续修改里面的内容,使用 git status 查看工作区

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

使用 git diff 查看修改的内容

查看工作区和暂存区的差异

git diff readme.txt

查看工作区和版本库的差异

git diff HEAD -- readme.txt

# 查看工作区和版本库的所有文件差异
git diff HEAD
查看修改日志
git log

简化查看

git log --pretty=oneline
版本回退

在git中,HEAD 表示当前版本,也就是当前处在的提交节点,上一个版本是 HEAD^,上上个版本是 HEAD^^,需要回退到多个版本时可以写成 HEAD~3

回退到上上个版本示例

image-20220702134338766
git reset --hard HEAD^^
或
git reset --hard HEAD~2
image-20220702134348771

版本回退之后之前的修改都会放到工作区中

image-20220702134417148

窗口还没有关闭时还可以往前找,找到之前的 commit id

git reset --hard 574b81b 

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

可以看到又恢复了之前的提交

image-20220702134800070

Git版本回退是切换 HEAD 的指向位置,你让HEAD指向哪个版本号,你就把当前版本定位在哪。

image-20220702134935084

可以使用 git reflog 查看每一次的操作记录

想要恢复到某个版本时必须找到对应的 commit id

image-20220702135208358
工作区和暂存区

仓库目录下的文件处在工作区,使用 git add 命令添加的文件时会把文件从工作区添加到暂存区中,git commit 提交修改时把所有暂存区的文件内容提交到当前分支

提交后没有对工作区的内容做任何修改时,这个工作区就是“干净”的

img-ZQmpxk8Q-1656770851325

  • 工作区:仓库目录下的文件
  • 暂存区:暂存区也叫索引(index),使用 git add 添加的修改内容
  • 仓库:git commit 把暂存区的内容提交到仓库
撤销修改

撤销暂存区的修改,重新放回工作区

git reset HEAD
git reset readme.txt
git reset .

撤销工作区与暂存区的修改,丢弃工作区的修改

git checkout -- readme.txt
或
git restore readme.txt

在使用 checkout 撤销时不要忘记带上 --不然会切换到另一个分支

git reset 命令即可以回退版本,也可以把暂存区的修改回退到工作区,使用HEAD 时表示最新的版本

删除文件

清除未跟踪的文件 git clean (慎用)

-d   # 删除未跟踪目录以及目录下的文件,如果目录下包含其他git仓库文件,并不会删除(-dff可以删除)。
-f   # 如果 git cofig 下的 clean.requireForce 为true,那么clean操作需要-f(--force)来强制执行。
-i   # 进入交互模式
-n   # 查看将要被删除的文件,并不实际删除文件
-x   # 可以删除 `.gitignore` 忽略的文件和文件夹
git clean -df

默认情况下不会删除被忽略的文件列表


远程仓库

添加远程仓库

本地仓库和远程仓库进行关联

origin是默认习惯命名

添加一个名为 origin 的仓库,可以修改成其它名称

git remote add origin git@gitlab.xxx.com

推送到远程仓库

git push origin master

首次推送失败时尝试添加一个参数 -u,后面再推送就可以简化了

git push -u origin master

查看远程仓库

git remote -v

删除远程仓库

这里是解除本地和远程仓库的关联关系,并不是正真的删除远程仓库。远程仓库没有任何改动

git remote rm origin

更新名称

git remote rename

git remote rename origin origin2

克隆远程仓库

git clone git@gitlab.xxx.comg

更新仓库分支

查看远程仓库分支的修改内容,拉取远程最新的分支到本地

git fetch

分支管理

不同类别的修改(Bug修复和功能凯峰)要尽量分开提交,方便一会在历史记录中查找特定的修改内容

创建分支

每次提交Git都会把它们串成一条时间线,这条时间线就是一个分支,截止目前只有一条时间线,这个分支叫主分支,即 master 分支

创建 dev 分支并且切换到 dev 分支

git checkout -b dev
或
git switch -c dev

image-20220702151544719

git checkout 命令加上 -b 参数表示创建并切换,等同于

git branch dev
git checkout dev

仅创建分支

git branch dev2

切换分支

git checkout dev
或
git switch dev

查看分支

git branch

查看远程分支

git branch -r

查看所有分支(本地+远程)

git branch -a

image-20220702203118072

修改分支

更新分支名称

git branch -m <old> <new>

合并分支

切换到 master 分支后执行命令

git merge dev

删除分支

git branch -d dev

如果删除没有合并过的分支时会提示上删除失败,强制删除使用 -D

git branch -D dev
删除远程分支
git branch --delete origin dev2
image-20220702204123371

分支管理策略

合并分支时,Git会用 Fast forward 模式

image-20220702153440432

在这种情况下,删除分支后会丢掉分支信息

image-20220702153545741

强制禁用 Fast forward 模式(普通模式合并)会生成一个新的commit,所有需要添加 -m 参数添加描述信息

准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward

image-20220702153846007

合并后的历史有分支,能看出来层级做过合并, Fast forward 合并看不出来曾经做过合并

储存区

开发任务进行到一半时需要紧急修复Bug,此时工作还没有完成没法提交

使用 git stash 存储工作区的修改

git stash

这个时候用 git status 查看工作区是干净的,处理完Bug之后可以回来继续开发

查看储存区
git stash list
恢复储存区

此方式不会删除

git stash apply

此方式在恢复的同时删除

git stash pop

多个 stash 恢复指定内容

git stash apply stash@{0}

删除储存区

git stash drop
# 删除指定储存区
git stash drop stash@{1}
清空储存区

此操作会清除所有内容,操作前注意有没有重要信息**(慎用)**

git stash clear

复制提交

将一个提交从其它分支复制到当前分支

git cherry-pinck <commit>

多人协作

推送分支

将本地提交推送到远程分支,推送时需要指定本地分支

git push origin dev

不是所有分支都要推送到远程仓库

  • master 分支:主分支需要时刻同步
  • dev分支:所有成员在开发分支上面工作,也需要时刻同步
  • bug 分支:只用于本地修复bug,可以不用推送到远程
  • feature分支:取决于其他开发人员是否需要和你合作

每次推送前都要拉取一下最新代码到本地

git pull origin dev
或
git pull

本地分支推送远程仓库时使用其它名字

git push origin dev:dev2

rebase

rebase操作可以把本地未push的分叉提交历史整理成直线

使我们在查看历史提交的变化时更容易

git rebase master

针对变基前当前分支已经推送到远程后就不能直接推送了,提示需要先拉取最新代码再推送,此时能保证此分支只是自己在修改,且只是把master 的最新代码合过来了,这个时候需要强制推送覆盖远程即可

git push origin -f dev

Merge与rebase

git rebase 简单说就是将你的commit提前,保证在你rebase的这一时刻,你的代码是最新的。否则在你修改完本地代码push到远程库时会出现冲突(因为在你修改的时候,别人也在修改,你两的修改出现的冲突,也就是你两个的文件出现了不一致的地方)。

推送本地所有分支到仓库

git push --all origin

改写提交

git commit --amend

使用场景

  • 添加最近提交漏掉的文件
  • 修改最近提交的注释

推送远程仓库时开发一个功能已经在本地提交过多次,查看历史记录可以看到多个提交内容,这些都属于一个功能,推送到远程仓库之前可以合并成一个提交节点

第一步:使用git reset 到开发功能的第一个节点

git reset <commit>

第二部:将工作区的修改添加到暂存区

git add .

第三步:改写提交

git commit --amend

第四步:强制推送远程仓库(-f 慎用)

git push origin -f dev

revert

取消某一次提交的内容

git revert HEAD
或
git revert <commit id>
或
git revert HEAD~3

取消连续的提交

git revert HEAD, HEAD^, HEAD~2
取消最近连续的三次提交

方式1

左开右闭区间:(x…y),不好含x,包含y

git revert HEAD~3...HEAD

方式2

git revert 3867949...e075687
image-20220702212654931

可以看到每一次取消都作为一个新的commit进行提交

reset与revert

  • reset:回溯到指定提交的版本,指定版本之后的提交都重置了
  • revert:删除指定提交的内容,提交前后的操作都不受影响

修改已经提交过的注释

方式一

git commit --amend
image-20220702214818700

修改注释信息

image-20220702214847892

查看提交日志

image-20220702214926218

方式二

git rebase -i HEAD~2

将需要修改的提交从pick 修改为 edit

(img-tg6sL0RR-1656770851327

继续使用git commit --amend 修改提交信息,修改好之后执行 git rebase --continue

image-20220702215207073

标签管理

发布一个版本时常常会打一个标签 tag,标签是版本库的一个快照,恢复到某个标签就是恢复到指定的某个版本

标签起到了一个别名的作用,标签名称可以很快的找到指定的版本

创建标签

git tag v1.0

默认情况下是在当前分支的最新提交上创建的

对指定提交节点打标签

首先查看历史记录的日志

git log --pretty=oneline --abbrev-commit
image-20220702170428032

找到对应的commit id

git tag v0.9 3c88b34
image-20220702170539971

查看标签

查看所有标签

git tag

标签使用字母进行排序

image-20220702170611640

标签数量多时可以查看指定标签

git tag -l "v1.0*"

查看标签信息

git show v0.9

标签说明

创建后再手动输入批注信息

git tag -a <name>

创建标签时添加说明文字

git tag -a v1.1 -m "version 1.1"
image-20220702171935196

删除标签

git tag -d v0.9

删除多个标签

git tag -d v0.9 v1.2

推送标签

git push origin v1.0
image-20220702171321213

推送所有未推送到远程的标签

git push origin --tags

删除远程标签

git push origin :refs/tags/v1.1

忽略文件

github:https://github.com/github/gitignore

一个无法添加的文件可以被 .gitignore 忽略了,可以使用 -f 强制添加到git

git add -f test.txt

有可能是.gitignore 文件写的有问题,使用检查命令

git check-ignore -v test.txt
或
# 注意:存在标签和仓库同名时都会删除
git push --delete origin <tagname>

注意事项

Idea控制台乱码

Idea中,操作terminal控制台,使用git log查看日志时,出现如下乱码

<94>

原因

Idea默认使用的是cmd.exe

解决方案

  • 临时:在使用控制台前输入命令:set LESSCHARSET=utf-8修改字符编码为UTF-8,再次使用git指令
  • 永久:idea设置:file=>setting=>Tools=>Terminal=>Environment Variables=>set LESSCHARSET=utf-8

参考文档

  1. Git教程 - 廖雪峰的官方网站 (liaoxuefeng.com)
  2. Git索引 | 猴子都能懂的GIT入门| 贝格乐(Backlog)

优化操作

美化log

添加配置

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"

使用git lg查看git日志

git lg
image-20220702121740614

Git图形界面工具

  • sourcetree:https://www.sourcetreeapp.com/

Git命令速查表

Git Cheat Sheet

git-cheat-sheet:https://liaoxuefeng.gitee.io/resource.liaoxuefeng.com/git/git-cheat-sheet.pdf

GIt操作指令

GIt操作指令

Git常用命令速查表

Git常用命令速查表

Git速查

GIt速查
  • 本文作者: lightsolid
  • 版权声明: 本文著作权归作者所有,转载请注明出处!

部分内容及图片收集于网络,如有侵权,请联系我们删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值