GITGIT常见⾯试题
GIT常见⾯试题
1. 列举⼯作中常⽤的⼏个git命令?
新增⽂件的命令:git add file或者git add .
提交⽂件的命令:git commit –m或者git commit –a
查环保手抄报简单又漂亮
看⼯作区状况:git status –s
拉取合并远程分⽀的操作:git fetch/git merge或者git pull
查看提交记录命令:git reflog
2. 提交时发⽣冲突,你能解释冲突是如何产⽣的吗?你是如何解决的?
开发过程中,我们都有⾃⼰的特性分⽀,所以冲突发⽣的并不多,但也碰到过。诸如公共类的公共⽅法,我和别⼈同时修改同⼀个⽂件,他提交后我再提交就会报冲突的错误。
发⽣冲突,在IDE⾥⾯⼀般都是对⽐本地⽂件和远程分⽀的⽂件,然后把远程分⽀上⽂件的内容⼿⼯修改到本地⽂件,然后再提交冲突的⽂件使其保证与远程分⽀的⽂件⼀致,这样才会消除冲突,然后再提交⾃⼰修改的部分。特别要注意下,修改本地冲突⽂件使其与远程仓库的⽂件保持⼀致后,需要提交后才能消除冲突,否则⽆法继续提交。必要时可与同事交流,消除冲突。
发⽣冲突,也可以使⽤命令。
通过git stash命令,把⼯作区的修改提交到栈区,⽬的是保存⼯作区的修改;
通过git pull命令,拉取远程分⽀上的代码并合并到本地分⽀,⽬的是消除冲突;
通过git stash pop命令,把保存在栈区的修改部分合并到最新的⼯作空间中;
3. 如果本次提交误操作,如何撤销?
如果想撤销提交到索引区的⽂件,可以通过git ret HEAD file;如果想撤销提交到本地仓库的⽂件,可以通过git ret –soft HEAD^n 恢复当前分⽀的版本库⾄上⼀次提交的状态,索引区和⼯作空间不变更;可以通过git ret –mixed HEAD^n恢复当前分⽀的版本库和索引区⾄上⼀次提交的状态,⼯作区不变更;可以通过git ret –hard HEAD^n恢复当前分⽀的版本库、索引区和⼯作空间⾄上⼀次提交的状态。
4. 如果我想修改提交的历史信息,应该⽤什么命令?
如果修改最近⼀次提交的历史记录,就可以⽤git commit –amend命令;vim编辑的⽅式;
如果修改之前提交的历史记录,就需要按照下⾯的步骤:
第⼀步:⾸先查看前三次的提交历史记录:
$ git log -3
commit a762fcafecbd92bbde088054644e1b0586589c4b (HEAD -> slave)
Author:18073638<>
Date: Sat Mar 3010:58:442019+0800
four commit
commit eedbc93d58780f63dd47f8388f8217892096e89a
Author:18073638<18073638@cns安徒生被称为什么
>
Date: Thu Mar 2817:19:522019+0800
third commit third commit
commit 05396135eba85140602107e01e5c211d74f6c739
Author:18073638<>
Date: Thu Mar 2816:56:192019+0800
cond commit
注意:这⾥我们想把053961的committer对象信息修改为“cond commit cond commit”.
第⼆步:执⾏命令git reba –i HEAD~3,会把前3次的提交记录按照倒叙列出来;
pick 0539613 cond commit
pick eedbc93 third commit third commit
pick a762fca four commit
# Reba c8d7ad7..a762fca onto c8d7ad7 (3 commands)
#
# Commands:
# p, pick <commit>= u commit
# r, reword <commit>= u commit, but edit the commit message
# e, edit <commit>= u commit, but stop for amending
# s, squash &随身路由器
lt;commit>= u commit, but meld into previous commit
# f, fixup <commit>= like "squash", but discard this commit's log message
# x, exec <command>= run command (the rest of the line) using shell
# b,break= stop here (continue reba later with 'git reba --continue')
# d, drop <commit>= remove commit
# l, label <label>= label current HEAD with a name
# t, ret <label>= ret HEAD to a label
# m, merge [-C <commit>|-c <commit>]<label>[# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline,if no original merge commit was
# . specified). U -c <commit> to reword the commit message.
#
# The lines can be re-ordered; they are executed from top to 肉鸡养殖
bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However,if you remove everything, the reba will be aborted.
#
# Note that empty commits are commented out
这⾥把第⼀⾏的‘pick’修改为‘edit’,然后esc + :wq退出vim编辑器;
$ git reba -i HEAD嘴酸是怎么回事
~3
Stopped cond commit
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git reba --continue
第三步:根据提⽰,执⾏git commit –amend命令,进⼊vim编辑器并修改提交信息。
$ git commit --amend
[detached HEAD 20f e643] cond commit cond commit
Date: Thu Mar 2816:56:192019+0800
1 file changed,1inrtion(+)
第四步:然后执⾏git reba –continue命令
$ git reba --continue
Successfully rebad and updated refs/heads/slave.
查看修改结果
$ git log -3
commit 9024049ef990e79fa61295d5c2b64d70017cf412 (HEAD -> slave)
Author:18073638<>
Date: Sat Mar 3010:58:442019+0800
four commit
commit 79cb4e26dd300591e6352d0488802f43b65c8ba2
Author:18073638<>
Date: Thu Mar 2817:19:522019+0800
third commit third commit
commit 20f e643cbf80cdcc649d732065e8ebf4caf773c7
Author:18073638<>
Date: Thu Mar 2816:56:192019+0800
cond commit cond commit
修改成功。
5. 你使⽤过git stash命令吗?你⼀般什么情况下会使⽤它?
命令git stash是把⼯作区修改的内容存储在栈区。
以下⼏种情况会使⽤到它:
解决冲突⽂件时,会先执⾏git stash,然后解决冲突;
遇到紧急开发任务但⽬前任务不能提交时,会先执⾏git stash,然后进⾏紧急任务的开发,然后通过git stash pop取出栈区的内容继续开发;
切换分⽀时,当前⼯作空间内容不能提交时,会先执⾏git stash再进⾏分⽀切换;
6. 如何查看分⽀提交的历史记录?查看某个⽂件的历史记录呢?
查看分⽀的提交历史记录:
命令git log –number:表⽰查看当前分⽀前number个详细的提交历史记录;
命令git log –number –pretty=oneline:在上个命令的基础上进⾏简化,只显⽰sha-1码和提交信息;
命令git reflog –number: 表⽰查看所有分⽀前number个简化的提交历史记录;
命令git reflog –number –pretty=oneline:显⽰简化的信息历史信息;
如果要查看某⽂件的提交历史记录,直接在上⾯命令后⾯加上⽂件名即可。
注意:如果没有number则显⽰全部提交次数。
7. 能不能说⼀下git fetch和git pull命令之间的区别?
简单来说:git fetch branch是把名为branch的远沟通的技巧和方法
程分⽀拉取到本地;⽽git pull branch是在fetch的基础上,把branch分⽀与当前分⽀进⾏merge;因此pull = fetch + merge。
8. 使⽤过git merge和git reba吗?它们之间有什么区别?
简单的说,git merge和git reba都是合并分⽀的命令。
git merge branch会把branch分⽀的差异内容pull到本地,然后与本地分⽀的内容⼀并形成⼀个committer对象提交到主分⽀上,合并后的分⽀与主分⽀⼀致;
git reba branch会把branch分⽀优先合并到主分⽀,然后把本地分⽀的commit放到主分⽀后⾯,合并后的分⽀就好像从合并后主分⽀⼜拉了⼀个分⽀⼀样,本地分⽀本⾝不会保留提交历史。
9. 能说⼀下git系统中HEAD、⼯作树和索引之间的区别吗?
HEAD⽂件包含当前分⽀的引⽤(指针);
⼯作树是把当前分⽀检出到⼯作空间后形成的⽬录树,⼀般的开发⼯作都会基于⼯作树进⾏;
索引index⽂件是对⼯作树进⾏代码修改后,通过add命令更新索引⽂件;GIT系统通过索引index⽂件⽣成tree对象;
10. 之前项⽬中是使⽤的GitFlow⼯作流程吗?它有什么好处?
GitFlow可以⽤来管理分⽀。GitFlow⼯作流中常⽤的分⽀有下⾯⼏类:
- master分⽀:最为稳定功能⽐较完整的随时可发布的代码,即代码开发完成,经过测试,没有明显的bug,才能合并到 master 中。请注意永远不要在 master 分⽀上直接开发和提交代码,以确保 master 上的代码⼀直可⽤;
- develop分⽀;⽤作平时开发的主分⽀,并⼀直存在,永远是功能最新最全的分⽀,包含所有要发布 到下⼀个 relea 的代码,主要⽤于合并其他分⽀,⽐如 feature 分⽀; 如果修改代码,新建 feature 分⽀修改完再合并到 develop 分⽀。所有的 feature、relea 分⽀都是从 develop 分⽀上拉的。
- feature分⽀;这个分⽀主要是⽤来开发新的功能,⼀旦开发完成,通过测试没问题(这个测试,测试新功能没问题),我们合并回develop 分⽀进⼊下⼀个 relea
- relea分⽀;⽤于发布准备的专门分⽀。当开发进⾏到⼀定程度,或者说快到了既定的发布⽇,可以发布时,建⽴⼀个 relea 分⽀并指定版本号(可以在 finish 的时候添加)。开发⼈员可以对 relea 分⽀上的代码进⾏集中测试和修改bug。(这个测试,测试新功能与已有的功能是否有冲突,兼容性)全部完成经过测试没有问题后,将 relea 分⽀上的代码合并到 master 分⽀和 develop 分⽀
- hotfix分⽀;⽤于修复线上代码的bug。**从 master 分⽀上拉。**完成 hotfix 后,打上 tag 我们合并回 master 和 develop 分⽀。GitFlow主要⼯作流程
- 1.初始化项⽬为gitflow , 默认创建master分⽀ , 然后从master拉取第⼀个develop分⽀
- 2.从develop拉取feature分⽀进⾏编码开发(多个开发⼈员拉取多个feature同时进⾏并⾏开发 , 互不影响)
- 3.feature分⽀完成后 , 合运动手抄报简单又漂亮
并到develop(不推送 , feature功能完成还未提测 , 推送后会影响其他功能分⽀的开发);合并feature到develop , 可以选择删除当前feature , 也可以不删除。但当前feature就不可更改了,必须从relea分⽀继续编码修改
4.从develop拉取relea分⽀进⾏提测 , 提测过程中在relea分⽀上修改BUG
relea不可修改。线上有问题也必须从master拉取hotfix分⽀进⾏修改;
6.上线之后若发现线上BUG , 从master拉取hotfix进⾏BUG修改;
7.hotfix通过测试上线后,合并hotfix分⽀到develop/master并推送;合并之后,可选删除当前hotfix ,若不删除,则当前hotfix不
可修改,若补丁未修复,需要从master拉取新的hotfix继续修改;
8.当进⾏⼀个feature时 , 若develop分⽀有变动 , 如其他开发⼈员完成功能并上线 , 则需要将完成的功能合并到⾃⼰分⽀上,即合并
develop到当前feature分⽀;
9.当进⾏⼀个relea分⽀时 , 若develop分⽀有变动 , 如其他开发⼈员完成功能并上线 , 则需要将完成的功能合并到⾃⼰分⽀上,即合
并develop到当前relea分⽀ (!!! 因为当前relea分⽀通过测试后会发布到线上 , 如果不合并最新的develop分⽀ , 就会发⽣丢代码的情况);
GitFlow的好处
为不同的分⽀分配⼀个明确的⾓⾊,并定义分⽀之间如何交互以及什么时间交互;可以帮助⼤型项⽬理清分⽀之间的关系,简化分⽀的复杂度。
11. 使⽤过git cherry-pick,有什么作⽤?
命令git cherry-pick可以把branch A的commit复制到branch B上。
在br徐树铮简介
anch B上进⾏命令操作:
复制单个提交:git cherry-pick commitId
复制多个提交:git cherry-pick commitId1…commitId3
注意:复制多个提交的命令不包含commitId1.
12. git跟其他版本控制器有啥区别?
GIT是分布式版本控制系统,其他类似于SVN是集中式版本控制系统。
分布式区别于集中式在于:每个节点的地位都是平等,拥有⾃⼰的版本库,在没有⽹络的情况下,对⼯作空间内代码的修改可以提交到本地仓库,此时的本地仓库相当于集中式的远程仓库,可以基于本地仓库进⾏提交、撤销等常规操作,从⽽⽅便⽇常开发。
13. 我们在本地⼯程常会修改⼀些配置⽂件,这些⽂件不需要被提交,⽽我们⼜不想每次执⾏git status时都让这些⽂件显⽰出来,我们该如何操作?
⾸先利⽤命令touch .gitignore新建⽂件
$ touch .gitignore
然后往⽂件中添加需要忽略哪些⽂件夹下的什么类型的⽂件
$ vim .gitignore
$ cat .gitignore
/target/class
.
ttings
.imp
*.ini
注意:忽略/target/class⽂件夹下所有后缀名为.ttings,.imp的⽂件,忽略所有后缀名为.ini的⽂件。
14. 如何把本地仓库的内容推向⼀个空的远程仓库?
⾸先确保本地仓库与远程之间是连同的。如果提交失败,则需要进⾏下⾯的命令进⾏连通:
git remote add origin XXXX
注意:XXXX是你的远程仓库地址。
如果是第⼀次推送,则进⾏下⾯命令:
git push -u origin master
注意:-u 是指定origin为默维护客户
认主分⽀
之后的提交,只需要下⾯的命令:
git push origin master