如果我在面试中问到git,你又该如何应对?
本文从实际工作经验出发,叙述了工作中常见的、和git提交代码相关的场景问题,并从此场景中抽象出面试中可能问到的问题,并记录了这些问题的解决办法。
实际场景1
同事小徐说有一个BUG只涉及bug_file.ts
这个文件,但是他改了半天也无能为力,想让你去他电脑旁帮助修改。你看了这个BUG之后灵机一动,有了想法。同时告诉小徐他从一开始就跑偏了,完全不是这样改的。说罢,正当你要大显身手的时候,突然发现:
1. 小徐只是尝试性的修改了一下
你突然发现,小徐自己修改的内容都保存在工作区,没有进入暂存区,也就是没有使用git add bug_file.ts
,这个时候你应该怎样做,才能开始你的表演?
推荐的做法
使用restore命令将小徐修改的内容全部丢弃
git restore bug_file.ts
2. 小徐很自信的被打脸了
你突然发现,小徐自己修改的内容有些保存在工作区,有些进了入暂存区,这个时候你应该怎样做,才能开始你的表演?
推荐的做法
同样是使用restore命令将小徐修改的内容全部丢弃,只不过麻烦一丢丢
css
git restore --stage bug_file.ts
git restore bug_file.ts
第一句git命令的作用是将暂存区的修改回退到工作区,第二句的作用是将工作区的修改丢弃(同1)。
3. 小徐自信过了头
你突然发现,小徐都已经将自己修改的内容提交到了本地仓库,这个时候你应该怎样做,才能开始你的表演?
推荐的做法
首先返回到提交之前的状态,然后再将他的修改丢弃
perl
git reset HEAD~
git restore bug_file.ts
git reset HEAD~的作用有两个,一个是:将HED指针移动到上一次提交(也就是拉取新代码之后的最后一次提交);另一个是:将上次的修改内容放回到工作区。
所以执行第一句之后就又和第一种情况相同了!
4. 小徐即将要挨批
你突然发现,小徐不仅将自己修改的内容提交到了本地仓库,并且还推送到了远程仓库,甚至已经提交了合并pr给小组长,好在小组长开会去了还没有处理这个pr。这个时候你应该怎样做,才能开始你的表演?
首先查看小组长的会还有多久结束
推荐的做法1
如果会议只有5分钟就要结束了,那只能
- 撤销pr
- 删除刚才提交的分支:
git push origin --delete fix/A
推荐的做法2
会议还有50分钟才结束,那就不着急,犯不上删除这个分支,按照如下方式处理即可:
perl
git reset HEAD~
git restore bug_file.ts
# balabala一顿操作
# 在小徐吃惊的表情下将修改之后的代码强推上去
git add bug_file.ts
git commit --amend --no-edit
git push origin HEAD -f
前面的几句同3,后面的git push origin HEAD -f
是将自己正确的修改强推到远程已经提交的pr中去,-f就是--force的意思。
5. 组长也犯了糊涂
你突然发现,小徐已经提交了合并pr给小组长,小组长看都没看就合并了这个pr。这个时候你应该怎样做,才能开始你的表演?
- 首先,纠正小徐的错误
- 然后,再开始自己的debug
css
git checkout main
git pull
git checkout -b revert/fix-A
git revert abc123
git commit -m "fix: revert fix/A"
git push origin HEAD
其中,main是开发主分支,revert/fix-A是用来纠正小徐错误提交的分支,abc123是小徐提交fix/A的哈希值。
做完之后,赶紧喊小组长将revert/fix-A分支merge掉,然后就当作小徐什么也没做一样,重新修改此bug。
实际场景2
经过去年的艰苦奋斗,你们做的产品已经成功的升级到了2代,与此同时开发主分支也被技术经理改成了standalone2023,这个时候你需要在本机修改默认分支为standalone2023,如何做到?
推荐的做法
先切换到这个分支,然后使用branch -m 设置默认分支
git checkout standalone2023
git branch -m standalone2023
实际场景3
你所在的前端组成员中有人使用了一些vscode的插件,而这些插件会在运行期间产生一些配置文件,比如自动产生了.vscode
文件,在某一次提交的时候由于粗心,将自动生成的.vscode
中的内容也提交到了远程仓库中,这个时候该如何处理?如果要你负责这个项目,该如何从一开始就避免这种行为?
推荐的做法
- 如果
.vscode
中的内容已经被推送到了远程仓库,则可以采用如下的做法:
sql
git rm --cached .vscode
echo .vscode >> .gitignore
git add .gitignore
git commit -m "修改了gitignore"
git push origin HEAD
第一句的作用是告诉git目前不要跟踪这个文件了;第二句的作用是告诉git以后也不用跟踪这个文件了;
既然对.gitignore做了修改,就需要将修改同步到远程仓库中去,这就是后面代码的作用。
- 作为项目负责人,在创建项目仓库的时候就应该在.gitignore中将
.vscode
添加进去。
实际场景4
你是一个很酷的人,总是觉得使用git过程有个origin非常的不cool,你如何做才能不让你要执行的命令中不再出现origin?
推荐的做法
首先,origin是远程仓库在本地终端中的别名,如果不喜欢这个单词,可以使用如下的方法将其换成喜欢的单词:
lua
git remote rename origin cool
这样原来使用origin的地方就全部变成了cool. 比如:
git pull cool/main
git push cool HEAD
git remote -v
或者git remote -vv
也会将原来显示的origin换成cool