原文地址:medium.com/edureka/dev…
原文做者:Saurabh Kulshrestha
翻譯君:CODING 戴維奧普斯git
這多是你在面試中遇到的最簡單的問題。個人建議是首先給出版本控制的定義:它是一個記錄文件變化的系統,以便你之後能夠調用特定版本的文件。版本控制系統由一箇中央共享存儲庫組成,隊友能夠在其中提交文件的更改,接下來你能夠提到版本控制的用途。版本控制容許你:面試
版本控制的優勢:算法
這個問題用來測試你的分支經驗,因此告訴他們你在之前的工做中如何使用分支以及它的用途是什麼,你能夠參考如下幾點:bash
最後告訴他們分支策略因組織而異,因此我知道基本的分支操做:如刪除,合併,檢出分支等。服務器
你能夠提到你曾經使用的 VCS 工具:「我使用過 Git,它對比 SVN 等其餘 VCS 工具的一個主要優點在於,它是一個分佈式版本控制系統。」架構
分佈式 VCS 工具不必定依靠中央服務器來存儲項目文件的全部版本。相反,每一個開發人員都「克隆」存儲庫的副本,並在本身的硬盤上擁有項目的完整歷史記錄。分佈式
我建議你經過解釋 Git 的體系結構來解答這個問題,以下圖所示。你能夠參考下面給出的解釋:工具
如下是一些基本的 Git 命令:post
此問題能夠有兩個答案,根據具體狀況可使用如下任意選項:測試
將 N 個提交壓縮到單個提交中有兩種選擇。在你的答案中包括如下兩個選項:
我建議你先給出一個 Git bisect 的小定義——Git bisect 用於經過二進制搜索算法來查找引入 bug 的提交。Git bisect 的命令是:
git bisect <子命令>
接下來須要解釋一下這個命令能夠作什麼,這個命令使用二進制搜索算法來查找項目歷史中哪一個提交引入了一個 bug。首先你須要告訴它一個已知的包含了該 bug 的提交和在一個已知的引入 bug 以前的提交。而後 Git bisect 在這兩個時間點之間選擇一個提交,並詢問你所選的提交是「好」仍是「壞」,以後它繼續縮小範圍,直到找到引入 bug 的確切提交。
你應該首先說 Git rebase 是一個命令,它將另外一個分支合併到當前你正在工做的分支中,並將全部位於另外一分支以前的本地提交,移到該當前工做分支歷史記錄頂部。
接下來你須要經過一個示例定義 Git rebase 時間窗,以顯示如何在合併以前使用它來解決特性分支中的衝突。若是從 master 建立了一個特性分支,那麼 master 已經收到了新的提交,Git rebase 可用於將特性分支移動到 master 分支的頂部。
該命令有效地在 master 的頂部重放特性分支中所作的更改,並容許在該過程當中解決衝突。完成後,特性分支會相對容易地合併到 master 中,有時會被做爲簡單的快進操做。
我建議你先簡要介紹一下合理性檢查。合理性或冒煙測試能夠用來肯定是否進行後續測試的合理性和必要性。
接下來解釋如何實現這一點,這能夠經過與存儲庫的預提交鉤子相關的簡單腳原本完成。即便在你須要輸入提交消息以前,也會在提交以前觸發預提交掛鉤。在此腳本中,能夠運行其它工具,例如 linters,並對提交到存儲庫中的更改執行完整性檢查。
最後給出一個例子,你能夠參考下面的腳本:
#!/bin/sh
files=$(git diff -cached -name-only -diff-filter=ACM | grep '.go$')
if [ -z files ]; then
exit 0
fi
unfmtd=$(gofmt -l $files)
if [ -z unfmtd ]; then
exit 0
fi
echo "Some .go files are not fmt'd"
exit 1
複製代碼
此腳本會檢查即將提交的全部 .go 文件是否經過標準 Go 源碼格式化工具 —— gofmt 的檢驗。當檢查未經過時,經過以非零狀態退出,腳本能有效地阻止該提交應用於存儲庫。
對於這個問題,不該該僅僅只解釋這個命令是什麼,而應該解釋這個命令究竟會作什麼。因此你能夠這麼說,爲了得到在特定提交中更改的文件列表使用命令:
git diff-tree -r {hash}
給定提交哈希值,這個命令將列出在該提交中更改或添加的全部文件。-r 標誌會讓命令列出各個文件,而不是僅將它們摺疊到根目錄名稱中。
你的回答也能夠包含如下內容,雖然它是徹底可選的,但有助於給面試官留下深入的印象: 輸出還將包含一些額外信息,能夠經過如下兩個標誌輕鬆去掉:
git diff-tree -no-commit-id -name-only -r {hash}
這裏 -no-commit-id 將禁止提交哈希值出如今輸出中,而 -name-only 只會打印文件名而不是它們的路徑。
每次存儲庫接收到開發者 push 的新提交時,有三種方法能夠配置腳本運行,須要根據觸發腳本的時間來定義 pre-receive、update、或者 post-receive 腳本。
鉤子是每一個 Git 存儲庫的本地存儲,而且沒有版本化。腳本能夠在「.git」目錄內的 hooks 目錄中建立,也能夠在別處建立,而且能夠在目錄中放置這些腳本的連接。
我建議你提到如下命令: git branch -merged 列出已合併到當前分支的分支。 git branch -no-merged 列出了還沒有合併的分支。