# 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 image-20240802181935378 然后打开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)