405 lines
12 KiB
Markdown
405 lines
12 KiB
Markdown
# Git
|
||
|
||
**linux上安装Git**
|
||
|
||
```text
|
||
sudo apt update
|
||
sudo apt install git
|
||
```
|
||
|
||
|
||
|
||
Git Bash:与linux风格接近,使用最多,推荐
|
||
|
||
Git CMD:windows风格
|
||
|
||
Git GUI:图形界面,不推荐
|
||
|
||
|
||
|
||
查看配置
|
||
|
||
git config -l :查看所有配置
|
||
|
||
git config --global --list 查看用户配置的
|
||
|
||
git config --system --list :系统配置的
|
||
|
||
|
||
|
||
## 核心原理
|
||
|
||

|
||
|
||
index是暂存区
|
||
|
||
respository 是本地代码仓库,保存着本地的各个版本代码
|
||
|
||
remote是远程仓库,通常是github/gitee码云
|
||
|
||
|
||
|
||
## 如何克隆别人已有的项目
|
||
|
||
1. 获取项目地址http
|
||
2. 打开本地文件系统,选择你需要保存项目的位置并打开cmd
|
||
3. git clone xxx,这个过程可能需要验证身份,输入用户名密码
|
||
|
||
|
||
|
||
## 如何将本地仓库与远程仓库连接?从零开始
|
||
|
||
**法1:**
|
||
|
||
- 首先在Github上新建一个代码仓库,拷贝地址 eg:https://github.com/zhangww-web/JianShu.git
|
||
|
||
- 在你本地文件夹下鼠标右键git bash here
|
||
- git init 新建本地仓库,生成.git隐藏文件,点进去有head文件。
|
||
- git remote add origin url,可以绑定远程仓库
|
||
|
||

|
||
|
||
- 继续输入git pull origin master(若你远程仓库为空,不需要这一步)
|
||
- git add .(.表示所有的,注意这个‘点’)—将本地文件提交至暂存区
|
||
- git commit -m '提交信息'
|
||
- git push origin master
|
||
|
||
|
||
|
||
**法2:**
|
||
|
||
第2种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去。然后push到远程仓库上去即可。要求远程仓库为新建的空仓库!!!
|
||
|
||
- 在空文件夹中git bash here(不用init!)
|
||
|
||
- 首先git clone https://github.com/zhangww-web/JianShu.git
|
||
|
||
- ##### 然后复制自己项目的所有文件到刚刚克隆下来的仓库中
|
||
|
||
- git push -u origin master
|
||
|
||
|
||
|
||
**法3:在android studio中集成**
|
||
|
||
1. **配置Git**
|
||
|
||

|
||
|
||
2. **关联自己的github**
|
||
|
||

|
||
|
||
**对于任何安卓项目,前两步都是通用的!!!**
|
||
|
||
3.
|
||
|
||

|
||
|
||

|
||
|
||
这里的Remote填远程仓库地址,eg: https://github.com/zhangww-web/JianShu.git
|
||
|
||
**IDEA**
|
||
|
||
方法类似,先init本地仓库,
|
||
|
||
点击顶部菜单栏的 `Git -> Manage Remotes`。
|
||
|
||

|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
**如果Share project on github一直失败,可以这样:**
|
||
**前面步骤不变,现在去github上新建一个空白仓库,获得一个remote url,然后本地仓库提交到该空白仓库,即可建立链接。**
|
||
|
||
|
||
|
||
## 迁移代码仓库
|
||
|
||
法一(推荐):访问令牌(Access Token)获取:点击右上角头像,选择“Settings”(设置)。
|
||
|
||
在左侧菜单中找到“Developer settings”(开发者设置),然后点击“Personal access tokens”(个人访问令牌)。点击“Generate new token”(生成新令牌),按照需要选择相应的权限(通常建议勾选 repo、read:org 等,根据你的实际需求)。生成后将令牌复制下来,填入 Gitea 的迁移界面中。
|
||
|
||
**直接推完整git信息,推荐**
|
||
|
||
|
||
|
||
法二:
|
||
|
||
本地有完整的代码已经git提交记录,不想丢失,推送到新的远程仓库:
|
||
|
||
在本地文件夹下git bash here
|
||
|
||
git remote add origin <新仓库地址>
|
||
|
||
git push -u origin --all
|
||
|
||
注意:只会将**你本地仓库已经 checkout 出来的所有分支**(即本地存在的分支)推送到新远程仓库中。
|
||
|
||
|
||
|
||
|
||
|
||
## Git 常用命令
|
||
|
||
### 提交代码
|
||
|
||
git add--> git commit --> git push
|
||
|
||
|
||
|
||
git add . 提交所有文件到暂存区,此时git status显示changes to be commited
|
||
|
||
git commit -m "describe描述性内容" 提交到本地仓库
|
||
|
||
|
||
|
||
### 分支操作
|
||
|
||
**git banch -a** 可以查看所有分支
|
||
|
||
git branch dev 可以新建dev分支
|
||
|
||
**git checkout dev** 可以切换到dev分支
|
||
|
||
git branch -d dev 删除dev分支
|
||
|
||
git branch -m dev cs :将dev分支修改名称为cs分支
|
||
|
||

|
||
|
||
|
||
|
||
### push失败问题
|
||
|
||
首先,科学上网一定能打开github的官网,但是idea中仍然无法push
|
||
|
||
此时查看你的代理服务器的端口,发现是7890
|
||
|
||
<img src="https://pic.bitday.top/i/2025/03/19/u696eo-2.png" alt="image-20240802181935378" style="zoom:67%;" />
|
||
|
||
然后打开git bash,输入以下代码:
|
||
|
||
**使用http代理**
|
||
|
||
git config --global http.proxy http://127.0.0.1:7890
|
||
git config --global https.proxy https://127.0.0.1:7890
|
||
|
||
**使用socks5代理**
|
||
|
||
git config --global http.proxy socks5://127.0.0.1:7890
|
||
git config --global https.proxy socks5://127.0.0.1:7890
|
||
|
||
**取消代理**
|
||
|
||
git config --global --unset http.proxy
|
||
git config --global --unset https.proxy
|
||
|
||
**或者使用国产的gitee或者自己服务器上搭建gitea进行代码托管!!!**
|
||
|
||
|
||
|
||
### 拉取代码与解决冲突
|
||
|
||
`git pull` 命令用于从远程仓库拉取(fetch)并合并(merge)最新的更改到本地仓库。它实际上**执行了两个操作**:
|
||
|
||
1. `git fetch`: 这个操作会从远程仓库下载最新的更改到本地仓库,但不会自动合并到当前分支。它将远程仓库的更改存储在本地仓库中,使你能够查看它们,但不会更改你当前工作目录中的文件。
|
||
2. `git merge`: 这个操作将远程仓库的更改合并到当前分支。如果有**冲突**,你需要解决冲突后再次提交合并的结果
|
||
|
||
|
||
|
||
**情况1:本地修改代码未提交,拉取代码的时候就会报错:**
|
||
|
||
*错误:您对下列文件的本地修改将被合并操作覆盖:*
|
||
*docker-compose.yaml*
|
||
*请在合并前提交或贮藏您的修改。*
|
||
*正在终止*
|
||
|
||
**暂存未提交的更改(git stash)**
|
||
|
||
如果还不想提交本地修改,可以将更改暂存起来:
|
||
|
||
```text
|
||
git stash
|
||
git pull
|
||
git stash pop
|
||
```
|
||
|
||
`git stash` 会将当前工作区的改动保存到一个栈中,拉取完成后通过 `git stash pop` 恢复修改。如果恢复过程中出现冲突,同样需要手动解决。
|
||
|
||
|
||
|
||
**舍弃本地修改**
|
||
|
||
如果确定不需要这些修改,可以放弃它们:
|
||
|
||
```text
|
||
git reset --hard
|
||
git pull
|
||
```
|
||
|
||
|
||
|
||
**但是推荐先提交本地的代码!!!**
|
||
|
||
```text
|
||
git add .
|
||
git commit -m "描述本次修改的提交信息"
|
||
git pull
|
||
```
|
||
|
||
|
||
|
||
**情况2:权限校验问题**
|
||
|
||
一般可以保持git网页端账号的登录状态,再pull,会有弹窗出来输入git的用户名和密码,成功后即可拉取。
|
||
|
||
|
||
|
||
**情况3 合并冲突,以pycharm为例**
|
||
|
||
**1.触发冲突解决界面**
|
||
当你执行 `git pull` 后如果出现冲突,PyCharm 会在右下角或版本控制工具窗口中提醒有冲突文件。你可以点击提示信息或在版本控制面板中找到冲突文件。
|
||
|
||
**2.启动合并工具**
|
||
双击冲突文件后,PyCharm 会自动打开三方合并工具。界面通常分为三部分:
|
||
|
||
- **左侧:本地修改**(当前分支的更改)
|
||
- **右侧:远程修改**(要合并进来的更改)
|
||
- **中间:合并结果**(你需要编辑的区域)
|
||
|
||
**3.手动选择并合并代码**
|
||
在合并工具中,你可以逐个查看冲突部分:
|
||
|
||
- 点击左侧或右侧的按钮来选择保留哪部分内容。
|
||
- 如果需要,**你也可以手动编辑中间**的合并结果区域,直接输入合适的代码。
|
||
- 合并工具通常会有跳转到下一个冲突的按钮,方便你逐个解决。
|
||
|
||
**4.保存合并结果并标记解决**
|
||
合并完成后,点击工具窗口上的“Apply”或“Accept Merge”按钮,保存你的修改。此时,冲突文件会标记为已解决。
|
||
|
||
**5.提交合并后的更改**
|
||
返回主界面后,你可以在版本控制面板中看到已解决的文件。检查确认无误后,通过 VCS 菜单或直接点击工具栏中的提交按钮,将合并结果提交到仓库。
|
||
|
||
|
||
|
||
## 其他Git相关
|
||
|
||
### SSH公私钥
|
||
|
||
公私钥生成
|
||
|
||
在linux中,使用账号密码链接github报错如下:
|
||
|
||
remote: Support for password authentication was removed on August 13, 2021. remote: Please see **https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls** for information on currently recommended modes of authentication. 致命错误:'https://github.com/zhangww-web/reptile.git/' 鉴权失败
|
||
|
||
*原因是linux不支持账号密码链接!!*
|
||
|
||
配置ssh,可以在git push的时候直接推送,github会通过ssh来验证你的身份。
|
||
|
||
如何在linux中配置私钥?
|
||
|
||
**生成 SSH 密钥**:
|
||
|
||
- 如果你还没有 SSH 密钥,可以使用以下命令生成:
|
||
|
||
```text
|
||
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
|
||
```
|
||
|
||
- 按照提示保存密钥文件。
|
||
|
||
**添加 SSH 密钥到 GitHub**:
|
||
|
||
- **复制生成的公钥内容**(通常在 `~/.ssh/id_rsa.pub` 文件中)。
|
||
- 登录到 GitHub。
|
||
- 进入 [SSH and GPG keys](https://github.com/settings/keys) 页面。
|
||
- 点击 "New SSH key" 按钮,粘贴公钥内容并保存。
|
||
|
||
**使用 SSH URL 克隆仓库**:
|
||
|
||
```text
|
||
git clone git@github.com:zhangww-web/reptile.git
|
||
```
|
||
|
||
|
||
|
||
SSH 连接 GitHub 并触发身份验证,流程如下:
|
||
|
||
1. **GitHub 发送一个随机挑战(Challenge)**
|
||
GitHub 服务器会向你的 Linux 服务器发送一个随机字符串,并用 **你的公钥** 进行加密。
|
||
2. **你的 Linux 服务器用私钥解密**
|
||
你的 SSH 客户端(`ssh` 命令或 `git`)会自动使用本地的 **私钥(id_rsa)** 进行解密。如果解密成功,证明你拥有匹配的私钥。
|
||
3. **返回解密后的数据**
|
||
你的客户端将解密后的数据返回给 GitHub。
|
||
4. **GitHub 验证解密结果**
|
||
GitHub 服务器检查解密结果是否匹配它最初发送的随机挑战。如果匹配,则认证成功。
|
||
|
||
**身份验证逻辑**:GitHub 发送加密数据 → 你的私钥解密 → 返回结果 → GitHub 确认一致性 → 认证成功。
|
||
|
||
|
||
|
||
**如果避免每次git pull都要验证身份?**
|
||
|
||
```text
|
||
git config --global credential.helper store //将凭据保存到磁盘上(明文存储):
|
||
```
|
||
|
||
|
||
|
||
### .gitignore(忽略某些文件)
|
||
|
||
**如果不小心commit了如何撤销?**
|
||
|
||
例:如果在添加`.gitignore`文件前不小心提交了`.idea`文件夹,到项目根目录,git bash here
|
||
|
||
```text
|
||
git rm -r --cached -f .idea
|
||
git commit -m "Remove .idea from tracking"
|
||
```
|
||
|
||
|
||
|
||
在.gitignore文件进行添加
|
||
|
||
**为什么`.gitignore`文件不放在`.git`文件夹中?**
|
||
|
||
- **用途不同**:`.git`文件夹由Git自动创建,用于存储Git的内部数据,包括所有提交记录、配置和对象等。用户一般不需要手动修改这个文件夹里的内容。而`.gitignore`文件是用户创建和维护的,用于定义哪些文件和目录应被Git忽略。
|
||
- **便于版本控制**:`.gitignore`文件放在项目的根目录中,可以和项目代码一起被版本控制,这样其他协作开发者也能看到和使用相同的忽略规则。如果把`.gitignore`放在`.git`文件夹中,它就不会被版本控制系统追踪到。
|
||
|
||
|
||
|
||
### 撤销Git版本控制
|
||
|
||
直接把项目文件夹中的.git文件夹删除即可(开启查看隐藏文件夹可看到)
|
||
|
||
若idea/pycharm报错:
|
||
|
||
COVID-19-Detector is registered as a Git root, but no Git repositories were found there.
|
||
|
||

|
||
|
||
|
||
|
||
|
||
|
||
### 添加协作者
|
||
|
||
**协作者权限**
|
||
|
||
如果不使用组织的话,你也可以单独为每个仓库添加协作者。这样做的话,公钥仍然应该添加到你的个人设置中,但是你可以在每个仓库的设置中单独管理协作者访问权限。
|
||
|
||
**设置步骤包括:**
|
||
|
||
- 打开你想要添加协作者的仓库。
|
||
- 导航到仓库设置中的“Manage access”(管理访问)或“Collaborators”(协作者)部分。
|
||
- 添加协作者的GitHub用户名,并设置他们的访问级别。
|
||
|
||

|
||
|