概念
工作区,暂存区,本地仓库,远程仓库
- 工作区
你当前正在修改的文件所在的地方(即本地项目文件夹)。这里的文件是"未追踪的"或"已修改但未提交的"。
- 暂存区
用于临时存放你的修改,等同于"准备提交"的区域。 你需要先把修改"添加"到暂存区,再进行提交。
- 本地仓库
存储在你电脑 .git 目录中的完整项目历史记录。 只有当你执行 commit 之后,修改才会正式存入本地仓库。
- 远程仓库
存储在远程服务器上的 Git 仓库(例如 GitHub、GitLab、Gitee)。 只有当你执行 git push,本地提交才会被同步到远程仓库。
冲突
markdown
<<<<<<< HEAD
这里是你本地的修改
=======
这里是远程的修改
>>>>>>> remote-branch
解决冲突后,add,commit
查看相关
git status
查看修改状态,有哪些文件被修改或被暂存 ,命令简写gst
git stash list
查看暂存的代码 记录
git log
查看之前的 commit (包含提交id等信息;按q退出查看
git log --all
git branch
查看本地 所有分支 和 当前所在分支
查看远程仓库
git remote show
会返回仓库信息
git remote -v
会返回创建者 及 仓库的 git地址
操作相关
git add <文件名>
把某个修改文件,加入到暂存区
git add .
把所有修改,加入到暂存区(后续才能 提交到本地仓库)
git commit -m '修改说明'
把被暂存的文件,提交到本地仓库
git pull
把当前分支 远程仓库的代码 ,拉取到本地仓库
git push
把当前分支 本地的提交,推送到远程仓库
git checkout xxx
切到某分支
git checkout -b sss
从当前分支,创建 并切到 一个新分支
git branch -m ooo nnn
当前分支重命名, ooo为旧名,nnn为新名
- 推送到远程
原则,先pull,后push
git push -u origin 分支名
新分支第一次推送
- 删除
删除某分支(需先切到其他分支
git branch -D xxxxx
-D 表示强制删除
git branch -d xxxxx
-d 用于删除 已合并过的 分支
删除远程分支
git push origin -d xxxxx
// -d 表示删除;git push <仓库名> -d <分支名>
- 合并分支
可以
merge
或rebase
;后者慎用,适用于个人分支
场景:从D 切出 A ,A修改代码并push, D也修改了代码
====== 用 merge
先切到D分支,执行:
git merge A
把 A分支的修改,合并到当前分支
git push
(有合并 分叉线
====== 用 rebase
先切到A分支,然后
git rebase D
把D 的修改合过来A,并变基为 A
再切到 D分支,然后
git merge A
把A 合并到D
git push
此时完成合并(一条直线,没有分叉;A分支可以删了
撤销相关
- 情况1 已commit 未push
git reset --soft xxxx
xx为commit ID,表示需要回滚到 哪次commit
git reset --mixed xxx
同上,并且撤销 add
- 情况2 已commit 且push
git reset --hard xxxx
xx为commit ID,表示需要回滚到 哪次commit,且其后面的commit 和记录 都会消失清除,包括工作区代码;慎用!!
git revert xxxx
xx为commit ID,表示撤销哪次提交; 该次提交记录还在。
特殊
- commit修正
对上一次commit进行修正(可能是因为有代码遗漏需补充;或需修改说明描述;或少提交了某个文件)
git commit --amend -m '说明描述'
这样,提交了修改,不会产生新的commit记录, 但仍算作上一次commit
rebase
git rebase -i HEAD~2
合并提交; 2表示合并 此前的2次提交。可自定义
如果变基过程中出错,需要中断,用 git rebase --abort
避免长时间不同步:如果 feature 分支开发时间过长,应该定期 rebase ,保持代码最新
bash
git checkout feature/login
git rebase main 将 feature/login 变基到 最新的 main
场景
场景1: 在 A分支 修改到一半,有新任务 需切去其他分支做。(无法切,因为需commit,但是还不足以commit)
git stash
先暂存代码(注意,并不是提交);会把代码 先存入一个栈
然后切去其他分支 开发.....完了之后,切回A分支 (这时还没有 暂存的代码)
执行: git stash pop
恢复最近一次暂存的代码;并删除 栈记录
也可以 git stash apply
(不会删除 栈记录)
如果需要恢复特定的,用
git stash apply stash@{1}
场景2:从dev切出 A,B分支,A 分支修改了些代码;有时,若 B 需要 A所修改的代码
把A分支的修改 先push到远程
切到B分支
git cherry-pick xxxxxxxx
// xx 为A的 commit ID;
这样就把A的修改 合到B分支了
场景3:建立项目仓库
cd 到本地某个目录,执行
git init
本地仓库初始化
git clone <仓库地址>
从远程仓库克隆项目到本地
git pull origin <分支名>
拉取最新代码
场景4: 远程代码比本地新,导致 push 失败
git pull -r
即 git pull --rebase origin main
若有冲突,则解决冲突。解决完,执行
git rebase --continue
git push
场景5:误提交到错误的分支。如,本来应该提交到 dev 分支,结果提交到了 main
- 若未push
先将提交转移到正确的分支:
xml
git checkout dev
git cherry-pick <提交ID>
然后,回滚 main
css
git checkout main
git reset --hard HEAD~1
- 若已push
先在 main 上撤销提交:
css
git revert <提交ID>
git push origin main
在 dev 上重新提交:
perl
git checkout dev
git cherry-pick <提交ID>
git push origin dev
场景5:执行了 git checkout . 或 git reset --hard,导致未提交的修改丢失
git reflog
列出所有最近的 Git 操作记录,找到正确的 HEAD 位置
然后 回滚到某个提交:
git reset --hard <提交ID>
如果 reset 也无法找回
使用 git fsck --lost-found 查看丢失的对象。 但如果是 checkout .,可能无法恢复。