Git命令之代码冲突排查 — status 和 stash 一、Git 工作流全景图[ 修改文件 ] [ 放入暂存箱 ] [ 打包生成记录 ] [ 同步到云端 ] ----------------- ----------------- ------------------ ------------------ | | | | | | | | | 工作区 |-----| 暂存区 |-----| 本地仓库 |-----| 远程仓库 | | (Working Dir) | | (Index) | | (Repository) | | (Remote) | | | | | | | | | ----------------- ----------------- ------------------ ------------------ ^ | | ^ | | | | | v v | ---------------- git reset -------------- git revert ------------------- (后悔药机制)1.1 工作区内容回退命令git checkout master取回特定文件git checkout refactor/chess-engine-extraction -- src/chess src/hooks清楚两个本地指针master指针 。在本地.git/ 文件origin/master指针。本地缓存上次 fetch 时远程 master 的快照。二、Git 命令操作1. 项目推送到远程初始化本次仓库 - 暂存区 - 本地提交 - 关联远程仓库 - 推送git init git add . git commit -m git remote add origin URL # 首次 -u 建立绑定关系 git push -u origin main2. 分支命名与改名main VS mastergit branch三种解决方式git branch -m master main # 本地分支重命名为maingit push -u origin main # -u 建立绑定关系默认针对远程的origin/maingit push -u origin master:main # 将本地master分支 推送至 远程的main分支Settings - Repository - Branch defaults3. 多人协作与冲突解决1. 推送被拒绝原因远程存在本地没有的代码解决git pull - 解决冲突后 - git add . - git commit - git push! [rejected] main - main (fetch first)error: failed to push some refs to :project/web/.githint: Updates were rejected because the remote contains work that you do nothint: have locally. This is usually caused by another repository pushing tohint: the same ref. If you want to integrate the remote changes, usehint: git pull before pushing again.hint: See the Note about fast-forwards in git push --help for details.# 危险强制覆盖远程 git push -u origin main --force# 如果本地是一个全新的项目远程没有历史强制允许合并 git pull origin main --allow-unrelated-histories # 手动编辑冲突文件 / 本地的文件和远程的文件保留一个 git checkout --ours README.md # 保留本地 git checkout --theirs README.md # 或者保留远程 git add README.md git commit # Git 会自动弹出合并信息的编辑窗口 git push -u origin main4. Git 状态翻译官git status本地仓库里没有任何“提交”Commit记录error: src refspec main does not match anyerror: failed to push some refs to 终端提示 (Status Output)状态解读建议操作On branch main当前处于 main 分支正常状态Untracked files: …… test.js未跟踪全新的文件想提交就git add fileChanges to be committed(例如new file: index.html)已暂存已执行过git add的文件会在下一次git commit被打包提交Changes not staged for commit(例如modified: README.md)已修改未暂存执行git add 文件名将其加入暂存区Unmerged paths:……both modified: README.md冲突中合并代码时发生了冲突需要人工解决必须解决冲突之后再git add 文件名更新快照”并“标记为已解决”Your branch is ahead of origin/main by 1 commit未提交本地比远程多 1 个提交还没推送到远程执行git pushYour branch is behind origin/main by 2 commits未拉取远程比本地多 2 个提交还没拉取最新代码执行git pullnothing to commit, working tree clean干净没有任何未提交的改动5. 临时寄存代码git stash核心命令# 1.恢复进度 # 取出最新的stash并从寄存柜中删除该记录 git stash pop # 取出指定的 stash并从中删除 git stash pop stash{1} # 取出最新的 stash但保留在柜子里方便多次应用 git stash apply # 2.清理寄存柜 # 删除某一个指定的 stash git stash drop stash{0} # 清空所有 stash不可找回 git stash clear1. 场景一开发中切换分支修 Bug# 1. 把当前未完成的修改存起来 git stash push -m 临时保存 # 2. 此时工作区干净切换分支 git checkout main # 3. 修完 Bug 并提交后切回原来的分支 git checkout feature # 4. 恢复之前的进度继续写代码 git stash pop2. 场景二 拉取远程代码前清理工作区git stash push -m 临时保存 git pull origin main # 顺利拉取最新代码 git stash apply # 手动解决冲突寄存代码和远程代码 # 查看状态 git status git diff --staged。# 展示暂存区 # 标记已解决 git add . # 针对“测试项目“ 进行 git stash后要清空暂存区域 git restore --staged . # Git 2.23 及以上版本 git reset HEAD . git stash list git stash drop3. 扩展场景三保存未跟踪的新文件默认情况下git stash只会保存已经被 Git 跟踪即执行过git add的文件# -u (或 --include-untracked) 可以把新建的、还没被跟踪的文件也一起存起来 git stash push -u -m 保存所有修改包括新文件