2023年11月29日发(作者:)

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 reset HEAD file;如果想撤销提交到本地仓库的⽂件,可以通过git reset –soft HEAD^n

恢复当前分⽀的版本库⾄上⼀次提交的状态,索引区和⼯作空间不变更;可以通过git reset –mixed HEAD^n恢复当前分⽀的版本库和索

引区⾄上⼀次提交的状态,⼯作区不变更;可以通过git reset –hard HEAD^n恢复当前分⽀的版本库、索引区和⼯作空间⾄上⼀次提交的

状态。

4. 如果我想修改提交的历史信息,应该⽤什么命令?

如果修改最近⼀次提交的历史记录,就可以⽤git commit –amend命令;vim编辑的⽅式;

如果修改之前提交的历史记录,就需要按照下⾯的步骤:

第⼀步:⾸先查看前三次的提交历史记录:

$ git log -3

commit a762fcafecbd92bbde088054644e1b0586589c4b (HEAD -> slave)

Author: 18073638 <18073638@cnsuning.com>

Date: Sat Mar 30 10:58:44 2019 +0800

four commit

commit eedbc93d58780f63dd47f8388f8217892096e89a

Author: 18073638 <18073638@cnsuning.com>

Date: Thu Mar 28 17:19:52 2019 +0800

third commit third commit

commit 05396135eba85140602107e01e5c211d74f6c739

Author: 18073638 <18073638@cnsuning.com>

Date: Thu Mar 28 16:56:19 2019 +0800

second commit

注意:这⾥我们想把053961的committer对象信息修改为“second commit second commit”.

第⼆步:执⾏命令git rebase –i HEAD~3,会把前3次的提交记录按照倒叙列出来;

pick 0539613 second commit

pick eedbc93 third commit third commit

pick a762fca four commit

# Rebase c8d7ad7..a762fca onto c8d7ad7 (3 commands)

#

# Commands:

# p, pick <commit> = use commit

# r, reword <commit> = use commit, but edit the commit message

# e, edit <commit> = use commit, but stop for amending

# s, squash <commit> = use 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 rebase later with 'git rebase --continue')

# d, drop <commit> = remove commit

# l, label <label> = label current HEAD with a name

# t, reset <label> = reset 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). Use -c <commit> to reword the commit message.

#

# These 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 rebase will be aborted.

#

# Note that empty commits are commented out

这⾥把第⼀⾏的‘pick’修改为‘edit’,然后esc + :wq退出vim编辑器;

$ git rebase -i HEAD~3

Stopped at 0539613... second commit

You can amend the commit now, with

git commit --amend

Once you are satisfied with your changes, run

git rebase --continue

第三步:根据提⽰,执⾏git commit –amend命令,进⼊vim编辑器并修改提交信息。

$ git commit --amend

[detached HEAD 20fe643] second commit second commit

Date: Thu Mar 28 16:56:19 2019 +0800

1 file changed, 1 insertion(+)

第四步:然后执⾏git rebase –continue命令

$ git rebase --continue

Successfully rebased and updated refs/heads/slave.

查看修改结果

$ git log -3

commit 9024049ef990e79fa61295d5c2b64d70017cf412 (HEAD -> slave)

Author: 18073638 <18073638@cnsuning.com>

Date: Sat Mar 30 10:58:44 2019 +0800

four commit

commit 79cb4e26dd300591e6352d0488802f43b65c8ba2

Author: 18073638 <18073638@cnsuning.com>

Date: Thu Mar 28 17:19:52 2019 +0800

third commit third commit

commit 20fe643cbf80cdcc649d732065e8ebf4caf773c7

Author: 18073638 <18073638@cnsuning.com>

Date: Thu Mar 28 16:56:19 2019 +0800

second commit second 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 fetchgit pull命令之间的区别?

简单来说:git fetch branch是把名为branch的远程分⽀拉取到本地;⽽git pull branch是在fetch的基础上,把branch分⽀与当前分⽀

进⾏merge;因此pull = fetch + merge。

8. 使⽤过git mergegit rebase吗?它们之间有什么区别?

简单的说,git merge和git rebase都是合并分⽀的命令。

git merge branch会把branch分⽀的差异内容pull到本地,然后与本地分⽀的内容⼀并形成⼀个committer对象提交到主分⽀上,合并后

的分⽀与主分⽀⼀致;

git rebase branch会把branch分⽀优先合并到主分⽀,然后把本地分⽀的commit放到主分⽀后⾯,合并后的分⽀就好像从合并后主分⽀

⼜拉了⼀个分⽀⼀样,本地分⽀本⾝不会保留提交历史。

9. 能说⼀下git系统中HEAD、⼯作树和索引之间的区别吗?

HEAD⽂件包含当前分⽀的引⽤(指针);

⼯作树是把当前分⽀检出到⼯作空间后形成的⽬录树,⼀般的开发⼯作都会基于⼯作树进⾏;

索引index⽂件是对⼯作树进⾏代码修改后,通过add命令更新索引⽂件;GIT系统通过索引index⽂件⽣成tree对象;

10. 之前项⽬中是使⽤的GitFlow⼯作流程吗?它有什么好处?

GitFlow可以⽤来管理分⽀。GitFlow⼯作流中常⽤的分⽀有下⾯⼏类:

- master分⽀:最为稳定功能⽐较完整的随时可发布的代码,即代码开发完成,经过测试,没有明显的bug,才能合并到 master 中。请注

意永远不要在 master 分⽀上直接开发和提交代码,以确保 master 上的代码⼀直可⽤;

- develop分⽀;⽤作平时开发的主分⽀,并⼀直存在,永远是功能最新最全的分⽀,包含所有要发布 到下⼀个 release 的代码,主要⽤于

合并其他分⽀,⽐如 feature 分⽀; 如果修改代码,新建 feature 分⽀修改完再合并到 develop 分⽀。所有的 feature、release 分⽀都

是从 develop 分⽀上拉的。

- feature分⽀;这个分⽀主要是⽤来开发新的功能,⼀旦开发完成,通过测试没问题(这个测试,测试新功能没问题),我们合并回

develop 分⽀进⼊下⼀个 release

- release分⽀;⽤于发布准备的专门分⽀。当开发进⾏到⼀定程度,或者说快到了既定的发布⽇,可以发布时,建⽴⼀个 release 分⽀并

指定版本号(可以在 finish 的时候添加)。开发⼈员可以对 release 分⽀上的代码进⾏集中测试和修改bug。(这个测试,测试新功能与已有

的功能是否有冲突,兼容性)全部完成经过测试没有问题后,将 release 分⽀上的代码合并到 master 分⽀和 develop 分⽀

然后往⽂件中添加需要忽略哪些⽂件夹下的什么类型的⽂件

$ vim .gitignore

$ cat .gitignore

/target/class

.settings

.imp

*.ini

注意:忽略/target/class⽂件夹下所有后缀名为.settings,.imp的⽂件,忽略所有后缀名为.ini的⽂件。

14. 如何把本地仓库的内容推向⼀个空的远程仓库?

⾸先确保本地仓库与远程之间是连同的。如果提交失败,则需要进⾏下⾯的命令进⾏连通:

git remote add origin XXXX

注意:XXXX是你的远程仓库地址。

如果是第⼀次推送,则进⾏下⾯命令: