参考

安装配置Git

安装git

  • Git官网, 下载最新版并安装

  • 通过git --version命令可以查看git的版本, 用于检查git是否安装和环境变量配置成功

    1
    git --version
  • 安装按完成后, 在任意目录下鼠标右键选择Git shell Here, 进入git的命令行操作界面

配置git

  • 通过git config 可以配置git的用户名和邮箱

    1
    2
    git 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 的用户名和邮箱将用于记录和跟踪谁对项目作了修改
    image-20220130114253479

理解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)
image-20220317111322739

Git文件的创建和提交

初始化git本地仓库

通过git init命令在本地初始化一个本地仓库, 执行该命令后会在本地初始化一个没有任何文件的空仓库

1
git init

初始化之后本地会多出一个.git的隐藏文件夹

新建文件并提交

  • 新建test.md文件, 内容如下

    1
    Git 仓库初始化与文件添加操作
  • 使用git status命令查看工作目录与暂存区的文件状态
    添加到暂存区之前的git文件状态
    image-20220317114653408

  • 添加test.md到暂存区

    1
    git add test.md

    添加到暂存区之后, 还未提交的git文件状态
    image-20220317120208560

  • 提交test.md到git仓库

    1
    git commit test.md -m '第一次提交test.md文件'

    git commit命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。
    通常在执行提交时 在 git commit 命令后跟上-m 属性 加入本次提交的记录说明 方便后续查看提交或改动记录。

    提交后git文件的状态

    image-20220317154753072

  • 使用git log命令查看提交日志信息

    1
    git log

    image-20220317155610358

    使用--pretty=oneline参数可以将提交信息单行展示

    1
    git log --pretty=oneline

    image-20220321113226371

修改文件并提交

  • 修改test.md文件, 内容如下

    1
    2
    Git 仓库初始化与文件添加操作
    时光穿梭机
  • 修改后git文件状态如下

    image-20220317163410488

  • 使用git add命令将修改后的文件添加到暂存区, add后的git文件状态如下

    image-20220317163752202

  • 使用git commit命令将暂存区的修改的文件提交到git本地仓库中

    image-20220317171131374

  • 使用git log查看提交记录

    image-20220317171334364

git diff命令的使用

命令 功能
git diff 查看工作区暂存区的差别的
git diff HEAD 查看工作区本地仓库的差别的
(HEAD 指向的是本地仓库中最新提交的版本)
git diff --cached 查看暂存区本地仓库的差别的
  • 现在test.md文件的内容如下

    1
    2
    3
    第一行
    第二行
    第三行

    此时文件已提交至本地仓库, 使用三个diff命令都没有返回任何内容

    image-20220318104557856

  • 修改test.md文件如下

    1
    2
    3
    第一行
    第二行 (修改)
    第三行

    image-20220318105033363

  • 查看修改

    image-20220318105442408

    1
    "a/test.md"表示修改之前的文件, "`b/test.md"表示修改之后的文件
    1
    "---"表示变动之前的文件, "+++"表示变动之后的文件

    image-20220318110018644

    1
    2
    3
    @@ -1,3 +1,3 @@
    "-1,3"表示变动之前的文件显示从第1行开始的连续3行
    "+1,3"表示变动之后的文件显示从第1行开始的连续3行
    1
    2
    3
    红色"-第二行"表示修改前的内容是"第二行"
    绿色"+第二行 (修改)"表示修改之后的内容是"第二行 (修改)"
    白色的表示没有修改的部分
  • 添加文件至暂存区

    image-20220318110755183

  • 再次查看修改

    git diff命令无返回内容, 说明工作区暂存区的文件内容相同

    git diff HEAD返回内容, 说明本地仓库工作区的文件内容不同

    git diff --cached返回内容, 说明本地仓库暂存区的文件内容不同

    image-20220318111047779

*将文件存入Repository的流程

  • 刚开始 working tree 、 index 与 repository(HEAD)里面的內容都是一致的

    img

  • 当git管理的文件夹里面的内容出现改变后, 此時 working tree 的內容就会跟 index 及 repository(HEAD)的不一致, 而Git知道是哪些文件(Tracked File)被改动过, 直接将文件状态设置为 modified (Unstaged files)

    img

  • 当我们执行 git add 后, 会将这些改变的文件內容加入 index 中 (Staged files), 所以此时working tree跟index的內容是一致的, 但他们与repository(HEAD)內容不一致

    img

  • 接着执行 git commit 后, 將Git索引中所有改变的文件內容提交至 Repository 中, 建立出新的 commit 节点(HEAD)后, working tree 、 index 與与repository(HEAD)区域的内容 又会保持一致

    img

远程仓库

克隆远程项目到本地

  • 新建文件夹, 打开 Git shell
  • 使用命令clone整个仓库到本地
1
2
git clone [仓库HTTPS地址]
git clone [仓库SSH地址] # 需要配置 ssh key

创建Github仓库

  • 登录Github账号
  • 创建新的仓库->设置仓库名->设置公开/私有->创建仓库

create a new repository

通过HTTPS绑定远端仓库

blog-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
    2
    ls -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

    generate ssh keys

  • 使用cat命令查看 ~/.ssh 目录下的公钥, 复制返回的内容

    1
    cat ~/.ssh/id_rsa.pub

    或者去~/.ssh目录下打开.pub后缀的文件, 复制其中的内容

添加新的SSH key到Github账户

参考博客Adding a new SSH key to your GitHub account

New SSH key

Add SSH key

测试SSH连接

参考博客Testing your SSH connection

  1. 打开 Git shell.

  2. 输入以下命令

    1
    2
    ssh -T git@github.com
    ## Attempts to ssh to GitHub

    第一次输入这个命令可能会收到下面的提示

    1
    2
    3
    > The 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.
  3. 验证密钥指纹是否和 GitHub’s public key fingerprint中的匹配. 如果匹配则输入yes并回车, 收到下面的提示信息则说明连接正常

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

通过SSH绑定远端仓库

blog-ssh

  1. 在本地仓库中打开 Git shell

  2. 输入下面的命令

    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 基本操作 | 菜鸟教程

git-command

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

Publish

Publish to GitHub private repository
Publish to GitHub public repository

Stage Changes

  • Click Stage Changes or Stage All Changes to stage changes.

U means Untracked
M means Modified

Commit Changes

  • Type in a message and press Ctrl + Enter to commit changes.

A means Index Added
M means Index 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
2
3
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# ...

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
    8
    # Ignore 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
    3
    ssh -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
    3
    git 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
    2
    git 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]