Ubuntu系统使用快速入门实践(八)—— git 命令使用

发布于:2024-06-24 ⋅ 阅读:(15) ⋅ 点赞:(0)

Ubuntu系统使用快速入门实践系列文章

下面是Ubuntu系统使用系列文章的总链接,本人发表这个系列的文章链接均收录于此

Ubuntu系统使用快速入门实践系列文章总链接


下面是专栏地址:

Ubuntu系统使用快速入门实践系列文章专栏



前言

Ubuntu是一个以桌面应用为主的Linux发行版操作系统,也是大多数人第一个接触到的Linux系统,尤其是从事理工科研究工作的人,这个系列的文章主要讲述如何使用Ubuntu系统,完成日常的学习、科研以及工作


Ubuntu系统使用快速入门实践(八)—— git 命令使用

安装git

终端使用以下命令:

sudo apt install git

修改host文件来访问GitHub

参考:修改host文件来访问GitHub

说明

国内无法访问GitHub的问题除了用某工具访问,还可以通过host文件来达到效果,缺点就是需要经常更新ip地址。

git clone 速度慢的问题

参考:

解决git clone 速度慢的问题

git clone特别慢是因为 github.global.ssl.fastly.net 域名被限制了。

只要找到这个域名对应的ip地址,然后在hosts文件中加上ip–>域名的映射,刷新DNS缓存便可。

一、查询ip地址

通过以下网址来查询

http://ip.tool.chinaz.com/

https://www.ipip.net/

https://www.ipaddress.com/

查询下列三个网址的IP

github.com
assets-cdn.github.com
github.global.ssl.fastly.net

https://www.ipaddress.com/ 的查询结果如下

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二、修改host文件

host文件在

(Windows系统)

C:\Windows\System32\drivers\etc

(linux系统)

/etc/hosts

打开host文件之前先修改权限

方法:

新开一个终端窗口进入路径/etc,查看hosts的权限

ls -l hosts

可以看到,其的拥有者和所属组为root,对于其他用户只对其有只读权限,所以在当前的用户下无法对其进行写的操作,本人是采用先将本用户改为其拥有者,对其修改后再将拥有者改回。

先修改所拥有者 sudo chown yangtsejin hosts

在这里插入图片描述

再在/ect目录下打开hosts,添加数据行,添加完后将拥有者改回root

在这里插入图片描述

如此处添加行

20.205.243.166       github.com
185.199.111.153    assets-cdn.github.com
182.50.139.56        github.global.ssl.fastly.net

在这里插入图片描述

有时候用git clone下载文件很慢,要将IP改为国外的IP,再用梯子下载

#github start

151.101.1.194 github.global.ssl.fastly.net
151.101.65.194 github.global.ssl.fastly.net
151.101.129.194 github.global.ssl.fastly.net
151.101.193.194 github.global.ssl.fastly.net

# 下面的截图IP地址有误,以这里为准
140.82.114.3 github.com

185.199.108.153 assets-cdn.github.com
185.199.109.153 assets-cdn.github.com
185.199.111.153 assets-cdn.github.com

# github end

在这里插入图片描述

三、更新dns缓存

参考:

ubuntu 20.04清除DNS缓存

ubuntu刷新自己dns

Windows中用cmd(以管理员身份)输入

ipconfig/flushdns

将DNS设置为 8.8.8.8,为谷歌的服务器

在Ubuntu中使用命令

# 我的Ubuntu没有这个命令
sudo /etc/init.d/dns-clean start

# 或者
sudo apt-get install nscd
sudo /etc/init.d/nscd restart

# 或者暴力重启刷新DNS
sudo /etc/init.d/networking restart

# (推荐)等待几秒钟,清除DNS缓存的命令就会执行完毕。
sudo systemd-resolve --flush-caches
#或者
sudo systemctl restart systemd-resolved

git使用

参考:

Ubuntu20.04下使用git上传本地项目

【git】git@github.com: Permission denied (publickey).报错问题

Ubuntu系统下如何提交代码到GitHub

如何使用git上传文件到Github远程仓库(完整详细流程)

git文档:https://git-scm.com/book/zh/v2

git流程

在这里插入图片描述

测试ssh

在终端输入

ssh -T git@github.com

显示:

git@github.com: Permission denied (publickey).

在这里插入图片描述

这时候需要建立公钥。

建立公钥

如果要连接github,那么每一台设备要单独设置一个密钥

在github上按照下图点击,找到如下界面:

1)右上角找到并点击settings

在这里插入图片描述

2)左边找到并点击SSH and GPG keys,添加 SSH key

在这里插入图片描述

出现如下界面

在这里插入图片描述

3)在该界面找到 New SSH Key,并点击

在这里插入图片描述

4)返回终端输入

ssh-keygen -C "xx@xx.com" -f ~/.ssh/github

邮箱为自己创建github时用的邮箱,按两次Enter,出现如下代码:

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/jin/.ssh/github
Your public key has been saved in /home/jin/.ssh/github.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxx@gmail.com

5)在终端输入命令

cat ~/.ssh/github.pub

出现公钥,将公钥复制到第3)步的key里面,title随便写个名字即可,然后点击Add SSH Key。

在这里插入图片描述

在这里插入图片描述

6)在终端输入命令

ssh -T git@github.com

出现以下代码意味着该步骤完成。

Hi wwtx! You've successfully authenticated, but GitHub does not provide shell access.

如果添加完密钥后还是出现无法连接的情况

在这里插入图片描述

因为不能用SSH来输入 ssh -T git@github.com 命令,要用主机先连接才能使用

github上建立新的仓库

点击Repositories,然后点击New新建一个仓库

在这里插入图片描述

点击进入建立的仓库中,界面如下:

在这里插入图片描述

建立本地仓库

1.在自己的Ubuntu系统下建立自己的本地仓库(文件夹),可以用ll命令查看生成的.git初始化文件

git init
ll

2.创建自己需要提交的文档,例如

echo "# test" >> test.txt

3.查看文件状态

git status

显示都还未提交

在这里插入图片描述

4.追踪文件

git add test.txt
#或者
git add . # 把当前文件夹下的所有文件加入提交的cache

git rm --cached test.txt # 取消追踪文件

在这里插入图片描述

5.提交修改的文件到本地仓库

# 添加文件备注
git commit -m "注释"
git commit -m "first blog"

这时提示我要输入自己的信息

在这里插入图片描述

配置完成后可以正常提交

在这里插入图片描述

提交到github

git push的一般形式为

git push <远程主机名> <本地分支名> <远程分支名> 

提交到github仓库

法1:HTTP方式

因为本地的分支默认为master,如果是推送到main分支,则

git推送代码到main分支

# 切换到main分支并进入
git checkout -b main

#删除本地的master分支
git branch -D master 

# 推送时用下面的命令
git push -u origin main

如果不用切换到main分支,则如下

git remote add <名称> <地址>
# 例如:(建立的仓库中有引导的命令行)
git remote add origin https://github.com/Aidensjl/file.git
git branch -M master
git push -u origin master

# 如果提示需要输入密码,则用下面的命令
# xxx换为你的令牌
git remote set-url origin https://xxx@github.com/Aidensjl/file.git
git push -u origin master
法2:SSH方式

参考:

使用SSH建立Git 远程仓库和本地库连接

  • 法1是使用自定义使用时长的token上传代码
  • 法2是保存github的秘钥后,可以直接push代码

使用SSH方式方便很多,因为HTTPS方式每次新建仓库都需要用户验证,输入远程的密钥。

SSH密钥添加到本地电脑,并且验证成功后,复制仓库中的SSH地址,即可直接提交,如下所示

git remote add origin git@github.com:yangtseJin/FAST_LIO-Study.git
git push -u origin main
出现错误

这里提交时,需要输入账号密码,然后出现错误

在这里插入图片描述

问题解决

出现的原因是自从 21 年 8 月 13 后不再支持用户名密码的方式验证了,需要创建个人访问令牌(personal access token)。

在github主页的用户setting中选择Developer setting 生成personal access tokens,选项全选,生成的令牌记得保存,只会出现这一次!!!

在这里插入图片描述

修改现有的url

git remote set-url origin  https://<your_token>@github.com/<USERNAME>/<REPO>.git
# 将<your_token>换成你自己得到的令牌。<USERNAME>是你自己github的用户名,<REPO>是你的项目名称
# 例如:xxx换为你的令牌
# 通常Token的有效期最多是30天,也就是说登录成功后,30天内做的任何提交到远程都不需要再次登录,但是可以自己设置有效期,最多
git remote set-url origin https://xxx@github.com/Aidensjl/file.git
# 最后
git push -u origin master

设置有效时间为90天

在这里插入图片描述

下面的所有选项全部勾选,其实勾选 repo 和 workflow即可

在这里插入图片描述

设置完成

在这里插入图片描述

然后设置 url,完成后即可正常push代码

在这里插入图片描述

修改后再次提交

参考:

Git Commit基础知识

一文教你如何设置git commit模板规范

代码已经提交过了,修改后需要再次提交,按如下命令

git add .
git status
git commit -m "modified"
git push

提交完成后,如果您意识到提交消息不正确或有些文件丢失,可以修改先前的提交。

git commit --amend -m "New commit message"

此命令允许您修改先前的提交消息或向先前的提交添加文件。新更改将添加到先前的提交中,并进行更新。

直接在文件中修改即可

在这里插入图片描述

Git提交命令使用摘要

以下是Git提交命令使用摘要:

  • git commit -m "提交信息":创建一个带有提交信息的新提交。
  • git add .:将所有文件添加到暂存区。
  • git add <文件名>:将指定文件添加到暂存区。
  • git branch <分支名>:创建新分支。
  • git checkout <分支名>:切换到指定分支。
  • git commit --amend -m "新的提交信息":修改先前提交的提交信息。
  • GIT_AUTHOR_DATE="YYYY-MM-DD HH:MM:SS TZ" GIT_COMMITTER_DATE="YYYY-MM-DD HH:MM:SS TZ" git commit -m "提交信息":创建一个带有特定日期的提交。
  • git add -p <文件名>:提交对文件的部分更改。

提交大文件

参考:

解决github上传大文件超过100M的问题

【Git】保姆级教程:如何在 GitHub 上传大文件(≥100M)?(含自己的操作流程)

轻松上传超过100M的文件至GitHub

Git LFS的下载安装

  • 官网:https://git-lfs.github.com/
  • mac利用brew来下载:brew install git-lfs
  • linux利用apt-get来下载:apt-get install git-lfs
  • Windows利用scoop来下载: scoop install git-lfs

输入下面的命令,检查 Git LFS 是否安装好了,并初始化

git lfs install

在这里插入图片描述

这表示 Git LFS 已成功安装和初始化。

现在,你的系统已安装 Git LFS,并可以在 Git 仓库中使用 Git LFS 来管理大文件。你可以使用其他 Git LFS 命令来跟踪大文件、添加文件到 Git LFS 管理、推送和拉取文件等操作。请确保你的 Git 服务器和其他协作者也已正确配置和支持 Git LFS,以便顺利地使用 Git LFS 功能。

如果已经输入了上面的语句,再次输入会出现下图结果:

在这里插入图片描述

跟踪一下你要上传(push)的文件或指定文件类型

git lfs track "*.pth"

这将告诉 Git LFS 跟踪所有扩展名为 .pth 的文件,并使用 Git LFS 进行管理。

完成上述步骤后,Git LFS 将会跟踪并管理所有匹配 .pth 扩展名的文件。在提交、推送和拉取时,Git LFS 会相应地处理这些大文件,确保它们被正确地上传和下载。

添加.gitattributes
.gitattributes 是 Git 的一个配置文件,用于指定特定文件或文件类型的属性和处理方式。它可以用于定义 Git 在处理文件时的行为,例如在版本控制、合并和检出文件时的属性设置。

.gitattributes 文件的作用包括:

  • 文件属性设置:你可以使用 .gitattributes 文件指定特定文件或文件类型的属性。例如,你可以定义某个文件应被视为二进制文件,或者使用 Git LFS 进行管理。
  • 文本处理:.gitattributes 文件可以用于指定文本文件的行尾格式(如 CRLF 或 LF),这对于跨平台协作很有用。你可以设置文件的 text 或 binary 属性,控制 Git 是否将其视为文本文件。
  • 合并策略:通过 .gitattributes 文件,你可以为不同类型的文件指定合并策略,以决定在合并分支时如何处理这些文件的冲突。
  • 过滤和清理:.gitattributes 文件允许你配置 Git 过滤器,以在提交或检出文件时执行自定义的过滤和清理操作。这对于对文件进行自动处理、格式转换或敏感信息过滤很有用。

.gitattributes 文件的语法是基于模式匹配的,你可以使用通配符、正则表达式和文件路径模式来匹配文件,并为其指定相应的属性和操作。

请注意,.gitattributes 文件需要添加到 Git 仓库,并确保其他协作者在克隆或拉取仓库时能够正确应用这些属性规则。

只有先把".gitattributes"传上去,才可以上传大文件。在命令行终端中,使用 Git 命令将 .gitattributes 文件添加到仓库并提交:

git add .gitattributes
git commit -m "submit file"
git push -u origin master

回车

PS:最终上传完毕后会在GitHub上看到:

在这里插入图片描述

上传完毕后,开始上传大文件。

然后添加要上传(push)的文件并提交(commit),方法和之前一样

如果提交时显示下面的错误

在这里插入图片描述

则将命令复制一遍输入即可

git config lfs.https://github.com/yangtseJin/Matlab-GUI-Projects.git/info/lfs.locksverify false

上传空文件夹

参考:

git 上传空文件夹

空文件夹默认不会上传到远程仓库。如果想在远程仓库中保存一个空文件夹作为占位符的话,可以在空文件中创建一个.gitkeep 文件即可

touch .gitkeep

说白了就是再创建一个空文件,使得你的文件夹不是空文件夹了,这是个取巧的做法。

更合理的做法是:在空文件夹下新建.gitignore文件,文件内容:

# Ignore everything in this directory
*
# Except this file
!.gitignore

这样一来,这就才是名副其实的空文件夹,除了.gitignore的其它文件都会被忽略掉!

撤销add和commit

参考:

撤销 git add 和 git commit 操作

  1. 撤销 git add

如果是撤销所有的已经add的文件:

git reset HEAD -- .

如果是撤销某个文件或文件夹:

git reset HEAD -- filename
  1. 撤销 git commit
git reset --soft HEAD^

HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2

其他参数解析:

  • –soft
    不删除工作空间改动代码,撤销commit,不撤销git add .
  • –mixed
    不删除工作空间改动代码,撤销commit,并且撤销git add .
    这个为默认参数, git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
  • –hard
    删除工作空间改动代码,撤销commit,并且撤销git add .

补充:如果该仓库到目前为止只有commit过一次代码,则会报错:

$ git reset HEAD^
fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

更换远程仓库

参考:

git通过命令更换远程仓库地址-----和更换地址后对项目进行操作显示无权限问题

方法一 : 通过命令直接修改远程仓库地址

git remote 查看所有远程仓库
git remote xxx 查看指定远程仓库地址
git remote set-url origin 你新的远程仓库地址

方法二: 先删除在添加你的远程仓库

git remote rm origin
git remote add origin 你的新远程仓库地址

方法三: 直接修改你本地的.git文件

这里需要注意的问题是需要进入你的项目目录中
例如:你的项目名为test,那么你就进入test文件夹。
.git文件是隐藏文件你需要显示隐藏文件才能看见

其他操作

查看历史提交记录

git log

在这里插入图片描述

查看当前有哪些分支

git branch

在这里插入图片描述

注:没有创建分支的情况下,只有master

添加分支

git checkout -b  分支名称 
git branch –d  分支名称   #删除分支

注:回到主分支 git checkout master

回到历史的某个版本

git check commit  id编号

注:id 可以用git log 查找

把文件push到网站上

git push origin master

注:一般在git add 及 git commit -m ‘xx’ 之后

列出远程分支

git remote
git remote -v     #列出详细信息
git remote add origin https://github.com/wkslearner/scikit_learn.git

在这里插入图片描述

把缓存区数据添加到远程

参考:

Git入门——Git push 常见用法

git push -u origin sk_learn

把缓存区数据提交到仓库

git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名>,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,第一个master是本地分支名,第二个master是远程分支名。

  • git push origin master

如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建

  • git push origin :refs/for/master

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin —delete master

  • git push origin

如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支

  • git push

如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用 git branch -r ,查看远程的分支名

常用举例

git push <本地分支的名字> : <远程库的名字>

git push 肯定是推送

origin : 是远程的库的名字

HEAD: 是一个特别的指针,它是一个指向你正在工作的本地分支的指针,可以把它当做本地分支的别名,git这样就可以知道你工作在哪个分支

refs/for :意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的

refs/heads 不需要通过git status命令可以查看当前工作区和暂存区文件的状态。

常用命令

git status //状态查看
git add . //追踪
git config -l //配置查看
git config --unset XXX //取消某些配置
git commit -m "xxx" // 提交
git push -u 名称 分支 //上传
git log --oneline --decorate --graph --all //查看分支结构
git branch -d xxx //删除本地分支
git checkout xxx //切换分支
git checkout -b xxx //新建本地分支
git merge --no-ff xxx //不采用快照ff模式,合并到xxx位置
git pull --rebase //将远端仓库的修改和本地的修改进行合并形成最新的提交
git push origin xxx //建好本地分支后,在输入该指令建立远程分支
git push origin :xxx //删除远程分支但是不会删除本地分支

多人合作

如果是在另外电脑向同一个远程仓库进行提交(可以看作多人合作)

不是直接git init,而是将远程仓库进行git clone 下来进行修改,然后进行提交就可以

不然会出现无法提交,或者需要git pull等问题

回到原本的仓库,由于远程仓库已经被修改,需要 git pull 拉取更改后的仓库文件,然后进行后续修改操作

下载指定分支tags的代码

参考:

GitHub下载克隆clone指定的分支tags代码

解决方法:
命令:

git clone -b [tags标签] [git地址]

例如:

git clone -b v2.0.2 https://github.com/spring-projects/spring-retry.git

若想对克隆后的项目重命名则可执行以下命令

git clone -b [tags标签] [git地址] [重命名]

例如:

git clone -b v2.0.2 https://github.com/spring-projects/spring-retry.git spring-retry-2.0.2

克隆私有项目

如果是public的项目,可以直接克隆,如果是private的项目,克隆时需要输入token

# 在github.com前面加上上面拿到的 access token 和 token的名字
# 示例: tokens-name:tokens 
git clone https://tokens-name:tokens@github.com/yangtseJin/VINS-Mono-Study.git

注意:

这里在token前面要加上token的名字,不像http上传时只加token,

token name如下

在这里插入图片描述

示例如下

在这里插入图片描述

设置仓库为private或public

参考:

Github私有仓库改为公开仓库

选择 Settings

在这里插入图片描述

选择仓库的可见性

在这里插入图片描述

遇到的问题

错误1

参考:

WSL-Ubuntu系统中git使用报错问题解决:GnuTLS recv error (-110): The TLS connection was non-properly terminated

提交时报错

fatal: unable to access 'https://github.com/yangtseJin/VINS-Fusion-Study.git/': GnuTLS recv error (-110): The TLS connection was non-properly terminated.

在这里插入图片描述

只需要更新一下git就好了

sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git

错误2

参考:

git 报错:Updates were rejected because the remote contains work that you do问题

[git出现这种错误是什么原因?error :hint?](https://segmentfault.com/q/1010000002736986)

被拒绝提交

 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://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@github.com/yangtseJin/VINS-Fusion-Study.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

在这里插入图片描述

远程分支上存在本地分支中不存在的提交,往往是多人协作开发过程中遇到的问题,可以先fetchmerge,也就是pull,把远程分支上的提交合并到本地分支之后再push

如果你确定远程分支上那些提交都不需要了,那么直接

git push origin master -f

强行让本地分支覆盖远程分支

错误3

参考:

git 解决push报错:[rejected] master -> master (fetch first) error: failed to push some refs to

我在线上生成了README,但是本地没有,就会报拒绝连接的错误

在这里插入图片描述

解决办法:

将线上、线下代码进行合并

git pull --rebase origin master

然后再进行push

git push origin master

错误4

参考:

Git:解决报错:fatal: The remote end hung up unexpectedly

Github issue. fatal: the remote end hung up unexpectedly

上传代码时报如下错误,

fatal: the remote end hung up unexpectedly

在这里插入图片描述

解决办法1:

修改设置git config文件的postBuffer的大小。(设置为500MB)

git config --local http.postBuffer 524288000

注:–local选项指定这个设置只对当前仓库生效。

但是设置了文件大小也不行?

还可以设置更大一点的缓存区

https://github.com/huggingface/transformers/issues/17813#issuecomment-1638743895

git config http.postBuffer 99999999

解决办法2:

直接修改本地仓库的.config文件。

增加下图所示的两行内容

[http]
	postBuffer = 524288000

解决办法3:

使用仓库的SSH地址提交,而不用HTTP地址提交