首页 Git入门(二)Git的基本操作流程和命令详解
文章
取消

Git入门(二)Git的基本操作流程和命令详解

本章就GitHub全流程的命令进行呈现和解释,注意:所有命令行都是在本地执行,Linux和Mac打开终端,windows桌面右键打开Git Bash。

初始化仓库

初始化仓库可以分为三种形式:

  1. 完全从0开始:Git也无内容,本地也无内容;
  2. 本地仓库已有内容:本地链接到空的Git仓库;
  3. GitHub上已有内容:从Git现有仓库clone到本地。

完全从0开始

GitHub官网右上角有个+号,点击选择 New repository,命名后直接创建,GitHub仓库就建好了。会有Quick setup提示,需要在本地运行:

…or create a new repository on the command line

1
2
3
4
5
6
7
echo "# test" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:JinHanLei/test.git
git push -u origin main

意思是先在本地创建README.md文档,内容是”# test”。

然后git init初始化本地仓库,并git addREADME.md进行跟踪。

git commitadd的文件提交到本地仓库。

git branch -M把本地分支命名为main

git remote add将GitHub仓库的origin分支和本地相链接。

git push把本地的main分支上传到GitHub仓库的origin分支。

本地仓库已有内容

第二个提示是针对本状况。

…or create a new repository on the command line

1
2
3
git remote add origin git@github.com:JinHanLei/test.git
git branch -M main
git push -u origin main

如果是之前建过本地仓库的,那么可以直接执行,如果没有,那么仍然需要先执行:

1
2
3
git init
git add .
git commit -m "first commit"

GitHub上已有内容

直接把这个GitHub仓库clone到本地:

1
git clone git@github.com:JinHanLei/JinHanLei.github.io.git

可以clone别人的,也可以clone自己的,这等同于Download ZIP再解压。

但自己的帐号密码无法push到别人的仓库,这时可以参照第一步新建一个空仓库,并修改链接。

1
2
3
4
git remote -v
git remote rm origin
git remote add origin 你自己的项目链接
git push -u origin master

就可以push成功了。

个人这样觉得更好的方式是:右上角Fork别人的代码到自己的仓库,再clone自己的仓库链接。既方便,又是对别人工作的尊重,有种引用参考文献的意味~

在以上流程中,每次push时都需要输入帐号密码,不太方便,下面介绍一种不需要再输的方法。

GitHub配置ssh key

目的是push不用输密码,做法是将本地的密钥添加到GitHub,相当于Git认识你的计算机了。

检查本地主机的ssh key

1
2
cd ~/.ssh
ls

若存在id_rsaid_rsa.pub文件,则跳过下一步,若不存在,则执行:

1
ssh-keygen -t rsa -C "xxx@xxx.com"

"xxx@xxx.com"填你的邮箱即可。获得密钥的内容:

1
cat id_rsa.pub

复制密钥。

在GitHub中添加key

到GitHub首页,依次点击setting-SSH and GPG keys,new SSH key,将刚才复制的密钥粘贴-创建。回到本地机执行,查看是否设置成功:

1
ssh -T git@github.com

出现success等字样即成功,但是大概率会出现错误:

ssh:connect to host github.com port 22: Connection timed out.

是由于防火墙等原因锁了22端口,需要改用其他端口。依旧在当前文件夹,创建config

1
vim config

在该文件中粘贴如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
Host github.com
User git
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
Port 443

Host gitlab.com
Hostname altssh.gitlab.com
User git
Port 443
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa

保存退出,再执行一次:

1
ssh -T git@github.com

过程中要输入yes,输完基本上就能看到success了。

这之后clone自己的项目,需要在项目首页选SSH。如果之前的项目已经用了HTTP,想改,把.git/config文件中的url改了就行。再push就不需要输入帐号密码咯。

Git常用命令详解

上文我们已经体验了Git的主要几个命令,下面我们再来回顾和补充一些。

操作本地仓库

1
git init

初始化后,在当前目录下会出现一个名为.git的目录,所有Git需要的数据和资源都存放在这个目录中。

如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉Git开始对这些文件进行跟踪:

1
2
3
4
# 追踪该目录下所有后缀为.py的文件
git add *.py
# 追踪该目录下的所有文件及文件夹
git add .

对于不想要追踪的文件(夹),比如日志,以及过大的文件(例如数据、模型参数)等,可以创建一个名为.gitignore的文件来声明,文件内容如下:

1
2
3
4
5
6
7
8
9
10
# 忽略所有以.o或.a结尾的文件
*.[oa]
# lib.a除外
!lib.a
# 所有以波浪符(~)结尾的文件
*~
# 忽略data文件夹及其中的所有文件
data
# 忽略data/目录下的所有文件,但data不忽略,也就是上传空文件夹
data/

git add暂存后提交到本地仓库:

1
git commit -m "增加了一个博客"

也可以在commit时用-a省去git add

1
git commit -am '增加了一个博客'

删除和移动

如果想要彻底删除(remove,rm)一个文件(既删除原文件,也要把它从本地仓库的暂存区中移除),可以执行:

1
2
3
4
git rm <filename>
# 相当于下面两句:
rm <filename>
git add .

如果不想删除本地的原文件,只是不想再追踪它,则执行:

1
git rm --cached <filename>

移动(move,mv)文件也是类似操作(重命名也是移动):

1
2
3
4
5
git mv README.txt README
# 相当于下面三句:
mv README.txt README
git rm README.txt
git add README

撤消

有些撤销操作是不可逆的,所以请务必谨慎小心,一旦失误,就有可能丢失部分工作。

有时候我们提交完了才发现漏掉了几个文件没有加。想要重做刚才的提交操作,可以使用 --amend 选项重新提交:

1
2
3
git commit -m 'initial commit'
git add forgotten_file
git commit --amend

上面的三条命令最终只是产生一个提交。

有时不小心用 git add . 将所有文件加到了暂存区域,撤消暂存其中的一个文件<filename>使用:

1
2
git reset HEAD <filename>
# 等价于git rm --cached xx

如果想让某文件回到最近一次commit的状态,执行:

1
git checkout -- <filename>

这一操作将会让你失去所有修改的内容,不建议使用,用stash和分支处理会更好,下一章详解分支。

检查当前文件状态

上一章讲了文件的三种状态,查看文件状态的命令是:

1
git status

用来查看哪些暂存了,哪些修改过,要查看具体修改了什么地方,执行:

1
git diff

如果很长,按q退出。git diff只显示还没有暂存起来的改动,add之后再diff的话是没有内容的。这个命令在多人协作的时候很有用,个人开发没啥用,自己当然知道改了啥hhh。

当要查看提交历史,可以运行:

1
2
3
4
5
6
7
8
9
10
11
git log
# -2只显示最近的两次
git log -2
# -p显示最近两次的差异
git log -p -2
# --pretty改成自己想要的输出格式
git log --pretty=format:"%h - %an, %ar : %s"
# 只显示最近两周内的提交
git log -since=2.weeks
# 只显示2022-10-01以来的提交
git log --since="2022-10-01"

远程操作

克隆一个远程GitHub仓库:

1
2
3
git clone git@github.com:JinHanLei/JinHanLei.github.io.git
# 把clone下来的项目名称改为blog
git clone git@github.com:JinHanLei/JinHanLei.github.io.git blog

这个例子使用的是 git:// 协议,需要先进行上一小节的配置。不然就只能用 http(s):// 了。

查看本地链接的哪个GitHub仓库:

1
2
3
git remote -v
# 查看名为origin的仓库信息
git remote show origin

添加和删除远程仓库,可以添加多个(例如要一起用GitHub和Gitee):

1
2
3
4
5
6
# 添加
git remote add [shortname] [url]
# 删除名为origin的远程仓库
git remote rm origin
# origin重命名为jin
git remote rename origin jin

把本地的master分支推送到origin服务器上:

1
git push origin master

只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。

以上是自己一个人写代码的时候会常用到的命令,下节进入Git的大杀器:分支操作。

本文由作者按照 CC BY 4.0 进行授权

Git入门(一)Git基础概念和安装

深度学习环境配置:Anaconda、CUDA、PyTorch安装和那些坑儿