git 常见问题 10 问

2,750

1.如何准备 git 环境?

step1. 安装git

进入 git bash 官网下载 页面并按照提示安装 image.png

  • windows 下载安装包后按照提示安装即可
  • mac 可以使用 HomeBrew 安装 git
$ brew install git

step2. 打开 CMD 或 Git Bash,配置个人的用户名称和电子邮件地址

配置用户信息

$ git config --global user.name "你的用户名"
$ git config --global user.email "你的邮箱"

image.png

查询用户信息

  • 查询特定配置
$ git config --global user.name 
$ git config --global user.email

image.png

  • 查询所有用户配置
$ git config -l

image.png

删除全局配置

$ git config --global --unset user.xxx

image.png

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仓库地址

image.png

4.如何从本地已有分支创建分支?

# 查看本地有哪些分支
$ git branch

# 切换到指定分支
$ git checkout branchName

# 创建分支
$ git checkout -b newBranchName

image.png

5.如何拉取远程分支并创建本地分支?

# 从远程获取代码库
$ git fetch

# 预览本地存储库中的所有分支
$ git branch -r

# 基于特定远程分支创建分支
$ git checkout -b test origin/test

image.png

image.png

6.如何回退版本至某次提交?

step1. 找到这次提交的 commit id,可以使用 git log 命令,根据自己的提交日志及时间查找 id

image.png

或者使用 git log --oneline 使 git log 信息显示更简洁

image.png

step2. 使用 git reset 命令将本地分支强制重置为 id 时的状态,如下

$ git reset --hard commit-id

注:commit-id 是 git log 中找到的 id。

image.png

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

image.png

step2. 使用 git rebase -i 选择要合并的 commit,比如要合并 5 个提交,则使用

$ git rebase -i HEAD~5

image.png 要合并的 5 次提交 image.png 这里只关注 picksquashfixup 这三个命令:

  • pick:使用此提交不做操作
  • squash:将指定的提交合并到上边的pick请求中,保留提交信息(如果需要修改注释,则使用此方法)
  • fixup:与 squash 类似,但不保留提交信息(如果不需要修改注释,则使用此方法)

step3. 编辑要合并的版本信息,保存提交,多条合并会出现多次(可能会出现冲突)

  • 使用 fixup 合并 image.png 或者使用简写 image.png 然后:wq保存退出后是注释界面,合并完成 image.png

  • 使用 squash 合并 image.png 然后 :wq 保存退出后是注释界面,因为保留了所有 commit 的提交信息,会进入注释修改页面 image.png 根据需要修改注释信息即可 image.png

step4. 修改注释信息后,保存提交,多条合并会出现多次 image.png 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…

参考资料

我在工作中是如何使用 git 的

Git 缓存分支