md_files/Java/git基本操作.md

405 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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忽略某些文件
**如果不小心commit了如何撤销**
例:如果在添加`.gitignore`文件前不小心提交了`.idea`文件夹到项目根目录git bash here
```text
git rm -r --cached -f .idea
git commit -m "Remove .idea from tracking"
```
![](https://pic.bitday.top/i/2025/03/19/u68fal-2.png)在.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.
![image-20240729113527314](https://pic.bitday.top/i/2025/03/19/u68ka9-2.png)
### 添加协作者
**协作者权限**
如果不使用组织的话,你也可以单独为每个仓库添加协作者。这样做的话,公钥仍然应该添加到你的个人设置中,但是你可以在每个仓库的设置中单独管理协作者访问权限。
**设置步骤包括:**
- 打开你想要添加协作者的仓库。
- 导航到仓库设置中的“Manage access”管理访问或“Collaborators”协作者部分。
- 添加协作者的GitHub用户名并设置他们的访问级别。
![image-20240524100231379](https://pic.bitday.top/i/2025/03/19/u6ak14-2.png)