Git的基本使用
参考
-
Bilibili 视频教程
这可能是B站讲的最好的Git教程, 3h打通Git全套教程丨2021最新IDEA版(涵盖GitHub\Gitee码云\GitLab) -
英文教材 Git Pro
Pro Git -
参考手册
Reference Manual
安装配置Git
安装git
-
Git官网, 下载最新版并安装
-
通过
git --version
命令可以查看git的版本, 用于检查git是否安装和环境变量配置成功1
git --version
-
安装按完成后, 在任意目录下鼠标右键选择
Git shell Here
, 进入git的命令行操作界面
配置git
-
通过
git config
可以配置git的用户名和邮箱1
2git config --global user.name "your_username"
git config --global user.email your_email@domain.com -
通过
git config --list
可以查看所有配置1
git config --list
-
如果用了 –global 选项, 那么更改的配置文件就是位于你用户主目录下的.gitconfig文件, 以后你所有的项目都会默认使用这里配置的用户信息。
-
如果要在某个特定的项目中使用其他名字或者电邮, 只要去掉 --global 选项重新配置即可, 新的设定保存在当前项目的 .git/config 文件里。
-
配置的git 的用户名和邮箱将用于记录和跟踪谁对项目作了修改
理解Git文件的三种状态与工作模式
Git文件的三种状态
状态 | 描述 |
---|---|
已提交(committed) | 已提交表示数据已经安全地被保存在本地数据库中 |
已修改(modified) | 已修改表示修改了文件, 但还没保存到数据库中 |
已暂存(staged) | 已暂存表示对一个已修改文件的当前版本做了标记, 使之包含在下次提交的快照中 |
Git项目的三个工作区域
分类 | 描述 |
---|---|
工作区(working directory) | 简单的理解为在电脑里能看到的目录, 比如自己创建的本地项目目录 |
暂存区(staging area) | Git的版本库里存了很多东西, 其中最重要的就是称为stage(或者叫index)的暂存区, 还有Git自动创建的第一个分支master, 以及指向master的一个指针叫HEAD |
Git仓库(git directory) | 工作区有一个隐藏目录.git , 这个不算工作区, 而是Git的版本库 |
Git的工作流程
- 在工作区中修改某些文件
- 对修改后的文件进行快照, 然后添加到暂存区(
git add
) - 提交更新, 将保存在暂存区域的文件快照永久转储到 Git 仓库中(
git commit
)

Git文件的创建和提交
初始化git本地仓库
通过git init
命令在本地初始化一个本地仓库, 执行该命令后会在本地初始化一个没有任何文件的空仓库
1 | git init |
初始化之后本地会多出一个.git
的隐藏文件夹
新建文件并提交
-
新建test.md文件, 内容如下
1
Git 仓库初始化与文件添加操作
-
使用
git status
命令查看工作目录与暂存区的文件状态
添加到暂存区之前的git文件状态
-
添加test.md到暂存区
1
git add test.md
添加到暂存区之后, 还未提交的git文件状态
-
提交test.md到git仓库
1
git commit test.md -m '第一次提交test.md文件'
git commit
命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。
通常在执行提交时 在git commit
命令后跟上-m
属性 加入本次提交的记录说明 方便后续查看提交或改动记录。提交后git文件的状态
-
使用
git log
命令查看提交日志信息1
git log
使用
--pretty=oneline
参数可以将提交信息单行展示1
git log --pretty=oneline
修改文件并提交
-
修改test.md文件, 内容如下
1
2Git 仓库初始化与文件添加操作
时光穿梭机 -
修改后git文件状态如下
-
使用
git add
命令将修改后的文件添加到暂存区, add后的git文件状态如下 -
使用
git commit
命令将暂存区的修改的文件提交到git本地仓库中 -
使用
git log
查看提交记录
git diff命令的使用
命令 | 功能 |
---|---|
git diff |
查看工作区与暂存区的差别的 |
git diff HEAD |
查看工作区和本地仓库的差别的 (HEAD 指向的是本地仓库中最新提交的版本) |
git diff --cached |
查看暂存区与本地仓库的差别的 |
-
现在test.md文件的内容如下
1
2
3第一行
第二行
第三行此时文件已提交至本地仓库, 使用三个diff命令都没有返回任何内容
-
修改test.md文件如下
1
2
3第一行
第二行 (修改)
第三行 -
查看修改
1
"a/test.md"表示修改之前的文件, "`b/test.md"表示修改之后的文件
1
"---"表示变动之前的文件, "+++"表示变动之后的文件
1
2
3@@ -1,3 +1,3 @@
"-1,3"表示变动之前的文件显示从第1行开始的连续3行
"+1,3"表示变动之后的文件显示从第1行开始的连续3行1
2
3红色"-第二行"表示修改前的内容是"第二行"
绿色"+第二行 (修改)"表示修改之后的内容是"第二行 (修改)"
白色的表示没有修改的部分 -
添加文件至暂存区
-
再次查看修改
git diff
命令无返回内容, 说明工作区和暂存区的文件内容相同git diff HEAD
返回内容, 说明本地仓库和工作区的文件内容不同git diff --cached
返回内容, 说明本地仓库和暂存区的文件内容不同
*将文件存入Repository的流程
-
刚开始 working tree 、 index 与 repository(HEAD)里面的內容都是一致的
-
当git管理的文件夹里面的内容出现改变后, 此時 working tree 的內容就会跟 index 及 repository(HEAD)的不一致, 而Git知道是哪些文件(Tracked File)被改动过, 直接将文件状态设置为 modified (Unstaged files)
-
当我们执行 git add 后, 会将这些改变的文件內容加入 index 中 (Staged files), 所以此时working tree跟index的內容是一致的, 但他们与repository(HEAD)內容不一致
-
接着执行 git commit 后, 將Git索引中所有改变的文件內容提交至 Repository 中, 建立出新的 commit 节点(HEAD)后, working tree 、 index 與与repository(HEAD)区域的内容 又会保持一致
远程仓库
-
Github是全球最大的远程仓库, 目前已被微软收购
-
Gitee码云是国内知名的远程仓库
-
使用Chrome插件Octotree - GitHub code tree可以方便地查看Github仓库目录
克隆远程项目到本地
- 新建文件夹, 打开 Git shell
- 使用命令clone整个仓库到本地
1 | git clone [仓库HTTPS地址] |
创建Github仓库
- 登录Github账号
- 创建新的仓库->设置仓库名->设置公开/私有->创建仓库
通过HTTPS绑定远端仓库
-
使用
git remote
命令将远端仓库绑定到本地仓库其中origin是仓库的别名
https://github.com/...
是仓库https地址
1 | git remote add origin https://github.com/onexiaophai/blog.git |
- 使用
git push
将本地仓库推送到远端仓库
1 | git push -u origin main |
通过SSH绑定远端仓库
参考博客Connecting to GitHub with SSH
SSH简介
通过SSH协议, 计算机可以连接到远程服务器和服务并进行身份验证. 使用SSH密钥, 您可以连接到GitHub, 并且不必在每次访问时提供用户名和个人访问令牌. 还可以使用SSH密钥签名提交.
-
https 和 SSH 的区别
- 使用https url可以随意克隆github/gitee上的项目; 而SSH url只限于管理员, 且需要先添加 SSH 公钥, 否则无法克隆.
- https url 在push的时候是需要验证用户名和密码;而使用SSH push,在配置SSH key后, 如果没有额外设置密码是不需要输入用户名和密码的.
-
SSH免登录原理简介
首先需要创建一对密匙(公钥和私钥),并把公密放在需要访问的服务器上。如果你要连接到SSH服务器,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较,如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器, 服务器确认解密后的"质询"正确后就会和客户端建立连接。
查看已存在的SSH keys
参考博客Checking for existing SSH keys
-
打开 Git shell.
-
使用命令
ls -al ~/.ssh
列出~/.ssh
目录下的文件1
2ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist -
检查目录清单,查看该设备是否已经有一个SSH公钥. 默认情况下, GitHub支持的公钥的文件名是以下之一
- id_rsa.pub
- id_ecdsa.pub
- id_ed25519.pub
Note: 如果你收到一个错误——
~/.ssh
不存在, 或者没有显示SSH密钥对, 你可以在下一步中创建新的SSH密钥对 -
使用
cat
命令查看~/.ssh
目录下的公钥, 复制返回的内容1
cat ~/.ssh/id_rsa.pub # 只能在GitBash/Bash中使用不能再shell(cmd)中使用
或者去
~/.ssh
目录下打开.pub
后缀的文件, 复制其中的内容其中
~/
为Linux文件目录的指令, 表示用户根目录, 对应于这台计算机即C:\Users\xiaophai
生成新的SSH keys
参考博客Generating a new SSH key and adding it to the ssh-agent
-
打开 Git shell.
-
在git shell中输入下面命令, 生成公钥和密钥
1
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
方便复制用:
ssh-keygen -t rsa -C "1379347218@qq.com"
注意:这里的
xxxxx@xxxxx.com
只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。目前大部分教程均要求使用github的注册邮箱,其初衷仅仅是为了便于辨识。 -
按照提示完成三次回车,即可生成 ssh key
-
使用
cat
命令查看~/.ssh
目录下的公钥, 复制返回的内容1
cat ~/.ssh/id_rsa.pub
或者去
~/.ssh
目录下打开.pub
后缀的文件, 复制其中的内容
添加新的SSH key到Github账户
参考博客Adding a new SSH key to your GitHub account
测试SSH连接
参考博客Testing your SSH connection
-
打开 Git shell.
-
输入以下命令
1
2ssh -T git@github.com
# Attempts to ssh to GitHub第一次输入这个命令可能会收到下面的提示
1
2
3The authenticity of host 'github.com (IP ADDRESS)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?其中第二条的密钥指纹也可能是
1
> ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
-
验证密钥指纹是否和 GitHub’s public key fingerprint中的匹配. 如果匹配则输入
yes
并回车, 收到下面的提示信息则说明连接正常1
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
通过SSH绑定远端仓库
-
在本地仓库中打开 Git shell
-
输入下面的命令
1
git remote add origin git@github.com:whut-zhangwx/blog.git
注意其中
git@github.com:...
为远程仓库的SSH链接
通过ssh拉取远端仓库
使用默认私钥 ~/.ssh/id_rsa
1 | git clone git@github.com:xxx |
指定私钥位置
1 | GIT_SSH_COMMAND="ssh -i /path/to/id_rsa" git clone git@github.com:xxx |
git常用操作
参考博客Git 基本操作 | 菜鸟教程
add操作
- 添加一个或多个文件到暂存区
1 | git add [file1] [file2] ... |
- 添加指定目录到暂存区,包括子目录
1 | git add [dir] |
- 添加当前目录下的所有文件到暂存区
1 | git add . |
commit操作
-
提交暂存区到本地仓库中
1
git commit -m "message"
-m "message"
是必须的, 内容可以是一些备注信息. -
提交暂存区的指定文件到仓库区
1
git commit [file1] [file2] ... -m "message"
status操作
-
查看当前本地库的状态
1
git status
-
使用
-s
参数来获得简短的输出1
git status -s
branch操作
-
查看所有分支, *号标记的分支为当前分支
1
git branch
-
创建新分支
1
git branch [new-branch]
-
切换到指定分支
1
git checkout [branch-name]
-
创建并切换到新分支
1
git checkout -b [new-branch]
-
删除指定分支
1
git branch -d [branch-name]
-
修改分支名
1
git branch -m [old-name] [new-name]
-
合并指定分支到当前分支
1
git merge [branch-name]
remote操作
-
验证ssh
-
添加远端仓库
1
git remote add <shortname> <url>
默认名称为
origin
-
查看已添加的远端仓库
1
git remote -v
-
修改远端仓库的名称
1
git remote rename <oldname> <newname>
-
移除远端仓库
1
git remote remove <remote>
push和pull操作
-
从远端仓库拉取分支到本地仓库分支
1
git pull <remote> <remote-branch>:<local-branch>
如果远程分支是与当前分支合并,则冒号后面的部分可以省略
1
git pull <remote> <remote-branch>
-
从本地仓库推送分支到远端从库分支
1
git push <remote> <local-branch>:<remote-branch>
如果
<local-branch>
和<remote-branch>
同名, 则<remote-branch>
可以省略1
git push <remote> <branch>
-
Git: fatal: unable to access 'https://github.com/… ": Failed toconnect to github.com port 443 after 21092 ms: Timed out
1
git config --global http.proxy ""
-
Failed to connect
“Git: fatal: unable to access ‘https://github.com/*/*.git’: Failed to connect to github.com port 443 after …ms: Timed out”
Solution:
- Click
...
in the top right cornor of SOURCE CONTROL Pull, Push > Push to...
- Authorize git-ecosystem
- Click
Publish
Publish to GitHub private repository
Publish to GitHub public repository
Stage Changes
- Click
Stage Changes
orStage All Changes
to stage changes.
U
meansUntracked
M
meansModified
Commit Changes
- Type in a message and press
Ctrl + Enter
to commit changes.
A
meansIndex Added
M
meansIndex Modified
You are forced to enter a message for your changes when you are going to commit changes, such as “First Commit”, “Add Features” or something else.
If not, you will get a COMMIT_EDITMSG
as below:
1 | # Please enter the commit message for your changes. Lines starting |
gitignore
-
.gitignore
文件1
2
3*.exe # 忽略所有的.exe文件
__pycache__ # 忽略当前目录以及所有子目录下的__pycache__文件夹
/datasets # 忽略当前目录下的datasets文件夹,不包括子目录下的datasets文件夹 -
检查文件是否被忽略,并输出忽略它的ignore指令
1
git check-ignore -v [file]
-
已经被追踪的文件不能被忽略,需要手动将其从 Staged Changes 中移除
1
git rm -r --cached [file] [filedir]
-
忽略没有后缀的文件(linux二进制文件)
1
2
3
4
5
6
7
8Ignore all
*
Unignore all with extensions
!*.*
Unignore all dirs
!*/
Above combination will ignore all files without extension
创建本地项目并推送到远端新仓库
-
配置好 ssh 公钥私钥, 本地的私钥默认路径 ~/.ssh/id_rsa, 以及远端仓库的公钥 id_rsa.pub
-
测试 ssh 连接
1
2
3ssh -T git@github.com # github
ssh -T git@gitlab.4pd.io # gitlab
ssh -T git@hf.co # huggingface -
初始化本地仓库
1
git init
-
添加 .gitignore
-
暂存文件
1
git add .
-
提交文件
1
git commit -m "first commit"
-
添加远端仓库
1
2
3git remote add [remote_name] [url]
git remote add github git@github.com:user_name/repository_name.git # eg: github
git remote add gitlab git@gitlab.4pd.io:user_name/repository_name.git # eg: gitlab -
查看远端仓库
1
2git remote -v
git remote show [remote_name] -
推送到远端仓库
1
git push [remote] [local-branch]:[remote-branch]
1
2指定私钥
GIT_SSH_COMMAND="ssh -i /path/to/id_rsa" git push [remote] [local-branch]:[remote-branch]