Git使用笔记

常用命令

git pull                #拉取代码到本地
git add . #将文件添加到暂存区
git commit -m "xx" #提交代码,并填写描述
git push #推送代码到远端
git status #显示所有需提交的文件
git branch #显示当前代码库中所有的本地分支
git branch xx #创建一个新分支xx
git branch -d xx #删除指定分支xx
git checkout xx #切换到分支xx
git checkout -b xx #创建一个分支xx,并切换到新分支
git merge xx #将指定分支xx的历史记录合并到当前分支
git stash save #临时保存所有修改的文件
git stash pop #恢复最近一次存储的文件

文件忽略

软件项目使用git提交远程仓库时,如果需要忽略某些文件(如缓存文件、框架核心文件)的变更,可以在项目的根目录下创建.gitignore文件,并罗列需忽略的文件或者文件夹。

如下为PHP Yii2下的.gitignore文件内容:

.idea/
.project
.settings
/vendor
assets/
/runtime
/Runtime
/upload

但有时候忽略文件不起作用,其原因是:git设置本地忽略时,必须保证远程仓库分支上没有这个要忽略的文件;否则本地的ignore将不起作用。
解决方式:删除要忽略的文件并提交远程仓库,ignore该文件。

git设置

cat .git/config
git remote set-url origin ssh地址

当尝试将 feature/v20 分支合并到 develop 分支时,出现大量冲突,希望将 develop 分支的代码直接替换为 feature/v20 分支的代码,可以考虑以下几种方法:

1. 强制重置 develop 分支

  • 警告: 这会丢失 develop 分支上的所有未提交的更改。请谨慎操作,并确保你已经备份了重要的数据。
  • 步骤:
    git checkout develop
    git reset --hard feature/v20
    • git checkout develop: 切换到 develop 分支。
    • git reset --hard feature/v20: 将 develop 分支的 HEAD 指针强制重置到 feature/v20 分支的最新提交,丢弃 develop 分支上的所有本地更改。

2. 重新创建 develop 分支

  • 步骤:
    git branch -D develop  # 删除现有的 develop 分支
    git checkout feature/v20 # 切换到 feature/v20 分支
    git branch develop/v20 # 基于 feature/v20 分支创建一个新的 develop 分支
    • 首先删除旧的 develop 分支,然后基于 feature/v20 分支创建一个新的 develop 分支,这样 develop 分支的代码就和 feature/v20 分支完全一致了。

注意事项

  • 强制重置或重新创建分支是比较极端的操作,会丢失数据。在执行之前,请务必确认你已经备份了重要的代码。
  • 如果 develop 分支已经被推送到了远程仓库,那么强制重置会造成历史记录的混乱。建议在本地进行操作,然后再将新的 develop 分支推送到远程。
  • 如果 develop 分支上有其他开发者正在协作,强制重置可能会导致他们的工作丢失。在执行操作之前,请与团队成员进行沟通。

其他建议

  • 仔细分析冲突: 在强制重置之前,可以仔细查看冲突的文件,了解冲突的原因。
  • 利用 git diff 命令 比较两个分支之间的差异,帮助你更好地理解代码的变化。
  • 考虑使用 git mergetool 来可视化地解决冲突。
  • 如果可能,尝试重新创建 feature 分支,并确保在开发过程中及时合并最新的 develop 分支,以减少冲突发生的频率。

Git pull 报错 “Please, commit your changes or stash them before you can merge” 的解决方法

出现这个错误的原因:

当你执行 git pull 命令时,Git 会尝试将远程仓库的最新更改合并到你的本地分支。但是,如果你在本地分支上有一些未提交的修改,Git 就会拒绝合并,因为这可能会导致冲突。所以,Git 会提示你:请先提交你的修改或者将它们暂存起来,然后再进行合并。

解决方法:

1. 提交你的修改
  • 查看修改: 使用 git status 命令查看你有哪些未提交的修改。
  • 暂存修改: 使用 git add <文件名> 或 git add . 将修改暂存。
  • 提交修改: 使用 git commit -m "你的提交信息" 将暂存的修改提交。
  • 拉取远程分支: 提交完后,再执行 git pull。
2. 暂存你的修改
  • 暂存修改: 使用 git stash 命令将当前工作区的所有修改暂存起来。
  • 拉取远程分支: 执行 git pull。
  • 恢复暂存的修改: 如果想恢复暂存的修改,可以使用 git stash pop。
详细解释:
  • git status: 查看你当前的工作区状态,哪些文件被修改了,哪些文件被暂存了。
  • git add: 将你修改的文件添加到暂存区。
  • git commit: 将暂存区的文件提交到本地仓库。
  • git pull: 从远程仓库拉取最新的代码,并合并到本地分支。
  • git stash: 将当前工作区的所有修改暂存起来,但不提交。
  • git stash pop: 应用最新的 stash,并将它从 stash 栈中删除。
总结

当遇到这个错误时,最安全的做法是先提交你的本地修改,然后再执行 git pull。如果你不想立即提交,也可以使用 git stash 将修改暂存起来。

选择哪种方法取决于你的具体情况:

  • 如果你想保留这些修改: 提交或暂存。
  • 如果你不想保留这些修改: 可以直接丢弃这些修改,然后执行 git pull。

注意:

  • 强制覆盖本地修改: 如果确定要丢弃本地修改,可以使用 git fetch 和 git reset --hard origin/master (假设远程分支是 master),但这会覆盖你所有的本地修改,请谨慎操作。
  • 解决冲突: 如果在 git pull 的过程中出现冲突,你需要手动解决冲突,然后使用 git add 和 git commit 来提交解决后的结果。
  1. ​直接基于 feature/v30 创建新 develop 分支​
    git checkout feature/v30 # 切换到feature/v30分支
    git branch -D develop # 强制删除本地develop分支(谨慎!)
    git checkout -b develop # 基于feature/v30创建新的develop分支

删除远程 develop 分支 git push origin —delete develop

  1. ​强制推送到远程(如果需要)​​
    git push origin develop —force # 强制覆盖远程develop分支(确保团队知晓!)

sudo -s
git checkout develop -f
git branch
git pull
git status
git pull origin develop

git stash # 保存当前更改
git checkout -f master
git branch -D develop # 强制删除本地 develop 分支
git checkout -b develop # 从当前分支创建并切换到 develop 分支
git branch -a

1. 首先中止当前的合并(如果正处于冲突状态)

git merge —abort

2. 重新执行合并,但指定在遇到冲突时全部使用 feature/v87 的代码

git merge -X theirs origin/feature/v87

git reset HEAD

git checkout master
git branch -D develop
git pull
git checkout develop

git 远程有代码未拉下来导致代码无法提交,怎么办 提示为:Updates were rejected because the tip of your current branch is behind its remote counterpart.

这个错误表明你的本地分支 feature/v28 比远程分支 feature/v28 落后(non-fast-forward),Git 默认不允许直接覆盖远程代码,所以拒绝推送。

解决方法
1. 先拉取远程代码并合并(推荐)

git pull origin feature/v28

• 如果没有冲突,Git 会自动合并远程代码到本地。

• 如果有冲突,Git 会提示你手动解决冲突,然后 git add 和 git commit 合并后的代码。

2. 再次尝试推送

git push origin feature/v28


3. 如果不想合并(强制覆盖远程分支,慎用!)
如果你确定远程分支的代码不需要保留,可以强制推送(会覆盖远程分支):

git push origin feature/v28 --force
# 或更安全的强制推送(推荐)
git push origin feature/v28 --force-with-lease

⚠️ 注意:强制推送会覆盖远程分支,可能导致其他人的代码丢失,仅在你完全确定远程分支不需要保留时使用!


总结
| 情况 | 解决方案 |
|———|—————|
| 远程有更新,你想合并 | git pull origin feature/v28 → 解决冲突 → git push origin feature/v28 |
| 远程有更新,但你不想合并(强制覆盖) | git push origin feature/v28 --force-with-lease(谨慎使用) |
| 远程没有更新,但 Git 仍然报错 | 可能是缓存问题,尝试 git fetch + git rebase |

推荐做法:先 git pull 合并远程代码,再 git push,避免覆盖他人代码。

git reset:分支、暂存区与工作区

使用前先区分三份状态:当前提交 HEAD、暂存区(index)和工作区。下面讨论的是 git reset [模式] <提交> 这种重置提交的形式;正常附着分支时,它会移动当前分支指向,分离 HEAD 时则只移动 HEAD。

模式 HEAD/当前分支指向 暂存区 工作区
--soft 移到目标提交 保持不变 保持不变
--mixed(默认) 移到目标提交 重置为目标提交的内容 保持不变
--hard 移到目标提交 重置为目标提交的内容 按目标提交重置受跟踪内容

例如下面三条是独立选择的示例,不是依次执行的步骤:

# 撤回最近一次提交,但保留暂存区与工作区现状。
git reset --soft HEAD~1

# 撤回最近一次提交,保留工作区,差异通常变成未暂存修改。
git reset --mixed HEAD~1

# 丢弃受跟踪文件的本地修改,重置到指定提交;执行前确认要保留的内容。
git reset --hard HEAD~1

--hard 还可能删除妨碍写入目标提交的未跟踪文件或目录,但它并不是通用的“清理所有未跟踪文件”命令。不能假定未提交内容总能从 reflog 找回:reflog 主要记录引用移动,不会替工作区保存全部历史。

只取消暂存某个文件

git reset HEAD -- path/to/file.php

这种带路径的形式重置的是该路径的暂存状态,不移动 HEAD,也不改变工作区。较新 Git 也可使用:

git restore --staged -- path/to/file.php

已共享的提交要考虑协作影响

reset 不会自动修改远端,但后续强制推送可能改写大家正在使用的历史。如果目的是撤销已共享提交带来的变更,可根据情况选择 git revert 新建反向提交。操作前先用 git status、git diff、git diff --cached 核对三份状态。

参考:Git reset 官方文档。

身份配置、SSH 与分支命令

提交者信息与登录身份不同

git config --global user.name "Your Name"
git config --global user.email "you@example.com"

这两项用于提交记录中的身份信息,并不是登录 GitHub 的账号密码。--global 影响当前用户的默认配置;只想配置当前仓库时省略它。

SSH 密钥应先检查已有文件,再生成新密钥,避免覆盖原有密钥。服务支持时,可参考 GitHub 文档使用:

ssh-keygen -t ed25519 -C "you@example.com"

旧环境有兼容需要时也可按服务要求使用 RSA,例如 ssh-keygen -t rsa -b 4096 -C "you@example.com"。-C 是注释,不是身份认证本身;需妥善保存私钥,并将公钥配置到对应服务。参考 GitHub SSH 密钥说明。

查看状态与分支

git status
git branch -a

branch -a 显示本地分支和本地保存的远端跟踪引用,不会主动获取远端最新状态。需要更新这些信息时可按工作流程执行 git fetch origin。

合并另一条分支

git merge master-ios

它把指定分支合并到当前检出的分支,不会自动切换分支。master-ios 只是历史项目的分支名,使用前要核对当前分支和目标引用。

如果确实要连接两套没有共同祖先的历史,Git 提供:

git merge master-ios --allow-unrelated-histories

这是明确允许合并无关历史的选项,不是普通冲突或所有合并失败的通用修复。--allow-urelated-histories 少了字母 n,是拼写错误。遇到意外报错时应先确认远端、分支和仓库来源,而不是反复加此参数重试。参考 git merge 文档。

普通推送与历史改写

git push -u origin master

这会推送本地 master,并设置相应的上游关系;它不一定是推送当前分支。项目使用其他分支名时应替换目标。

历史命令 git push origin master:master --force 中,冒号左侧是本地来源、右侧是远端目标,--force 会尝试绕过通常的非快进保护,可能覆盖协作者的提交,也可能被服务端规则拒绝。

确实需要改写已共享历史时,应先协调并核对远端状态,通常优先考虑带期望检查的 --force-with-lease:

# 仅适用于已确认需要改写此远端分支历史的情况。
git push --force-with-lease origin master:master

它能提供一定的并发更新保护,但不保证业务上“安全”,未显式指定期望值时还依赖本地远端跟踪引用的状态;后台 fetch 等行为也可能影响保护前提。不能把它作为普通推送失败后的固定下一步。参考 git push 文档。


文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
赏

留言

想法、疑问或勘误,都可以写在这里。留言会公开显示。

正在准备留言区…

 上一篇
书单心愿墙 书单心愿墙
罗列一些自己后续要读的书籍或者文章: 《黑客与画家》 《UNIX编程艺术》 《异类》 《羊皮卷》——《选择的力量》 《优秀到不能被忽视》 《无言的宇宙》 《数学女孩》
2018-06-01
下一篇 
PHP实现AES加解密 PHP实现AES加解密
系统中的账号信息在进行存储的时候,需要做相应的加密处理;比如用户密码一般是以密文形式存储,而且是不可逆的,常用的就是md5加密;而对于某些账户信息(如:手机号码、银行卡号等)就需要进行可逆加密(如:AES)保存,这样既可以保证数据的安全性,
2018-04-20