Git 常見面試題--來自靈魂的拷問

一:在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,用來避免丟失信息。這對於以後代碼進行分析特別有用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章