Git 实际应用
在实际应用中, Git
的操作往往都不是一个命令能解决的, 通常需要好几个命令组合使用
关联远程仓库
在Github
上创建远程仓库后可以关联到本地
bash
# 初始化本地仓库
git init
# 关联远程仓库
# name 是远程仓库的名称, 通常为 origin
# 示例: git remote add origin git@github.com:xxx/xxx.git
git remote add [name] [path]
# 查看关联的仓库
git remore -v
# 克隆远程仓库到本地
git clone [path]
# 将别人仓库的地址改为自己的
git remote set-url origin [your_path]
切换分支
新建仓库默认生成了master/main
分支
bash
# 查看本地分支
# * 代表当前所在的分支
git branch
# 查看本地和远程所有分支
git branch -A
# 新建分支并切换
git checkout -b [new_branch_name]
# 切换到已有分支
git checkout main
# 分支合并
git merge [branch_name]
# 推送分支
# 可以使用 git push -u origin master 将本地分支与远程分支关联
# 之后仅需要使用 git push 即可
git push origin main
# 拉取远程分支
git pull origin [branch_name]
本地内容有改动, 但是需要先拉取一下远程分支的内容
bash
# 工作区修改暂存
git stash
# 拉取远程分支
git pull origin [branch_name]
# 暂存修改恢复到工作区
git stash pop
撤销操作
bash
# 将暂存区文件恢复到工作区
git checkout [file_name]
# 将暂存区所有文件恢复到工作区
git checkout .
# 重置暂存区的某文件, 与上一次 commit 保持一致, 但工作区已更改的内容不变
git reset [file_name]
# 重置暂存区与工作区, 与上一次 commit 保持一致
# 如果是回退版本(commit), 将 file_name 改为 commit 的 hash 码即可
git reset --hard [file_name]
# 去掉某个 commit
# 实质是新建了一个与原来完全相反的 commit, 抵消了原来 commit 的效果
git revert [commit_hash]
reset
回退错误恢复处理
bash
# 查看最近操作记录
git reflog
# 恢复到前五笔操作
git reset --hard HEAD{5}
# 再次拉取代码
git pull origin [branch_name]
版本回退与前进
bash
# 查看历史版本
git log
# 若觉得这样的 log 不好看, 可以试试这个
git log --graph --decorate --abbrev-commit --all
# 检出到任意版本
# hash 码很长, 通常 6-7 位即可
git checkout a5d88ea
# 用老版本覆盖远程仓库
git push origin main --force
# 合并 commit
# 将最近 4 个 commit 合并为 1 个
# 多人协作时不建议使用
git rebase -i HEAD~4
# 回退到上一个版本
git reset --hard HEAD^
# 回退到上上个版本
# HEAD^^ 可以换作具体版本 hash 值
git reset --hard HEAD^^
# 退到某一个版本
# --hard代表丢弃工作区的修改, 让工作区与版本代码一模一样
git reset --hard [hash]
# 回退错了想要前进
# 这个命令保留了最近执行的操作及所处的版本
# 每条命令前的hash值, 则是对应版本的hash值
# 使用上述的 git checkout 或者 git reset 命令 则可以检出或回退到对应版本
git reflog
# 修改最近一次的 commit 信息
git commit --amend
代码提交和同步
bash
# 查看有变更的文件
git status
# 添加当前目录的所有文件到暂存区
git add .
# 提交暂存区到本地仓库区
git commit -m [message]
# 推送到远程仓库
# 第一次需要关联上
git push -u origin main
# 之后再推送就不用指明应该推送的远程分支了
git push
以
dev
分支为例, 需要先与pro
分支的代码合并然后推送到main
分支
bash
# 当前在 dev 分支
git checkout dev
# 查看有变更的文件
git status
# 添加当前项目所有已更改的文件到暂存区
git add -A
# 提交暂存区到本地仓库区
git commit -m [message]
# 拉取别的分支代码
git pull origin pro
# 如果有冲突手动解决
# 标记冲突已解决
git add .
# 提交合并结果
git commit -m "merge pro"
# 切换到 main 分支
git checkout main
# 确保 main 分支是最新的
git pull origin main
# 将 dev 分支合并到 main
git merge dev
# 推送 main 分支
git push origin main
代码撤销与撤销同步
撤销需要根据不同的状态执行不同的命令
已修改但未暂存
已修改过文件但未执行过任何git
命令
bash
# 列出所有的修改
git diff
# 列出某(几)个文件的修改
git diff x.js y.js
# 撤销项目下所有的修改
git checkout
# 撤销当前文件夹下所有的修改
git checkout .
# 撤销某几个文件的修改
git checkout x.js y.js
# 撤销新增的文件
git clean -f
# 撤销新增的文件和文件夹
git clean -df
已暂存但未提交
已经执行过git add
命令, 但未执行git commit
此时用
git diff
已经看不到任何修改, 因为git diff
检查的是工作区与暂存区之间的差异
bash
# 显示暂存区和本地仓库的差异
git diff --cached
# 暂存区的修改恢复到工作区
git reset
# 回到已修改状态, 修改的内容仍然在工作区中
git reset --soft
# 回到未修改状态, 清空暂存区和工作区
# 等价于 git reset 和 git checkout 两步操作
git reset --hard
已提交但未推送
已经执行过git commit
命令, 但未执行git push
执行完
commit
之后, 会在仓库中生成一个版本号(hash
值), 标志着此次提交, 之后任何时候, 都可以借助这个hash
值回退到此次提交
bash
# 比较两个分支之间的差异
git diff [branch_name_A] [branch_name_B]
# 查看本地仓库与本地远程仓库的差异
git diff main origin/main
# 将本地仓库回退到与远程仓库一致
git reset --hard origin/master
# 回退到本地仓库上一个版本
git reset --hard HEAD^
# 回退到任意版本
git reset --hard [hash]
# 回退且回到已修改状态, 修改仍保留在工作区中
git reset --soft/git reset
已推送
已经执行过git push
命令
bash
# 强制覆盖远程分支
git push -f orgin master
# 如果之前已经用 -u 关联过, 则可省略分支名
git push -f
注意
-f
参数表示强制覆盖, 一般情况下, 本地分支比远程要新, 所以可以直接推送到远程, 但有时推送到远程后发现有问题, 进行了版本回退, 旧版本或者分叉版本推送到远程, 需要添加-f
参数, 表示强制覆盖