一:在git中,你如何还原已经push并公开的提交?
方式一:删除或修复新提交的错误文件,并将其推送至远程存储库,这是修复错误的最自然方式。
方式二:创建一个新的提交,撤销提交中所做的所有更改
git revert <name of bad commit>
二:git pull 和git fetch 有什么区别?
git pull 命令从中央存储库提取特定分支的新更改或提交,并更新本地存储库中的目标分支。
git fetch 也用于相同的目的,但它的工作方式略有不同。当你执行git fetch 时,他会从所需的分支中提取所有新提交,并将其存储在本地库中的新分支中。如果要在目标分支中反映这些更改,必须要在git fetch 之后执行git merge,记住以下等式 git pull = git fetch + git merge
三:如何找到特定提交中已更改的文件列表?
git diff-tree -r {hash} //-r 标志使命令列出单个文件
四:git config 的功能是什么?
git 使用用户名将提交与身份相关联。git config 命令可用来更改git 配置,包括用户名
例如:git config -global user.name "you name"
git config -global user.email "you email"
五:提交对象包含什么?
commit 对象包含以下组件,你应该提到这三点:
一组文件,给定时间点的项目状态
引用父提交对象
SHAI名称,一个40个字符的字符串,提交对象的唯一标识;
六:怎样将N次提交压缩成一次提交?
方式一:从头开始编写提交信息
git reset -soft HEAD~N
git commit
方式二:串联现有提交信息
git reset -soft HEAD~N
git commit -edit -m "$(git log -format=%B -reverse .HEAD@{N})"
七:什么是git bisect? 如何使用它来确定回归的错误的来源?
git bisect 用于查找使用二进制搜索引入的错误的提交,命令是:
git bisect <subcommand> <options>
此命令用了二进制搜索算法来查找项目历史记录中哪个提交引入了错误,你可以通过告诉它已知的包含该错误的“错误”提交以及在引入错误之前已知的“良好”提交来使用它。然后git bisect 在这两个端点之间选择一个提交,并询问你所选的提交是好是坏。它继续缩小范围,直到找到引入的确切提交。
八:当出现了某次错误的提交,并且已经push到远程服务器,而且此时版本库已经提交过了很多次,这时候应该怎样撤销这次的错误提交。
使用git revert commitID, 当想撤销中间某次提交时,强烈建议使用revert命令,而不是reset。
git reset –hard commit_id 虽然可以回退远程库,但是其要求pull最新代码的每个人的本地分支都要进行版本回退。这样就增加工作量了!
九:描述一下你使用的分支策略
使用GitFlow开发流程,使用以下分支
Master分支:用于存放线上版本代码,可以方便给代码打版本号
Develop 分支:用于整合Feature 分支。
Feature 分支:某个功能的分支,从Develop分支切出,并且功能完成时又合并回Develop 分支。不直接和master 分支交互。
Release分支:通常对应一个迭代。将一个版本的功能全部合并到Develop分支后,从Develop 切出一个Release 分支。这个分支不再追加新的需求,可以完成bug修复,完善文档的作用。务必记住,代码发布后,需要将其合并到Master 分支,同时也要合并到Develop分支。
Hotfix 分支:紧急修复的分支,是唯一可以从master 切出的分支,一旦修复了可以合并到Master 分支和Develop分支上。
十:如果分支已经合并到master,你可以通过什么方式知道
git branch -merged //列出已经合并到当前分支的分支
git branch -no -merged //列出没有合并到当前分支的分支
十一:什么是SubGit?
subgit 是将svn 到git 迁移的工具;
十二:你用过git stash 命令吗?你一般什么情况会使用它?
命令git stash 是吧工作区修改的内容存储在栈区。
以下几种情况会使用到它:
解决冲突文件时,会先git stash ,然后解决冲突;
遇到紧急开发任务但目前的任务不能提交时,会先执行git stash,然后进行紧急任务的开发,然后git stash pop 取出栈区的内容继续开发;
切换分支,当前工作空间内容不能提交的,会先执行git stash 在进行分支切换
十三:能说一下git 系统中的HEAD,工作树,和索引之间的区别吗
HEAD 文件包含当前分支的引用(指针)
工作树是吧当前分支检出到工作空间后形成的目录树,一般的开发工作都会基于工作树进行;
索引index文件是对工作树进行代码修改后,通过add命令更新索引文件;git系统通过索引 index对象生成tree 对象
十四:使用过git cherry-pick ,有什么作用?
概述
git cherry-pick可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick了。
命令git cherry-pick可以把branch A的commit复制到branch B上。
在branch B上进行命令操作:
挑拣单个提交:git cherry-pick commitid
挑拣多个提交:git cherry-pick commitid ... commitid
十五:我们在本地工程常会修改一些文件,这些文件我们不需要被提交,而我们又不想每次执行git status 时都被显示出来,我们应该怎么操作?
首先利用命令 touch .gitignore 新建文件
touch gitignore
然后往文件里添加需要忽略哪些文件夹下的什么类型的文件
十六:git clone 和fork 的区别
git clone 是在将github上的代码克隆到本地
fork是在github上使用fork将别人的远程仓库复制一份到自己的远程仓库上。
十七:解释下Forking 工作流程的优点
Forking 工作流程与其他流行的Git 工作流程有很大的区别。他不是用单个服务器仓库充当中央代码库,而是为每个开发者提供自己的服务端仓库。forking 工作流程最常用于开源项目中。
Forking 工作流程的主要优点是可以汇集提交贡献,又无需每个开发者提交到一个中央仓库中,从而实现干净的的项目历史记录。开发者可以推动push代码到自己的服务端仓库,而只有项目的维护人员才能直接推送push代码到官方仓库中。
当开发者准备帆布本地提交时,他们的提交会推送到自己的公共仓库中,而不是官方仓库。然后他们向主仓库提交请求拉取pull request ,这会告知项目维护成员有可以集成的更新。
十八:如何从git 中删除文件,而不是将其从文件系统中删除?
如果你在git add 过程中误操作,你最终会添加不想要提交的文件,但是 git rm 会将你的文件从暂存区(索引)和文件系统(工作树)中删除。
所以使用 git reset
十九:如果我想修改提交的历史信息,应该用什么命令
如果 修改最近一次提交的历史记录,就可以用git commit -amend命令;vim编辑的方式;
如果修改之前提交的历史记录,就需要按照下面的步骤
1:首先查看前三次的提交历史记录 使用 git log
2:执行命令git rebase -i HEAD~3,会把前3次的提交记录按照倒叙列出来
3:根据提示执行git commit -amend命令,进入vim编辑器并修改提交信息。
4:然后执行git rebase -continue命令
二十:假如你在A分支上修复了一个bug ,并且发现B分支上也有一个一摸一样的bug,如果不用copy代码的方式,你如何将A分支上修复的bug 应用到B?
1:在A分支上通过 git log ,结合bugid找出commitid;
2:切换至B分支
3:使用git cherry-pick commitid 将对bug 的修改批量的移植到B分支上
4:git commit , git push
二十一:说明GIT合并的两种方法以及区别
Git 代码合并有两种方式:git merge 和git rebase
git merge:这种合并方式是将两个分支合并到一起,当前的分支不会被更改,他会比对双方的不同文件缓存下来,生成一个commit ,去push.
git rebase :这种合并方式通常被称为“衍合”,也叫变基,他是提交修改历史,比对双方commit,然后找出不同去缓存,修改commit历史。
二十二:什么操作会产生冲突,该怎么解决?
rebase:重新设置基准,然后应用补丁。
pull :会自动merge
repo sync :会自动rebase
cherry-pick :会应用补丁
没有更新代码就进行提交,覆盖别人的代码。
解决办法:一般就是创建一个新的冲突分支,在手动修改完成后在提交,push
二十三:Git – Fast Forward 和 no fast foward
使用no-ff后,会多生成一个commit 记录,并强制保留develop分支的开发记录(而fast-forward的话则是直接合并,看不出之前Branch的任何记录)
--no-ff 指的是强行关闭fast-forward方式。--no-ff (no fast foward),使得每一次的合并都创建一个新的commit记录,即要求git merge即使在fast forward条件下也要产生一个新的merge commit,用来避免丢失信息。这对于以后代码进行分析特别有用。