持续更新完善中…
1 Git简介
1.1 Git是什么?
Git是一个开源的分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的项目版本管理。它能够记录项目文件的变更历史,让多个开发者可以协作开发同一个项目,同时保持代码的一致性和可追溯性。
1.2 Git的原理
Git允许用户在本地存储完整的代码历史记录,并支持在本地进行版本控制操作,如提交、分支、合并等。当你在本地进行更改并提交后,这些更改会被保存在本地仓库中。通过推送(push)操作,你可以将本地的更改同步到远程仓库,而拉取(pull)操作则可以将远程仓库的更新合并到本地。Git通过这种方式实现了高效的代码版本追踪和团队协作。
1.3 Git工作机制
Git包含四个重要区域:
- 工作区(workspace):这是开发者编写代码的目录,例如
D:/projects/test
。 - 缓存区(index):位于
.git
文件夹下的某个位置,通常创建在工作区中。例如,如果工作区是D:/projects/test
,则.git
目录会位于D:/projects/test/.git
。缓存区在.git
目录下的具体位置无需了解,只需知道其存在即可,后续将详细说明其作用。 - 本地仓库(Repository):也位于
.git
目录下,有时被称为“版本库”或“仓库区”。类似缓存区,其具体位置也无需关注,后续会说明它的功能。 - 远程仓库(Remote):存储在 GitHub、Gitee 等平台上的仓库。
2 Git使用教程
2.1 Git安装教程
你开始使用前,需要将Git安装在你的计算机上, 即便已经安装,最好将它升级到最新的版本。
安装教程参考:https://blog.csdn.net/qq_45281589/article/details/134650456?fromshare=blogdetail&sharetype=blogdetail&sharerId=134650456&sharerefer=PC&sharesource=qq_50993557&sharefrom=from_link 和 https://py-wang.blog.csdn.net/article/details/120767020?fromshare=blogdetail&sharetype=blogdetail&sharerId=120767020&sharerefer=PC&sharesource=qq_50993557&sharefrom=from_link。
2.2 常用口令
git init
,初始化一个新的 Git 仓库。当你在一个新项目中运行 git init 时,Git 会在项目目录中创建一个隐藏的 .git 文件夹,这个文件夹包含了所有跟踪项目历史的文件。git clone [repository-url]
,克隆一个远程仓库到本地。如果你想下载一个项目的所有代码和版本历史,可以使用 git clone 命令。它会在本地创建一个新的文件夹,并将远程仓库的内容复制到这个文件夹中。- git fetch,从远程仓库获取最新的数据,但不会自动合并到本地分支。git fetch 会从远程仓库拉取最新的数据,但不会自动合并到你的当前分支。这可以让你在合并之前先查看远程分支的状态。
git add [file]
,将文件添加到暂存区(staging area)。在 Git 中,你需要先将文件添加到暂存区,然后才能进行提交。git add 命令就是用来将文件标记为“准备好提交”的状态。git commit -m "[message]"
,将暂存区的文件提交到本地仓库。提交是将你添加到暂存区的文件和所做的更改保存到本地仓库的历史记录中。-m 参数后面跟着的是你为这次提交写的描述信息。git status
,查看当前仓库的状态。这个命令会显示哪些文件被修改了、哪些文件被添加到了暂存区、以及哪些文件还没有被跟踪。git branch
,列出、创建或删除分支。分支是 Git 中的一个核心概念,它允许你从主开发线(通常是 master 或 main 分支)中分离出来进行开发,而不会影响主分支。git checkout [branch-name]
,切换到指定的分支。如果你想在不同的分支之间切换工作,可以使用 。git pull
,用于从远程获取代码并合并本地的版本。git pull 其实就是 git fetch 和 git merge 的简写,先从远程仓库获取最新的提交记录,然后将这些提交记录合并到你当前的分支中。git push
,用于从将本地的分支版本上传到远程并合并。
2.3 配置Git
安装完毕 Git 后,第一件事就是设置提交的用户名和邮件地址。因为每次提交时,Git 都需要记录提交作者和邮件地址的信息。要进行配置,首先打开 Git,进入对应的项目文件夹,然后右键点击文件夹,在弹出的菜单中选择“Git Bash Here”,参考:https://cloud.tencent.com/developer/article/2302110。
2.3.1 配置全局用户名和邮箱
以Github账户用户名和邮箱为例:
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
使用--global
时,配置的信息会被视为Git的全局配置。在需要读取用户名和邮箱地址的任何位置,Git默认会使用配置的值。如果希望针对不同项目使用不同的用户名和邮箱地址,比如在自己的GitHub上使用私人邮箱而非公司邮箱,可以简单地切换到该项目的根目录(即包含.git文件夹的目录)进行配置。
git config user.name "你的名字"
git config user.email zinyan@example.com
查看是否配置成功
git config user.name
git config user.email
2.3.2 配置ssh
Git支持多种传输协议,其中最常用的是https和ssh,这些协议旨在确保数据传输的安全性。设置SSH密钥的目的是为了避免每次提交代码时输入用户名和密码,同时确保传输的安全性。虽然设置SSH密钥不是必须的,但如果不设置,每次提交代码时都需要输入账号和密码。如果不使用密码,是否意味着任何人都可以将代码推送到你的仓库呢?一旦设置了公钥,GitHub可以通过公钥识别你的机器,并确认你是可信用户,从而避免每次与GitHub通信时都需输入密码。
我们在将项目推送(push)到GitHub时,如果使用https方式,每次都需要输入账号和密码,非常麻烦。而采用ssh方式后,就不再需要输入账号和密码,只需在GitHub账户下配置一个ssh密钥即可。参考:https://blog.csdn.net/weixin_42310154/article/details/118340458?fromshare=blogdetail&sharetype=blogdetail&sharerId=118340458&sharerefer=PC&sharesource=qq_50993557&sharefrom=from_link。
Git 使用 SSH 配置的初始步骤: 1)使用秘钥生成工具生成 rsa 秘钥和公钥;2)将rsa公钥添加到代码托管平台;3)将rsa秘钥添加到 ssh-agent 中,并为ssh客户端指定使用的秘钥文件。
具体步骤如下:
Step 1: 检查本地主机是否已经存在ssh key。
cd ~/.ssh
ls
//看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key
Step 2: 如果不存在ssh key,使用如下命令生成。
ssh-keygen -t rsa -C "xxx@xxx.com"
//执行后一直回车即可
Step 3: 获取ssh key公钥内容(id_rsa.pub),并复制内容。
cd ~/.ssh
cat id_rsa.pub
Step 4: Github账号上进入Settings设置添加公钥,添加ssh key,把刚才复制的内容粘贴上去保存即可。
Step 5: 验证是否设置成功,设置成功后,即可不需要账号密码clone和push代码。
ssh -T git@github.com
注意之后在clone仓库的时候要使用ssh的url,而不是https!
例如:git clone git@github.com:username/repo.git
,这里的 username 是 GitHub 上的用户名,repo 是仓库的名称。确保你使用的是正确的 ssh url,而不是https url。
2.3.3 验证原理
登录的安全性由非对称加密保证。在生成密钥时,会同时生成一对密钥——一个公钥和一个私钥,通常在Git中命名为id_rsa.pub和id_rsa。那么,如何使用这对密钥进行验证呢?首先,本地生成密钥对,将公钥放置在远程主机上,私钥保存在本地主机。当本地主机需要登录远程主机时,它会向远程主机发送登录请求。远程主机收到请求后,随机生成一个字符串,并用公钥加密后返回给本地主机。本地主机收到该加密字符串后,使用保存在本地的私钥进行解密,并将解密后的字符串发送回远程主机。远程主机比对解密后的字符串与原始字符串是否一致,如果一致,则认证成功。
2.3.4 通俗解释
配置SSH密钥是针对每台主机的。例如,当我在某台主机上使用Git操作远程仓库,并希望通过SSH协议push代码而不输入账号密码时,就需要配置SSH密钥。上传的密钥是当前主机的SSH公钥。如果更换为另一台主机,想要实现无密登录,则需要重新配置。
下面解释开头提出的问题:
(1)为什么要配置? 配置后可以在push代码时免去反复输入GitHub账号密码,更加方便。
(2)每台主机都要配置吗? 是的,每当使用新主机进行Git远程操作并希望实现无密登录时,都需要配置。不是每个账号配置一次就够,而是每台主机都需要配置。
(3)配置后为什么就不用密码了? 配置时,将当前主机的公钥添加到GitHub账号中,相当于将主机与账号关联。此时,GitHub信任该主机,认为是账号的主人在操作。所以,在这台主机上使用Git时,即使没有登录GitHub,也能直接push代码到远程仓库。但请注意,不能随意push代码到任何仓库,只能推送到自己的仓库或有权限的仓库。
3 将本地项目上传到自己的Github/Gitee仓库中
- 注册Github/Gitee账号并创建一个仓库,参考:【教程】GitHub新建仓库新手教程和如何用gitee创建仓库。
- 如果1)使用Git,就打开对应的项目文件夹,在项目文件夹里面点击鼠标右键,在鼠标右击弹出的菜单中,点击Git Bash Here;如果2)使用Pycharm的终端,需切换到项目文件夹路径,这里希望在PyCharm运行bash脚本,参考:【已解决】【Pycharm】如何在Pycharm中运行Bash命令行或.sh文件。
- 使用Git,以上传一个word文档为例,在存放文档的文件夹中,通过命令行窗口输入:
git init
,初始化一个新的 Git 仓库。 - 在 Github/Gitee 中 我们刚刚新建的仓库里,去复制仓库的地址,例如:
git@github.com:xxx/xxx.git
。 - 在命令窗口中输入:
git remote add origin git@github.com:xxx/xxx.git
,将远程仓库地址添加到本地仓库的远程关联中,origin 是一个远程仓库的默认名称,这里的 origin 可以被替换成任何你想要的名字,但 origin 是最常用的默认名称。如果你有多个远程仓库,你可以添加更多远程仓库并给它们指定不同的名字。例如,git remote add upstream git@github.com:xxx/xxx.git
,这样,就可以使用 upstream 来引用这个新的远程仓库了。不过,origin 通常用于你拥有写权限的仓库,而 upstream 通常用于你只有读权限的原始仓库。 - 在命令窗口中输入:
git pull origin master
,拉取远程仓库内容(这一步通常不需要),从远程仓库拉取内容并合并到本地。但在这个场景中,由于刚刚初始化了一个新的仓库,远程仓库是空的,所以这一步会失败,除非你想要先从远程仓库拉取一些已有的内容。 - 在命令窗口中输入:
git add .
,将当前目录下的所有文件添加到Git的跟踪列表中。 - 在命令窗口中输入:
git commit -m “提交项目”
,将跟踪的文件提交到本地仓库。这里的提交信息可以更具描述性,比如“添加Word文档”。 - 在命令窗口中输入:
git push origin master
,将本地的提交推送到远程仓库的master分支。如果默认分支名是main,使用git push origin main
。
注意:1)如果你clone下来一个别人的仓库,在此基础上完成你的代码,推送到自己的仓库可能遇到如下问题:error: remote origin already exists.表示远程仓库已存在。因此,先输入git remote rm origin
删除关联的origin的远程库,然后关联自己的仓库git remote add origin git@github.com:xxx/xxx.git
,最后git push origin master
,这样就推送到自己的仓库了。参考:https://blog.csdn.net/weixin_43916997/article/details/123645376?fromshare=blogdetail&sharetype=blogdetail&sharerId=123645376&sharerefer=PC&sharesource=qq_50993557&sharefrom=from_link。2)git 使用报错: fatal: Couldn’t find remote ref master的解决方法,原来远程仓库为空时,你直接pull的话会报错,参考:https://blog.csdn.net/weixin_43205760/article/details/103361249?fromshare=blogdetail&sharetype=blogdetail&sharerId=103361249&sharerefer=PC&sharesource=qq_50993557&sharefrom=from_link。 - 在GitHub或Gitee仓库页面刷新,你将看到本地项目已经上传到了远程仓库中 。
- 如果你想要在另一个位置获取这个仓库的副本,可以使用
git clone https://github.com/xxx/xxx.git
。 - 如果需要删除文件目录下的.git文件(通常是当你想将项目从一个Git仓库中移除时),可以使用
rm -rf .git
。但请注意,这会删除Git的配置和历史记录,使得该目录不再是一个Git仓库。
4 使用Git修改代码(基于Pycharm)
- 在 GitHub 或 Gitee 上通过
git clone
下载开源代码,或者在相关目录中创建自己的代码项目。需要注意,如果使用 SSH 方式下载,需提前配置 SSH 密钥。通常,开源代码仓库已经初始化了 Git 环境,例如:git clone https://github.com/milesial/Pytorch-UNet.git 或者 git clone git@github.com:milesial/Pytorch-UNet.git
- 开始的时候需要进行初始化设置,参考:git pycharm的使用 连接github
- 查看分支列表:
git branch
,分支前面的 * 表示当前所处的分支。 - 创建新分支:git branch 分支名称,基于当前分支,创建一个新的分支,此时,新分支中的代码和当前分支完全一致。
- . 切换分支:使用命令
git checkout 分支名称
切换到指定分支,在该分支上修改代码而不影响原始代码。此外,可以通过git checkout -b 分支名称
快速创建并切换到新分支。 - 修改项目中的相关代码。
- 将更改提交到缓存区:缓存整个项目:
git add .
,缓存部分文件:git add "xxx.py"
- 提交更改到本地仓库:使用命令
git commit -m "修改 xxx.py"
,将更新后的项目提交到当前分支。 - 查看仓库状态:使用
git status
检查文件的修改、添加或删除状态,以及是否存在未提交的更改。 - 回滚到某个提交:回退到上一个版本:
git reset --hard HEAD^
,回退到前三次提交之前:git reset --hard HEAD~3
,将更改保留在缓存区:git reset --soft HEAD^
- 合并分支: 切换到主分支:
git checkout master
,合并功能分支:git merge 分支名称
- 删除已完成的功能分支: 当功能分支的代码已合并到主分支后,可使用命令
git branch -d 分支名称
删除功能分支。 - 重命名本地分支: 使用
git branch -m 旧分支名称 新分支名称
修改分支名称。 - 退出 Bash 环境: 使用命令
exit
退出。
5 Github仓库自动更新
- Github仓库的自动更新结合 4 使用Git修改代码(基于Pycharm) 和 3 将本地项目上传到自己的Github/Gitee仓库中 步骤不变,更新了train.py, 就可以仅仅更新train脚本,
git add train.py
。步骤和本地项目上传到自己的Github/Gitee仓库一模一样。 - 在一个仓库中可以分多次提交多个文件夹,提交方式和上述 3 将本地项目上传到自己的Github/Gitee仓库中步骤相同。
6 Git切断与远程仓库的连接
- 连接远程仓库:
git remote add origin 仓库地址
- 查看远程连接:
git remote -v
- git取消与远程仓库的连接:
git remote remove origin
- 初始化仓库:
git init
- 连接新仓库:
git remote add origin 仓库地址
7 当需要修改github仓库中的文件名的时候
- 打开 Git Bash,输入命令:
git clone https://github.com/xxx/xxx.git
- cd 到文件所在目录:
$ cd XXX/
. - 重命名文件:
git mv oldname newname
- 再向远程仓库提交:
git commit -m "newname"
- 更新服务器:
git push origin master
参考:https://blog.csdn.net/wjinjie/article/details/116856440
8 删除Github某个文件夹
- 将远程仓库里面的项目拉下来:
git pull origin master
。 - 查看有哪些文件夹:
dir
。 - 删除target文件夹:
git rm -r --cached target
。 - 提交,添加操作说明:
git commit -m '删除了target'
。 - 将本次更改更新到github项目上去:
git push -u origin master
。
参考:https://blog.csdn.net/wudinaniya/article/details/77508229?fromshare=blogdetail&sharetype=blogdetail&sharerId=77508229&sharerefer=PC&sharesource=qq_50993557&sharefrom=from_link