本章就GitHub全流程的命令进行呈现和解释,注意:所有命令行都是在本地执行,Linux和Mac打开终端,windows桌面右键打开Git Bash。
初始化仓库
初始化仓库可以分为三种形式:
- 完全从0开始:Git也无内容,本地也无内容;
- 本地仓库已有内容:本地链接到空的Git仓库;
- 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 add
对README.md
进行跟踪。
git commit
将add
的文件提交到本地仓库。
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_rsa
和id_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的大杀器:分支操作。