git 常见问题 10 问
1.如何准备 git 环境?
step1. 安装git
进入 git bash 官网下载 页面并按照提示安装
- windows 下载安装包后按照提示安装即可
- mac 可以使用 HomeBrew 安装 git
$ brew install git
step2. 打开 CMD 或 Git Bash,配置个人的用户名称和电子邮件地址
配置用户信息
$ git config --global user.name "你的用户名"
$ git config --global user.email "你的邮箱"
查询用户信息
- 查询特定配置
$ git config --global user.name
$ git config --global user.email
- 查询所有用户配置
$ git config -l
删除全局配置
$ git config --global --unset user.xxx
2.git 如何配置别名
配置别名
$ git config --global alias.co checkout
$ git config --global alias.ss status
$ git config --global alias.cm commit
$ git config --global alias.br branch
$ git config --global alias.rg reflog
删除配置
$ git config --global --unset alias.xxx
3.如何拷贝 git 仓库到本地?
$ git clone git仓库地址
4.如何从本地已有分支创建分支?
# 查看本地有哪些分支
$ git branch
# 切换到指定分支
$ git checkout branchName
# 创建分支
$ git checkout -b newBranchName
5.如何拉取远程分支并创建本地分支?
# 从远程获取代码库
$ git fetch
# 预览本地存储库中的所有分支
$ git branch -r
# 基于特定远程分支创建分支
$ git checkout -b test origin/test
6.如何回退版本至某次提交?
step1. 找到这次提交的 commit id,可以使用 git log
命令,根据自己的提交日志及时间查找 id
或者使用 git log --oneline
使 git log 信息显示更简洁
step2. 使用 git reset
命令将本地分支强制重置为 id 时的状态,如下
$ git reset --hard commit-id
注:commit-id 是 git log 中找到的 id。
step3. 如果需要将此回退推送到远程仓库,可以使用强制推送,如下
git push origin HEAD --force
需要注意的是,这个提交会将远程仓库强制覆盖,请谨慎使用,稍后也会讲解 push --force
的使用
如果我们 git merge
后发现 merge 错了,或者仅仅想撤销刚才的操作,可以使用git reset --hard HEAD~
即可
7.开发新功能时,需要切换另一分支修复 bug,又不想提交当前分支代码怎么办?
场景
当你正在修改 A 分支的代码,而此时 B 分支有紧急任务。 这时你需要切换到 B 分支先执行紧急任务。 但是,你的 A 分支代码又修改了一半,你不想提交一个 commit,该怎么办呢?
解决方案
A:直接抛弃当前修改,git rest --hard
,这个属于病急乱投医
B:匆忙提交当前代码,会多一个 commit 记录,让你的 git 凌乱不堪
C:通过git stash
先将当前修改缓存下来,然后再切换分支,这个才是最优雅的方案
关于 git stash
运行 git stash
命令,git 会将当前代码以栈的形式缓存。
注:git stash
对新增的文件进行缓存是不起效果的,对于新增的文件,要进行缓存的话,需要先添加到暂存区(git add .)
才可以进行缓存。
恢复
当 B 分支任务修改完后,切换回 A 分支,只需要使用 git stash apply
将暂存区的数据进行恢复。
8.有多个 commit 提交,想合并使提交历史清爽?
背景
开发过程中,本地通常会有无数次 commit ,可以合并相同功能
的多个 commit,以保持历史的简洁。
git rebase
# 从 HEAD 版本开始往过去数 5 个版本
$ git rebase -i HEAD~5
# 合并指定版本号(不包含此版本)
$ git rebase -i [commitid]
说明:
-i(--interactive)
:弹出交互式的界面进行编辑合并[commitid]
:要合并多个版本之前的版本号,注意:[commitid]
本身不参与合并
合并步骤
step1. 使用 git log --oneline
查看 log 记录使用,以下为实验的 5 个 commit
step2. 使用 git rebase -i
选择要合并的 commit,比如要合并 5 个提交,则使用
$ git rebase -i HEAD~5
要合并的 5 次提交
这里只关注
pick
、squash
、fixup
这三个命令:
pick
:使用此提交不做操作squash
:将指定的提交合并到上边的pick请求中,保留提交信息(如果需要修改注释,则使用此方法)fixup
:与squash
类似,但不保留提交信息(如果不需要修改注释,则使用此方法)
step3. 编辑要合并的版本信息,保存提交,多条合并会出现多次(可能会出现冲突)
-
使用
fixup
合并或者使用简写
然后:wq保存退出后是注释界面,合并完成
-
使用
squash
合并然后 :wq 保存退出后是注释界面,因为保留了所有 commit 的提交信息,会进入注释修改页面
根据需要修改注释信息即可
step4. 修改注释信息后,保存提交,多条合并会出现多次
step5. 推送远程仓库或合并到主干分支
# 由于我是一个人开发,故强制推送到远程仓库
$ git push --force origin master
9.本地代码提交跟远程冲突时,想强制覆盖远程代码该怎么办?
push -force
强制推送
$ git push origin HEAD --force
众所周知,git 的 push -force
指令是不推荐被使用的,--force
会使用本地分支的提交覆盖远端推送分支的提交。也就是说,如果其他人在相同的分支推送了新的提交,你的这一举动将“删除”他的那些提交!所以这种只适合于你自己一人维护的分支强制推送
,对于多人维护的分支,我们应该采用更加安全的方式。
--force-with-lease
更安全的方式
使用了 --force-with-lease
参数之后,上面那种安全问题就没有那么危险了。
使用此参数推送,如果远端有其他人推送了新的提交,那么推送将被拒绝,这种拒绝和没有加 --force
参数时的拒绝是一样的。
walterlv$ git push --force-with-lease To https://github.com/walterlv/walterlv.github.io.git ! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://github.com/walterlv/walterlv.github.io.git'
请特别注意——如果你 fetch
之后在本地的 origin 相关分支上已经看到了别人的提交,依然进行强制推送,你还是会覆盖别人的提交。也就是说,--force-with-lease
解决的是本地仓库不够新时,依然覆盖了远端新仓库的问题,如果你执意想要覆盖远端提交,只需要先 fetch
再推送,它也不会拒绝的。
10.远程仓库迁移了,如何修改本地的远程仓库地址
$ git remote set-url origin [url]
例如: git remote set-url origin github.com/boonook/rea…
参考资料
转载自:https://juejin.cn/post/7188448046374453304