Skip to content

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参数, 表示强制覆盖