# 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 :系统配置的



## 核心原理

![](https://pic.bitday.top/i/2025/03/19/u6ap8d-2.png)

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，可以绑定远程仓库

![](https://pic.bitday.top/i/2025/03/19/u6b609-2.png)

- 继续输入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**

![image-20240425104918549](https://pic.bitday.top/i/2025/03/19/u6adqm-2.png)

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

![image-20240425104950049](https://pic.bitday.top/i/2025/03/19/u69xzj-2.png)

**对于任何安卓项目，前两步都是通用的！！！**

3. 

![image-20240425105318414](https://pic.bitday.top/i/2025/03/19/u69e7z-2.png)

![image-20240425105341246](https://pic.bitday.top/i/2025/03/19/u6a79u-2.png)

这里的Remote填远程仓库地址，eg： https://github.com/zhangww-web/JianShu.git

**IDEA**

方法类似，先init本地仓库，

点击顶部菜单栏的 `Git -> Manage Remotes`。

![image-20250308102802964](https://pic.bitday.top/i/2025/03/19/u69pse-2.png)







**如果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分支

![](https://pic.bitday.top/i/2025/03/19/u692lj-2.png)



### 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（忽略某些文件）

![](https://pic.bitday.top/i/2025/03/19/u68fal-2.png)

**`.gitignore` 的生效规则**

- **对未跟踪的文件**：
  被标记的文件会被忽略，不会出现在 Git 提交列表中（IDEA 中会显示为灰色或隐藏）。
- **对已跟踪的文件**：
  如果 `application-local.yml` ​**之前已经被 Git 跟踪过**​（即曾经提交过），`.gitignore` 不会自动将其从版本控制中移除。它仍会出现在提交列表中。

**如果不小心`commit`了或者`git add`（暂存但未提交）如何撤销？**

例：如果在添加`.gitignore`文件前不小心提交了`.idea`文件夹，到项目根目录，git bash here 

```text
git rm -r --cached -f .idea 
git commit -m "Remove .idea from tracking"
```



**为什么`.gitignore`文件不放在`.git`文件夹中？**

**便于版本控制**：`.gitignore`文件放在项目的**根目录**中，可以和项目代码一起被版本控制，这样其他协作开发者也能看到和使用相同的忽略规则。如果把`.gitignore`放在`.git`文件夹中，它就不会被版本控制系统追踪到。



### 撤销Git版本控制

1.直接把项目文件夹中的.git文件夹删除即可(开启查看隐藏文件夹可看到)

2：使用 Git 命令（保留文件，仅移除版本控制）

```shell
git init  # 重新初始化（可选，非必须）
git rm -r --cached .  # 移除所有文件的跟踪状态
```



### 添加协作者

**协作者权限**

如果不使用组织的话，你也可以单独为每个仓库添加协作者。这样做的话，公钥仍然应该添加到你的个人设置中，但是你可以在每个仓库的设置中单独管理协作者访问权限。

**设置步骤包括：**

- 打开你想要添加协作者的仓库。
- 导航到仓库设置中的“Manage access”（管理访问）或“Collaborators”（协作者）部分。
- 添加协作者的GitHub用户名，并设置他们的访问级别。

![image-20240524100231379](https://pic.bitday.top/i/2025/03/19/u6ak14-2.png)

