GIT brief introduction
❓what is git and what can it do for me?
- 代码/文件管理工具
- Keeps track of changes to code
- Test changes to code without losing the original
- Revert back to old versions of code.
git 基础指令
git init初始化仓库(repositories)git add <filename>提交一个文件到缓冲区:git add .全部提交
git diff显示所有未add的修改git diff <filename>显示与暂存区文件的差异git diff <version> <filename>显示某个文件两个版本之间的差异
git commit -m "message"把缓冲区的内容提交到分支:git commit -am "message"可实现add和commit两步合并-am会把已被 Git 跟踪(tracked)的已改文件自动暂存并提交,但不会包括未被跟踪(untracked/new)文件。要提交新文件仍需先git add。
git status仓库状态,你现在在哪个branch,文件情况git branch显示所有branchgit branch <name>创建新的branchgit checkout <name>跳转到对应branchgit checkout -b <name>同时完成上面两个操作git branch -D <name>删除分支
merge conflict example:
<<<<<<<<<<HEAD
int b = 2; (你的修改)
============
int b = 0; (别人的修改)
>>>>>>>>>> 哈希值,标识提交
int b = 2;或者把两条按自己的方式合并一下。
git log查看提交等等日志git log --all --graph --decorate可视化历史记录
git reset回滚:git reset --hard <commit>输入需要的提交hash值,可在log里查到git reset --hard origin/master回滚到remote branch
git merge <name>把某一分支与当前所在分支merge,merge到当前这个分支git mergetool使用工具处理合并冲突
pull request对他人的库修改后提交的request,希望能merge,见github。
远端操作
git remote列出远端git remote add <name> <url>添加远端
git clone <url>,从远程仓库中copy一份,存在自己的电脑里git pull把线上仓库更改下载到本地仓库,可能出现git fetch从远端获取对象/索引+git merge等价于git pull
git push提交到远程仓库git push <remote> <local branch>:<remote branch>将对象传送至远端并更新远端引用git push -u origin xx本地分支xx第一次传到远端-u(--set-upstream)把xx分支推送到远程,同时把本地xx与远程建立追踪关系,以后就可以直接git push
撤销
git commit --amend: 编辑提交的内容或信息git reset HEAD <file>: 恢复暂存的文件,HEAD是指分支名- 工作区有未暂存内容强制回退:
git reset --hard HEAD #永久删除工作区和暂存区的所有未提交修改
- 工作区有未暂存内容强制回退:
git checkout -- <file>: 丢弃修改git restore: git2.32 版本后取代git reset进行许多撤销操作git restore --source=<目标版本> <文件路径>,<目标版本>:可以是 Commit Hash(如a1b2c3d)、分支名(如main)、相对位置(如HEAD~3` 表示往回数 3 个版本)- 不记得hash:
git log --oneline -- <文件路径>
git revert HEAD: 已经提交了一次,回退一次
reset不同操作
| 命令 | 仓库历史指针 | 暂存区(Index) | 工作区(文件) | 适用场景 |
|---|---|---|---|---|
git reset --soft <提交ID> |
✅ 回退 | ❌ 不动(保留原改动) | ❌ 不动 | 想把最近几次提交合并成一个,重新提交 |
git reset --mixed <提交ID>(默认) |
✅ 回退 | ✅ 清空(回到未暂存状态) | ❌ 不动 | 想把之前提交的改动撤回来,保留代码慢慢改 |
git reset --hard <提交ID> |
✅ 回退 | ✅ 清空 | ✅ 强行覆盖 | 彻底不要这之后的代码了,本地和仓库完全变成旧版 |
举例:想彻底回到 3 个提交前的状态(所有文件都变成那时候的样子):
git reset --hard HEAD~3
🚨 致命警告:如果这些提交已经推送到远程仓库,并且别人拉取过,绝对不要用
git reset --hard,否则别人下次推送时会和你冲突得一塌糊涂,协作项目直接崩盘。
更多日用补充
.gitignore基本用法
- 直接一行一行输入你要git忽略的文件即可
*作为通配符依然成立- 如果是忽略所有文件中的
__pycache__/文件,就直接写__pycache__/ - 忽略根目录下的文件示例:
/debug.log - 忽略
hw01/ok这个文件(相对路径):hw01/ok - 忽略任意深度的
tests目录:**/tests/ - 取反,不忽略这个文件(例外):
!important.pyc
注意已经追踪的文件不会自动被忽略,移除索引操作:
git rm -r --cached __pycache__/:--cached表示只从 git 移除,不删本地文件git rm -r --cached .: 可以先直接把所有文件都从index中移除,然后再用add重新添加即可-r是recursive,对于目录操作的时候需要递归,逻辑是删目录时 git 默认拒绝(怕你误删一堆文件),加-r表示"我知道这是个目录,递归删掉里面所有东西",这个逻辑在shell命令里通用规则,比如rm -r dir/等等